【猿人学】第六题 Js混淆 回溯 逆向分析

难点

代码混淆 相比 第五题 简单一点

Tip:例子:https://pan.bigdataboy.cn/s/3KXFv

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

mark

分析参数

有一个 m加密值,q 有点组合

mark

调用栈,进入看看怎么生成的,很简单的逻辑

// 简单分析一下
t = Date.parse(new Date());
var list = {
    "page": window.page,
    "m": r(t, window.o),
    "q": window.i += window.o + '-' + t + "|",
};
window.o += 1;

't':每次请求重新生成
'window.i += window.o' --> 'window.i = window.i + window.o'
'window.o' 每次请求一次加一次

mark

进入 r() 函数,来到一个单独的 Js 文件,一眼就能分析出,最重要的加密函数是 z() 函数,window.o 不能大于 6

mark

分析代码

把这个单独的 Js 复制下来在本地看看结构

mark

最上面这种混淆,直接去掉 最后的 ('_') 然后控制台就可以打印出源代码了

mark

直接运行,提示缺少 window,我们直接补上,这里有个坑需要注意,在浏览器里window不能重新赋值

mark

搜索 Message too long for RSA,是此处提示错误,打上断点

mark

运行此处,发现堆栈很短,看来并不是加密过程中有什么值有问题,这时可能思路就断了

mark

这时可以折叠代码,看一下整个代码的执行流程,很容易发现此处异常,正常是 false,本地总会缺少一点东西,能补的可以补上,那就直接改成 false

mark

再次执行,得出结果,对比浏览器的加密结果一样

mark

然后出现 {'0.0': '风控不通过,别匆忙,放慢速度'},只有第一页有数据

mark

出现这情况是它代码里有个全局变量,每次加密都会增加,该值与页面之间有关系不对应出现风控,如果用 execjs 执行就不行,execjs 每次执行都是重新执行Js,不会累加

// 测试 js 代码
window = global

window.o = 1

function xx() {
    return window.o++;
}

module.exports = { // node_vm2 需要导出
    xx
}

使用 execjs

mark

使用 node_vm2,会延续上下文

mark

使用 node_vm2 执行,正常获得值

mark

验证

mark

发表评论 / Comment

用心评论~