第一题 魔改算法
把整个match1.js
文件扣下来,放到vscode运行
第一步 过掉i函数
这里会报错,看到前面有检测了 window self 这些属性
对比一下浏览器 i()
函数的返回结果,删掉无关的代码,过掉检测
删掉检测后的代码段如下,前面h的大段代码也可以去掉,因为h只在i函数里面有用到
1
| var i = function () {return 0xbb76994f;}
|
第二步 删除ajax请求
在node里面执行不了ajax,所以也要去掉
第三步 导出cyrpto-js
自执行的代码我们调用不了,为了方便调用,修改一下call函数
第四步 编写调用函数 get_token
打印出结果,这里虽然能正常运行了,但是和浏览器的token计算值还是不一样,因为还有一些环境没补
第五步 补环境
delete window
在浏览器执行,肯定是失败的,但在node可以执行成功,这里需要改成 true
1
| x > 0x6 && B % x == 0x4 && (u = true ? i[u >>> 0x1a] << 0x18 | i[u >>> 0x10 & 0xff] << 0x10 | i[u >>> 0x8 & 0xff] << 0x8 | i[u & 0xff] : i[u >>> 0x16] << 0x18 | i[u >>> 0x10 & 0xff] << 0x10 | i[u >>> 0x8 & 0xff] << 0x8 | i[u & 0xff]);
|
这里既检测了global,也检测了window,众所周知,在浏览器里面有window对象,但是global是未定义,而在node则相反
因此需要过掉这个检测,过掉方法也很简单,结合网页调试,直接返回window
1
| ['call'](this, window));
|
修改成:
1 2 3
| '_map': (function () { return 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/='; }())
|
修改成:
1 2 3 4 5 6 7 8
| '_doReset': function () { try { RCON[0x0][0x0][0x0], this['_hash'] = new h['init']([0x67452002, 0xefcdab80, 0x98badcfe, 0x10325476]); } catch (q) { true ? this['_hash'] = new h['init']([0x67452301, 0xefcdab80, 0x98badcfe, 0x10325476]) : this['_hash'] = new h['init']([0x67452002, 0xefcdab80, 0x98badcfe, 0x3025476]); } },
|
这是多个条件的三元表达式,不熟悉js的话,我举个栗子:
1 2 3 4
| true && false ? 1:2 >>> 2 true && true ? 1:2 >>> 1
|
三个都改成true就行了
1
| true && true && true ? Q = p(Q, R, S, P, L, 0x12, k[0x3b]) : Q = p(Q, R, S, P, L, 0x9, k[0x3b]);
|
还检测了node环境,这里要改成:
1
| var s = false ? [0x0, 0x1b, 0x36, 0x8, 0x10, 0x1, 0x2, 0x4, 0x80, 0x20, 0x40] : [0x0, 0x1, 0x2, 0x4, 0x80, 0x1b, 0x36, 0x8, 0x10, 0x20, 0x40]
|
结束
改完后将代码保存成js文件,结合py调用,成功获得结果:
完整的代码我也放到下面了👇👇👇,js代码量太大放不下,有需要的再私信
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| import requests import execjs
headers = { "authority": "match2023.yuanrenxue.cn", "accept": "application/json, text/javascript, */*; q=0.01", "accept-language": "zh-CN,zh;q=0.9", "cache-control": "no-cache", "content-type": "application/x-www-form-urlencoded; charset=UTF-8", "origin": "https://match2023.yuanrenxue.cn", "pragma": "no-cache", "referer": "https://match2023.yuanrenxue.cn/topic/1", "sec-ch-ua": "\"Chromium\";v=\"118\", \"Google Chrome\";v=\"118\", \"Not=A?Brand\";v=\"99\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "same-origin", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "x-requested-with": "XMLHttpRequest" } url = "https://match2023.yuanrenxue.cn/api/match2023/1" ctx = execjs.compile(open("2-1\\1.js").read()) sum = 0 for page in range(1, 6): token, ts = ctx.call("get_token", page) data = { "page": page, "token": token, "now": ts } response = requests.post(url, headers=headers, data=data) print(response.text) for d in response.json()["data"]: sum += d["value"] print(sum)
|