猿人学 — 第1届第1题(解题思路附源码)
-
F12进入开发者工具—> 发现停止在debugger处 —> 右键点击Never pause here后下一步

-
翻页,抓包后发现请求携带page和m两个参数,page应该就是页数,m则需要逆向

-
依次查找文件,寻找m在哪里被赋值,随后在VM14235:6中发现混淆代码比较可疑
-
进入文件,给request函数中的赋值语句给上断点,重新请求
-
发现
'\x6d'='m',而_0x5d83a3['\x6d']的值则与Payload中m的值神似 -
继续调试,让请求过去,验证,发现Payload中m确实与此处的值对应

-
-
手动翻译一下代码
var _0x2268f9 = Date['parse'](new Date()) + 100000000 var _0x57feae = ooΘ0Θ(_0x2268f9['toString'()])+window['f']; const _0x5d83a3 = { }; _0x5d83a3['page'] = window['page'] _0x5d83a3['m'] = _0x57feaa + '丨'+ _0x2268f9 / 1000; -
逆向m,则必须知道
_0x57feaa和_0x2268f9,而_0x2268f9很明显是一个时间戳,因此主要解决_0x57feaa-
多次请求后发现
ooΘ0Θ(_0x2268f9['toString'()])返回一个空字符串,因此主要关注window['f'] -
通过Console面板定义Hook,定位
window['f']在哪里被赋值Object.defineProperty(window, 'f', { set: function(val) { console.log('f的值:', val); debugger return val; } } )
-
再次请求,停止后,向上寻找调用栈,发现是一个hex_md5函数的返回值,而这个函数的形参则是之前的
_0x2268f9,即时间戳,不过注意类型是字符串(我开始没有注意,导致得到的m一直是一个错误的固定值)
-
-
最后就是去扣hex_md5函数及其运行依赖放到node中执行(当然也可以将整个js文件copy下来),源码如下
window = global var hexcase = 0; var chrsz = 16; function hex_md5(a) { return binl2hex(core_md5(str2binl(a), a.length * chrsz)) } function core_md5(p, k) { p[k >> 5] |= 128 << ((k) % 32); p[(((k + 64) >>> 9) << 4) + 14] = k; var o = 1732584193; var n = -271733879; var m = -1732584194; var l = 271733878; for (var g = 0; g < p.length; g += 16) { var j = o; var h = n; var f = m; var e = l; o = md5_ff(o, n, m, l, p[g + 0], 7, -680976936); l = md5_ff(l, o, n, m, p[g + 1], 12, -389564586); m = md5_ff(m, l, o, n, p[g + 2], 17, 606105819); n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330); o = md5_ff(o, n, m, l, p[g + 4], 7, -176418897); l = md5_ff(l, o, n, m, p[g + 5], 12, 1200080426); m = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341); n = md5_ff(n, m, l, o, p[g + 7], 22, -45705983); o = md5_ff(o, n, m, l, p[g +

最低0.47元/天 解锁文章
7495

被折叠的 条评论
为什么被折叠?



