猿人学内部练习平台1~3题

第1题. 无混淆js加密

抓包可以看到,有一个请求头参数 safe 加密。
根据调用堆栈很容易找到加密参数位置:


可以看到,safe 是由固定字符串 a = '9622' 加 时间戳,经base64编码后,传入 hex_md5 方法得到。
进入 hex_md5 ,直接复制 md5.js 到本地,调用 hex_md5 方法即可。(报window未定义,把那行及下方fetch行删掉即可)

// md5.js 的内容
var a = '9622';
var timestamp = String(Date.parse(new Date()) / 1000);
var tokens = hex_md5(global.btoa(a + timestamp));
console.log(tokens)

第2题. 简易动态js加密解析

首先删除cookie中的sign:

然后注入hook_cookie代码,此处我选择的是 v_jstools 插件。(项目地址:https://github.com/cilame/v_jstools)

刷新页面,可以看到,成功断到了生成点,查看调用堆栈即可找到对应位置:


通过控制台打印,可以看到,生成cookie的代码及结果格式如下:

此时可以右键该js文件,选择“替换内容”,然后将文件中的var c = new Date()_$ob('0x2a'); 改为 var c = 1587102734000;

删除cookies中的sign,刷新页面,即可得到1587102734000下的sign值:

第3题. js第六节实战例题

本题主要考察cookie中的m生成。
根据上一题思路hook_cookie,发现hook不到m,这时可以通过如下选择,让其在每一个js文件都断住:

经一步步断点调试发现,3文件是生成m参数的文件,将其代码复制到本地并运行,发现会卡住,此时可使用本地浏览器环境调试该js代码:
命令行执行 node --inspect-brk xx.js

然后在浏览器控制台左上角会有个绿色的nodejs的图标,点击即可打开调试:

打开调试后逐步调试,看是哪行代码卡住的:
第一个卡住的地方是:

var j = g['updateCookie']();
if (!j) {
            g['setCookie'](['*'], 'counter', 0x1);
        } else if (j) {
            i = g['getCookie'](null, 'counter');
        }

本地环境代码 j 为false,执行了g['setCookie'](['*'], 'counter', 0x1); 而题目里的代码 j 为true,执行了 i = g'getCookie';
因此本地代码修改为 var j = true; 继续本地运行代码,发现还是会卡住,命令行关掉调式模式并重启(node --inspect-brk xx.js),继续单步调试,排查卡住的代码并对比浏览器环境;
如此循环往复;
最后一个卡住的代码位置在 return !a9['\x74\x65\x73' + '\x74'](a2);,该行代码利用正则表达式的查询特性故意写了一个查询效率很低的正则导致卡住,重写对应的方法即可:

RegExp.prototype.test = function(str) {
    // console.log('Hooked!');
    return true;
};

排除掉所有导致代码卡顿的点后,再次运行,代码即正常报错,简单补环境即可:

location那行报错由于是刷新页面,因此可以直接把那行代码删掉,另外也存在console.log的重写需要处理,最终的补环境代码如下:

RegExp.prototype.test = function(str) {
    // console.log('Hooked!');
    return true;
};
document = {}
navigator = {}
h_log = console.log
// 3 文件的js代码(排除检测代码后的)
h_log(document.cookie)

输出格式如下:

然后就可以通过python正则处理后调用。

posted @ 2024-04-26 01:08  脱下长日的假面  阅读(12)  评论(0编辑  收藏  举报