猿人学js逆向比赛第一届第六题
分析请求
请求中有m和q是密文,看一下堆栈,定位到这里。注意到这里window.i
是+=所以这里要动态传入。
q函数是简单的字符串拼接,m是r函数然后传入了时间戳和o那下断点调试一下
可以看到这里实际是调用的z函数。这里看一new的n是什么,可以在这里看到这是一个rsa
加密
同时还定位到了encode函数。然后可以尝试扣代码了,因为rsa
为非对称算法,所以现当作标准的如果不对,在返回来扣取这部分。下面是改写的js代码:
encode = function(t, e) {var i = e ? e + "|" + t : t;return encodeURIComponent(RSA_Public_Encrypt(i))
}
function main(i,o){let t = Date.parse(new Date());;let list = {"m": encode(t, o),"q": i+o + '-' + t + "|",};return list;
}
编写python代码尝试调用main函数请求,得到下面的结果:
这里回到刚才的浏览器中,抠取代码。
扣取代码
将浏览器代码复制到本地时,发现这堆东西,顺手还原一下:
然后就在下面看到了navigator,window被赋值为空,这里直接设置window为global,删掉navigator,在全局搜索一下navigator,window,看一下有哪里调用检测的。然后手动将他们参照浏览器修改,同时这里发现一段jsfuck混淆的代码,扔然复制到浏览器,然后修改对应的值;
再次运行就出值了,然后使用py调用尝试一下。发现只能获取第一页的数据。比较一下有什么区别。
这里推测是i的问题,因为第一次i是空,那么每次都传空试一下。
注释掉这行+=的代码,发现就可以正常得到数据了,但很明显这里和浏览器是对不上的,是一个风控点,这里就不再向下推测了。