声明:
本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!若有侵权,请添加(wx:wyqlxl99)联系删除
前言:
猿人学24年新春题来咯,打开控制台一看,哟这不是老朋友嘛 今天就弄你了!

直接上动态调试,具体怎么调试的过程可以去看我写的这一篇关于js盾动态调试的文章 某月瓜网站js盾动态调试方案
查看一下我们需要逆向的参数,可以看到是这个n[jîÐ: 什么鬼玩意!

我们可以看到这个arraybuffer就是传递的参数 接下来我们就要找这个参数是哪来的,直接搜_160442然后看这个值是哪来的,然后往回跟栈

可以看到这里是vmp的部分而_106198就是vmp操作的堆栈那我们在这边下一个日志断点查看翻页的时候堆栈里面参数的变化

我们可以直接在输出的堆栈中可以看到几个关键点,12345678,'1[[510,341,137234.10000002384],[688,19,322725],[540,331,140376.79999995232]]',crypto-js 而且这段日志很短并且没有看到加密相关的一些魔数,所以这个加密大概率是vmp之外单独的方法加密的

利用盲狙法,我们点开堆栈找到点进去然后下一个断点


下断点之后再次点击翻页就断到了,我们可以看一下这个部分_27257是明文
_198780应该是key _108159则是模式和填充模式

我们继续往下跟跟进这个方法我们可以看到这个方法,看过crypto-js源码的应该熟悉可以看到这一段


我们在控制台输出_10969["\u2028","iv"]可以看到iv是undefined所以我们可以推测大概是ECB模式我们再跟进padding可以看到是pkcs7的填充模式

接下来我们再观察key一开始我们猜测12345678是key那我们通过下面去验证一下先拿一段crypto-js的代码去解析然后跟网页上的一对比相同,说明12345678就是我们需要的密钥

我们想要的Key,模式,填充模式、明文都有了那我们是不是要考虑这个玩意到底是AES还是DES加密,我们可以根据crypto-js的源码C_algo这个部分可以看出网页上的是DES加密


我们使用DES按照key是12345678 模式是ECB 模式 填充模式是Pkcs7进行加密跟堆栈生成的值进行对比发现值是正确的

接下来要看这一步是怎么来的从加密的密文变成下面这一段乱码

我们找到我们插桩的部分在插桩的下面再打上一个断点用于我们单步输出堆栈来查看堆栈里面有什么?我们通过逐步打印堆栈可以看到加密完之后会向堆栈推入一个atob那是不是就是atob把加密之后的密文变成乱码呢?

通过对比我们可以看到果真如此,至此加密的部分就搞定了

接下来我们来看解密部分的堆栈可以看到有一串乱码估计是返回值里面拿到的然后有一个八位的 'XWrcjxl1'盲猜大概率是key,应该用的也是同样的DES所以我们直接测试发现解密成功了


现在我们解密就差两个东西第一个乱码值,第二个key值,我们可以从堆栈中看到服务端返回的是一个106068长度的arraybuffer下面还有一个长度10000的arraybuffer我们先转换看一下这两个的utf8 是怎么样的

转换出来我们可以看到是一串乱码那明文乱码和key肯定就藏在这里面那客户端是怎么去获取的呢?

可以看到他是先从106068中96068开始截取获取到最后一万位的code数组然后转换成字符串的形式

我们接着单步打印堆栈可以看到ÿÿÿÿ以及我画线的部分我们可以推测他是用上面转化出来的字符串按ÿÿÿÿ进行分割,分割之后的最后一位+当前访问的页数就是我们解密的密钥


那密文呢?我们接着往下看 可以看到-2说明取的是分割出来8位数组的倒数第二位,然后进行btoa转换出base64字符串然后通过上面的key进行解密


至此加密解密的部分就完成了!接下来就整理一下代码嗖一下就过去了,还有一个重点就是本题检测了tls如果tls检测不通过返回的content就不会是106068长度的,如果没用tls会直接返回异常

有兴趣的可以加入我的星球后续会持续分享和更新!
