猿人学js逆向比赛第一届第二十题
分析请求
通过堆栈可以快速定位到这里,,那么sign,就是调用的sign函数生成的了。
通过在控制他输出sign快速定位到这个函数,在这里下个断点调试看一下。
跟到这里了,并没有看到有什么疑似密文的产生,那么大概率就是在这个函数中做的了,那么在跟到这个函数里面看一下。很明显看到了wasm的特点,那么接下来就是分析这个wsam是在哪里加载的。
二、分析wasm
通过关键字定位,我定位到了这里进行的赋值操作,同时看到了webpack3的特征值,那么这里就可以推测这实际上是一个webpack3打包的加载wasm的代码。
这里通过定位加载器,也是顺利找到了wasm加载的位置。那么这里只需导出这个importObject到本地就行了。
这里通过这个importObject也是定位到了这里,但是可以看到这里的对象里面每个key所对应的value实际上并不是真正的函数体,那么这里全局搜索关键字看一下能不能搜到,实际上就是本节一张图中的位置。
那么这里直接将函数拿下来,然后这样导入这些函数到这个对象中。
直接运行发现报错Window
未定义,那么这里上代理补环境是不是就行了。最终补的环境如下:
window = global;Window = function (){};
window.__proto__ = Window.prototype;window.top = window;
window.self = window;document = {body:{},
};
剩下就是传入相同参数和浏览器对比一下得到的结果是否一致。
可以看到得到的结果是一致的,那么封装发送请求,最终成功出值。
三、分析wasm(2)
本节为记录另一种分析wasm的方式,通过追到这个函数里面,在这里分析sign的生成。
这里传入的是两个地址,一个长度,那么在内存中对应的是什么呢?
第二个参数就是传进来的这个content的在内存中的起始地址,第一参数现在所对应的地址是空的,那么继续向下跟。
这里跟到了有一个sign的函数调用,同时穿的参数还是刚开始掉本自己的这三个参数,那么追进去看一下。
最终定位到这里,那么在后面拼接了一个D#uqGdcw41pWeNXm
,然后进行了hash,然后再往下就没有看到别的什么意思加密算法的了。
String.fromCharCode.apply(null,new Uint8Array(memories[0].buffer.slice(1114192,1114192+31))) // 通过这种方式将内存中字符串提取出来
那这里将字符串拼接后的字符串进行hash,看一下得到的结果是否就是sign这个参数
发现是一样的,现在就多次测试,最终确定实际上就是在传入的字符串后面添加了那个盐值,然后进行的md5。再次请求测试,可以看到是没问题的。
oXM1-1752322205403)]
发现是一样的,现在就多次测试,最终确定实际上就是在传入的字符串后面添加了那个盐值,然后进行的md5。再次请求测试,可以看到是没问题的。