第一题  魔改算法
把整个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)
   |