猿人学攻防赛之第六题:JS混淆 回溯

前...算了,直接来看网站吧

抓包,加密参数依旧是m,

m每次都会变化

全局搜索m也没有找到什么有用的。

通过Initor找到这里:

t国际惯例时间戳..

window.o是一个3

进到r方法,这里应该是记录鼠标点击的次数了,如果超过6就重置页面

所以真正调用加密的地方是在这里:

所以加密代码也就是上面的这么多东西了。

首先是一段表情加密:

正式名为aaencode加密,原理不难,我们可以用还原工具还原一下:

解密后就这么两行:

替换回去,再把window定义一下(PS:这里不想踩坑的话就不要把window定义为this..,不信就试试):

然后我们发现他下面想把我们定义的window强行转成空,这行果断要注掉。

直接调用看看:

运行,意料之中的报错:

但是同样的代码放到浏览器里却可以运行,只能怀疑是环境出了问题。于是。。。我找了好久,补了很多环境。最后发现和这些环境都没太大关系。

我发现他的代码里有两段经过JSFUCK加密后的代码:

分别在node和浏览器中运行一下,第一处:

相同,那不管他。第二处:

node里报了错,浏览器返回false。。。好吧,我懂了。你这个代码,太狗了啊,把检测环境的放在了这里面。没有补到location的环境,理所应当的报错。那我们只要把代码里的这段换成浏览器执行的结果就行了。也就是这里的xe,换成false。

直接出结果。

然后还有一个是风控的坑,他这里是点击翻页一次window.o就会自增1,那么点击5次以后,也就是window.o变成6的时候,就会失效并重置网页。

可能你会问,这和加密有啥关系?我最开始用hook把可以运行的JS替换回去以后,发现可以出结果,但是过不去风控。也就是发包返回了这样一个结果:

我在控制台调试的时候发现了这个现象:

每次调用得到的结果不同,刚开始看我也没太在意。但是多测了几次,发现了个规律。。第一次调用的结果,也就是DARMgs这行,你发没发现他有点面熟

这个结果和node里执行的是一样的。如果说这个加密每次得到的结果不同,那为什么又会出现相同的值?

我们发现再用node运行这个js,无论多少次,都会得到相同的结果。连续输出4次试试:

这4个值和上面在浏览器里得到的4个值,是相同的。。那基本上可以猜出来加密的逻辑了,和调用的次数有关。

那么用fiddler整个替换js文件可以拿到数据,而把相同的代码用Hook替换过去就过不了风控也可以解释了。

这里算是他的一个坑人的点。另外还有时效性,拿到参数超过几秒钟再发包就触发风控。所以后面真想拿到这5页的数据,也要考虑好逻辑。

总结

    这道题还是有几个坑的,风控做的还是很有意思的。JS的部分比较简单,环境补好就没什么问题了。

推荐阅读更多精彩内容