猿人学js逆向比赛第一届第十八题
一、分析请求
通过堆栈定位到这类,那么可以看到这里在调用open函数的时候并没有t与v参数,那么这里直接看一下函数
可以看到果然被重定义了,那么这里直接将代码拿下来,本地运行试一下,发现自己定义的open 函数虽然被重写了但是并没给添加上t和v的参数,那么这里就要分析这段代码了。
二、分析代码
因为都是下划线定义的变量不是很好的区分,所以先简单使用ast
处理一下。
将ast处理后的代码替换到页面上,发现替换后open函数没有被重写了,那么肯定是做了代码的格式化检测了,这里通过下断点定位到下面的这里进行了调用toString方法。
那么这里写一个判断将原本的函数体字符串返回出去再试一下;判断代码如下:
if(v75==="toString" && v102.arguments && v102.arguments.length===2 && v102.arguments[0]==="jsvmpzl:ver.1.1.3"){//这里返回原本的字符串信息。
}
经过上面的字符串返回以后,open函数被重写了也可以正常的去翻页请求了,这里可以看到因为刚才的插桩点没有去掉,只要光标放到页面上就会有这么一堆的数组输出出来。
手动进行翻页,这里可以看到这里有用到上面最后一次的鼠标轨迹,同时先获取了一次时间,然后生成了一个字符串。然后将页码和上面的轨迹进行拼接,得到了两个参数。
那么下面接着看日志这里可以看到下面这它分别解析了这两个字符串,然后调用加密函数,同时加密函数高度疑似aes,des这种的加密算法。
那么这里继续写一个if分支,让调用encrypt函数的时候断住。调试发现,实际上这里的加密出的结果就是v这个参数。
那么刷新页面再次段到这里分析一下encrypt函数。按照正常的aes算法去判断,这里的key和iv是一致的。
同时在右侧作用域内找到了带有AES加密算法的关键对象,那么这里可以合理推测这是一个AES 加密算法 CBC 模式 Pkcs7填充模式,下面就需要去验证以上是否是标准的加密算法。
经过验证,是标准算法,那么这里直接写python代码即可。至于轨迹部分先固定的测试一下。可以看到直接用固定的轨迹是没问题,说明是不校验轨迹的,另外要注意一个点,就是当加载第一页数据的时候是不带t和v的,虽然带了也能通过。