难点
加密在 Cookie
,Cookie 有时间限制
,暗桩反调
,混淆
,调试阻塞
Tip:文末可以下载例子
猿人学该题官网:http://match.yuanrenxue.com/match/2
确定逆向目标
开始逆向
加密值在 Cookie 有两种情况,该加密 Cookie 是服务器返回 或者 是本地生成
分析请求
反 ob 混淆
这段代码经过了 ob 混淆,格式化后是这样的
一键 ob 反混淆(猿人学提供有)
网址:http://tool.yuanrenxue.com/decode_obfuscator
分析加密处
反混淆后,直接看见了
document["cookie"]
,还有location["reload"]();
这个不就就是:设置 Cookie 然后再次请求嘛
调试加密值
发现
M()
函数为空,V(Y)
函数疑似加密结果
导出加密值
这个加密值在函数内部,想要使用就用 全局变量接收一下
暗桩一
这段代码, 其中
!a6["test"](a2)
执行起来很慢,并且一直返回true
,所以直接写死,就会发现执行起来很快了,一些调试工具也不会阻塞了
var a2 = B(this, function () { var a5 = function () { var a6 = a5["constructor"]("return /\" + this + \"/")()["compile"]("^([^ ]+( +[^ ]+)+)+[^ ]}"); return !a6["test"](a2); // true }; return a5(); });
暗桩二
如果说暗桩一是技巧,那暗桩二才是真正的暗桩,可以看这段代码
改造了console.log 只要我们一使用就会陷入
,虽然这个暗桩对 Js 执行没有影响,但是调试就很容易陷入
console = new Object() console.log = function(s) { while (1) { for (i = 0; i < 1100000; i++) { history.pushState(0, 0, i) } } } console.toString = '[object Object]' console.log.toString = '? toString() { [native code] }'
请求计算结果
稍微修改Js,计算结果
import execjs import requests def get_c(): return execjs.compile(open('./main.js', 'r', encoding="utf-8").read()).call('f') def app(page: int) -> dict: rep = requests.get( url="http://match.yuanrenxue.com/api/match/2", headers={ "Cookie": f"sessionid=你的sessionid;m={get_c()};", "User-Agent": "yuanrenxue.project", }, params={"page": page} ) return rep.json() if __name__ == '__main__': sum = 0 for _ in range(1, 6): data = app(_) for value in data.get('data'): sum = sum + value.get("value") print(sum)
结果正确
版权声明:《 【猿人学】第二题逆向分析 》为明妃原创文章,转载请注明出处!
最后编辑:2021-6-16 11:06:40