題目網址:https://match.yuanrenxue.cn/match/15
解題步驟
-
看觸發的資料包。
-
有個
m
引數,一看就是經過處理的,我們得知道m
是如何組成的。看Initiator
模組。
-
還是看
request
函式,往上一看就看到了m
的賦值操作。
-
打斷點,觸發。
-
看下
window.m()
的定義。
-
比較好理解的,
t1
和t2
就是對時間戳做相應的處理,關鍵是window.q
函式,定位一下。
-
定位的一頭霧水,啥也沒有呀。回到剛剛的地方,發現它載入了
/static/match/match15/main.wasm
檔案,可能window.q
函式在檔案裡面定義的。
-
先寫程式碼獲取
/static/match/match15/main.wasm
檔案的內容。
這裡需要利用python的第三方庫:pywasm
安裝:pip install pywasm==1.0.8
一開始安裝pywasm庫的時候沒有指定版本,導致我的程式一直報錯,後來指定版本為1.0.8後報錯消失。
import pywasm wasm_url = "https://match.yuanrenxue.cn/static/match/match15/main.wasm" resp1 = requests.get(wasm_url) with open("main.wasm", mode="wb") as file: file.write(resp1.content)
wasm檔案:WASM(WebAssembly)是一種為瀏覽器設計的二進位制指令格式,它使得開發者能夠以一種安全、快速和跨平臺的方式在Web上執行高效能程式碼。 WASM 是一種編譯目標,類似於機器碼,但它是為Web設計的,旨在解決C、C++、Rust等程式語言在Web上執行的問題。
-
嘗試呼叫wasm檔案中的encode函式來完成
m
的生成。
import requests import time import random import math import pywasm wasm_url = "https://match.yuanrenxue.cn/static/match/match15/main.wasm" resp1 = requests.get(wasm_url) with open("main.wasm", mode="wb") as file: file.write(resp1.content) t1 = int(time.time() / 2) t2 = int(time.time() / 2 - math.floor(random.random() * 50 + 1)) module = pywasm.load('./main.wasm') result = module.exec('encode', [t1, t2]) m = "{}|{}|{}".format(result, t1, t2) print(m)
執行得到如下結果,形式與資料包中一致。
-
編寫最終程式碼。
import requests import time import random import math import pywasm import re wasm_url = "https://match.yuanrenxue.cn/static/match/match15/main.wasm" resp1 = requests.get(wasm_url) with open("main.wasm", mode="wb") as file: file.write(resp1.content) res_sum = 0 for i in range(1, 6): t1 = int(time.time() / 2) t2 = int(time.time() / 2 - math.floor(random.random() * 50 + 1)) module = pywasm.load('./main.wasm') result = module.exec('encode', [t1, t2]) m = "{}|{}|{}".format(result, t1, t2) url = "https://match.yuanrenxue.cn/api/match/15?m={}&page={}".format(m, i) headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 " "Safari/537.36", "cookie": "Hm_lvt_9bcbda9cbf86757998a2339a0437208e=xxxx; HMACCOUNT=xxxx; " "Hm_lvt_c99546cf032aaa5a679230de9a95c7db=xxxx; no-alert3=true; tk=-xxxx; " "sessionid=xxxx; Hm_lpvt_9bcbda9cbf86757998a2339a0437208e=xxxx; Hm_lpvt_c99546cf032aaa5a679230de9a95c7db=xxxx", } resp = requests.get(url, headers=headers) string = resp.text pattern = '{"value": (.*?)}' findall = re.findall(pattern, string) for item in findall: res_sum += int(item) print(res_sum)
執行得到最終結果。
-
提交結果,成功透過。