【猿人学】第九题 js 混淆 - 动态cookie 2

难点

使用 SoJsonV5 加密混淆代码,各种反调,还有各种坑

Tip:例子:https://pan.bigdataboy.cn/s/aZOsL

猿人学该题官网:https://match.yuanrenxue.com/match/9

mark

分析流程

题目已经说了是 cookie 了,那就跳过看值的步骤

清空缓存,一打开控制台,就被断住,并且下一步一直在循环带,但是一直放行,就能正常加载,说明不是 检测控制台调试,但是一格式化,重新加载,再放行就不行了,说明检测了代码格式化

mark

反调试

sojson 混淆后的代码,很 恶心,各种混淆,反调,阻止你调试代码

sojson 检测代码格式,使用了 正则匹配 toString() 方式,所以我们在所有的 正则表达式出,打上断点,然后使用本地替换的方式来进行慢慢调试

mark

修改方式有两种,一种是 修改检测代码块的位置,另一种是 取反正则匹配的结果,看那种结果能正常执行

mark

然后保存,执行,下一步,正常执行,说明这个反调就过了

mark

当所有的正则都 按照正常的流程执行后,会在这里一直 debugger,但是为什么网站加载又不会被 debugger,因为 debugger 只有当控制台打开时才会生效,直接把这两个 debugger 注释,然后再执行,发现来到另一个 js 文件,说明 udc 的反调就过掉了,并且 debugger 还在 VM 里面

mark

向上找栈,看看有什么信息

mark

然后设置一律不在此暂停

mark

继续执行,有时候能正常进入,有时候提示 cookie 失效,但至少说明已经可以执行了

mark

Hook

现在反调已经过了,启用 Hook Cookie 大法,定位生成点,这就定位到生成点了

mark

分析加密逻辑

// 源代码
for (var m = 0x1; f[$b('\x30\x78\x31\x34\x31', '\x72\x64\x71\x5d') + '\x68\x42'](m, 5); m++) {
                res = f[$b('\x30\x78\x65\x38', '\x4c\x44\x70\x29') + '\x79\x67'](f[$b('\x30\x78\x61\x36', '\x4f\x58\x71\x66') + '\x68\x43'](decrypt, '1650879458'), '\x72');
            }
document[$b('\x30\x78\x35\x35', '\x32\x6d\x25\x21') + $b('\x30\x78\x32\x39', '\x31\x48\x56\x25')] = f[$b('\x30\x78\x37\x31', '\x30\x46\x35\x73') + '\x79\x67'](f[$b('\x30\x78\x31\x61', '\x56\x39\x5b\x42') + '\x79\x67'](f[$b('\x30\x78\x35\x32', '\x6f\x41\x29\x28') + '\x7a\x58']('\x6d\x3d', f[$b('\x30\x78\x31\x65', '\x54\x5e\x64\x6a') + '\x43\x77'](m, 0x1)[$b('\x30\x78\x63\x38', '\x30\x46\x35\x73') + $b('\x30\x78\x61\x34', '\x6b\x46\x52\x77') + '\x6e\x67']()), res), f[$b('\x30\x78\x31\x37\x63', '\x4f\x58\x71\x66') + '\x4c\x42']);

// 手动解混淆一下,就很清晰了,使用的 第五次加密的结果,但是这里有个小疑问,难道每次加密的值一样???这就需要注意,如果不成功这些地方就需要注意
for (var m = 1; m<=5; m++) {
    res = decrypt('1650879458') + 'r';
}
document['cookie'] = 'm='+ (m - 1)[ 'toString']() + res + '; path=/';

代码整理

然后把之前改写的 udc.js 放到 Node 去跑,然后补充缺少的环境,选择用 const 补环境,有个就是当代码里有 重定义 window 之类的能报错,然后去删除,然后把 定时器干掉,没有报错

mark

测试加密,然后呢 console.log 不来??? 原来是 console.log 被置空了

mark

整理流程

1. 访问 https://match.yuanrenxue.com/match/9 获取 sessionid 和 时间戳,每次都写死在 Js 文件里的,需要重新请求
2. 然后传入时间错,获得加密的 m
3. 带上 m 和 seesion 请求数据

测试

mark

发表评论 / Comment

用心评论~