【猿人学】第二题逆向分析

难点

加密在 CookieCookie 有时间限制暗桩反调混淆调试阻塞

Tip:文末可以下载例子

猿人学该题官网:http://match.yuanrenxue.com/match/2

mark

确定逆向目标

mark

开始逆向

加密值在 Cookie 有两种情况,该加密 Cookie 是服务器返回 或者 是本地生成

分析请求

mark

反 ob 混淆

这段代码经过了 ob 混淆,格式化后是这样的

mark

一键 ob 反混淆(猿人学提供有)

网址:http://tool.yuanrenxue.com/decode_obfuscator

mark

分析加密处

反混淆后,直接看见了 document["cookie"],还有 location["reload"](); 这个不就就是:设置 Cookie 然后再次请求嘛

mark

调试加密值

发现 M() 函数为空,V(Y) 函数疑似加密结果

mark

导出加密值

这个加密值在函数内部,想要使用就用 全局变量接收一下

mark

暗桩一

这段代码, 其中!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] }'

mark

请求计算结果

稍微修改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)

mark

结果正确

mark

完整代码:https://pan.bigdataboy.cn/s/EYSW

发表评论 / Comment

用心评论~