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