猿人学— 第一届第1题(解题思路附源码)

猿人学 — 第1届第1题(解题思路附源码)

  • F12进入开发者工具—> 发现停止在debugger处 —> 右键点击Never pause here后下一步
    在这里插入图片描述

  • 翻页,抓包后发现请求携带pagem两个参数,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 + 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值