第一题 魔改算法

把整个match1.js文件扣下来,放到vscode运行

image.png

第一步 过掉i函数

这里会报错,看到前面有检测了 window self 这些属性

image.png

对比一下浏览器 i() 函数的返回结果,删掉无关的代码,过掉检测

image.png

删掉检测后的代码段如下,前面h的大段代码也可以去掉,因为h只在i函数里面有用到

1
var i = function () {return 0xbb76994f;}
第二步 删除ajax请求

在node里面执行不了ajax,所以也要去掉

image.png

第三步 导出cyrpto-js

自执行的代码我们调用不了,为了方便调用,修改一下call函数

image.png

第四步 编写调用函数 get_token

打印出结果,这里虽然能正常运行了,但是和浏览器的token计算值还是不一样,因为还有一些环境没补

image.png

第五步 补环境
  • window

image.png

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]);                         

image.png

这里既检测了global,也检测了window,众所周知,在浏览器里面有window对象,但是global是未定义,而在node则相反

因此需要过掉这个检测,过掉方法也很简单,结合网页调试,直接返回window

1
['call'](this, window));
  • navigator

image.png

修改成:

1
2
3
'_map': (function () {
return 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';
}())
  • document

image.png

修改成:

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]);
}
},
  • location

image.png

这是多个条件的三元表达式,不熟悉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]);
  • global

image.png

还检测了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调用,成功获得结果:

image.png

完整的代码我也放到下面了👇👇👇,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)