当前位置: 首页 > news >正文

Hook javascipt 获取的时间 -- xyctf 2025 ez_puzzle wp

本文章附带TP(Thinking Process)!

题目提供了提示:需要我在两秒内完成拼图

  • [v] 我需要检查js逻辑

js中存在混淆与反调试

  • 尝试反混淆
  • [v] 尝试绕过反调试

既然无法反混淆,但是反调试可绕过,是否有方法在运行时调试,并干扰js对拼图完成时间时间的判断?

  • 题目代码经过高度混淆,已经无法辨识,我现在需要找到是否有方式能在控制台当中分析函数逻辑

代码过于混乱,已经无法识别逻辑,但是所有逻辑均在本地完成,没有任何网络通信

  • [v] 或者,我是否能使用某种方式控制js获取到的时间?例如直接修改操作系统时间?
  • [v] 我现在需要了解js获取时间的大部分方式,并编写代码
// 劫持时间起点(记录页面加载时间)
const baseTime = Date.now();

// 覆盖所有时间获取方式
(function() {
  // 劫持 Date 对象
  const OriginalDate = Date;
  Date = function() {
    if (new.target) { // 当被 new 调用时(如 new Date())
      return new OriginalDate(baseTime + 1000); // 返回固定时间
    }
    return OriginalDate.apply(this, arguments);
  };
  Date.now = () => baseTime + 1000; // 固定为开始时间+1秒
  Date.parse = OriginalDate.parse;
  Date.UTC = OriginalDate.UTC;

  // 劫持 performance.now()
  const originalPerfNow = performance.now;
  performance.now = () => 1000; // 固定返回1秒

  // 劫持 setTimeout/setInterval 的延迟计算
  const originalSetTimeout = window.setTimeout;
  window.setTimeout = function(callback, delay, ...args) {
    return originalSetTimeout(callback, 0, ...args); // 强制所有定时器立即触发
  };

  const originalSetInterval = window.setInterval;
  window.setInterval = function(callback, delay, ...args) {
    return originalSetInterval(callback, 0, ...args); // 强制所有间隔为0
  };
})();
  • [v] 我该如何在js执行前就执行这段代码?有什么浏览器插件能做到吗

编写油猴脚本

// ==UserScript==
// @name         New Userscript
// @namespace    http://tampermonkey.net/
// @version      2025-04-05
// @description  try to take over the world!
// @author       You
// @match        http://eci-2ze2r3f9jd169rxoou1d.cloudeci1.ichunqiu.com/
// @icon         https://www.google.com/s2/favicons?sz=64&domain=ichunqiu.com
// @grant        none
// ==/UserScript==

(function() {
  'use strict';
  // 劫持时间起点
  const baseTime = Date.now();

  // 覆盖所有时间API
  const OriginalDate = Date;
  window.Date = function() {
    if (new.target) {
      return new OriginalDate(baseTime + 1000);
    }
    return OriginalDate.apply(this, arguments);
  };
  Date.now = () => baseTime + 1000;
  Date.parse = OriginalDate.parse;
  Date.UTC = OriginalDate.UTC;

  performance.now = () => 1000;

  window.setTimeout = (callback, delay, ...args) => {
    return window.setTimeout(callback, 0, ...args);
  };
  window.setInterval = (callback, delay, ...args) => {
    return window.setInterval(callback, 0, ...args);
  };
})();
console.log("Date.now() ->", Date.now());      // 应返回固定值
console.log("new Date() ->", new Date());     // 显示固定时间
console.log("performance.now() ->", performance.now()); // 显示1000

我现在成功hook了时间,再次尝试拼图,成功获得flag

http://www.dtcms.com/a/117250.html

相关文章:

  • Vue3 Composition API 深度开发指南
  • ECharts配置优化
  • 信息学奥赛一本通 1861:【10NOIP提高组】关押罪犯 | 洛谷 P1525 [NOIP 2010 提高组] 关押罪犯
  • 软考系统架构设计师之大数据与人工智能笔记
  • [ctfshow web入门] web17
  • 力扣HOT100之链表:19. 删除链表的倒数第 N 个结点
  • 【MySQL 数据库】数据表的操作
  • 永磁同步电机无速度算法--基于HOPLL的滑模观测器
  • Python设计模式:组合模式
  • JavaScript基础--22-call、apply 和 bind
  • PPP实验笔记
  • C#语言的饼图
  • java.io快读快写StreamTokenizer、PrintWriter
  • 低级错误 System.setProperty 值为空时引发空指针
  • ubuntu,react的学习(1)
  • PandaAI:一个基于AI的对话式数据分析工具
  • 2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
  • C++: 类型转换
  • 构建k8s下Helm私有仓库与自定义Chart开发指南
  • Workbench运动副与dyna对应关系(一)
  • Linux 实验
  • SQL并行产生进程数量问题
  • 使用sass 实现px转vh或vw,适配适老化时,在设计图字体大小的基础上,增加3px(可配置),
  • VUE通过ref来获取dom元素及其他属性
  • 【免费】2005-2019年各地级市绿色专利申请量数据
  • Johnson
  • STM32F103C8T6单片机的起始点:使用GPIO输出点亮我们的第一个小灯(标准库篇)
  • 【Vue】b站黑马视频学习笔记(导览)
  • 彻底解决VS2008编译错误:fatal error C1083 无法打开包括文件“stdint.h“
  • LabVIEW 油井动液面在线监测系统​