js_reverse/猿人学练习/3js加密js第六节实战例题sojson解密,headers检测,动态cookie

知识点sojson解密headers检测动态cookie

解题思路

控制台查看发现cookie中存在m的变量,值是加密的

请求

经过几次的请求尝试,发现变量m是通过https://www.python-spider.com/challenge/3地址请求过后生成的

请求

接下来事件断点

请求

老规矩下一步,下一步,下一步,到https://www.python-spider.com/challenge/3停下来可以看到js代码存在混淆

请求

利用google插件v_jstools进行解混淆

请求

复制解混淆后的js代码尝试运行去除头尾的匿名函数运行

请求

这里的报错的原因是一段eval(L(qz))代码,尝试打印console.log(L(qz));

请求

打印结果是

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] }'

我的操作简单粗暴,直接注释不执行

再看接下来的代码,返回的是navigator.vendorSub;,这里就是空

try {
    if (global) {
        console.log("人生苦短何必python");
    } else {
        while (1) {
            console.log("人生苦短何必python");
            debugger;
        }
    }
} catch (a5) {
    console.log(a5);
    return navigator.vendorSub;
}

改写成

return '';

代码最后,这些也同样注释掉

function W(Y, Z) {
    document.cookie = "m" + M() + "=" + V(Y) + "|" + Y + "; path=/";
    location.reload();
}

function X(Y, Z) {
    return Date.parse(new Date());
}

W(X());

替换成

m = V(1678168607000);
console.log(m);

得到了m值,就可以模拟请求,

def challenge3(page, m, timestamp):
    url = "https://www.python-spider.com/api/challenge3"
    payload = f"page={page}"
    headers = {
        'cookie': f'm={m}|{timestamp}'
    }
    response = requests.request("POST", url, headers=headers, data=payload)
    return response.text

但发现返回的数据是不变的,为什么?

用charles代理拦截对比查看请求体最后猜测是header问题

请求

复制header请求成功