題目網址:https://match.yuanrenxue.cn/match/20
解題步驟
解題之前需要先了解wasm是什麼:https://docs.pingcode.com/ask/294587.html
- 看資料包。
sign
是一串加密的字串,t
一看就是時間戳。全域性搜尋api/match/20
,只有一處。
- 打斷點,觸發。
- 看下
sign
的生成邏輯。
"sign": window.sign(window.page + '|' + t.toString())
window.page
:當前的頁碼
t
:時間戳
window.sign
:一個函式,主要關鍵點。
找到定位,打斷點,讓斷點執行到此處。
可以看到傳進來的content
就是頁碼和時間戳拼接的內容。
方法呼叫的名字確實長,靠經驗關鍵函式是_index_bg_wasm__WEBPACK_IMPORTED_MODULE_0__["sign"]
,不過這個函式有3個傳參。retptr
const retptr = _index_bg_wasm__WEBPACK_IMPORTED_MODULE_0__["__wbindgen_add_to_stack_pointer"](-16);
先跟進_index_bg_wasm__WEBPACK_IMPORTED_MODULE_0__["__wbindgen_add_to_stack_pointer"]
ptr0
var ptr0 = passStringToWasm0(content, _index_bg_wasm__WEBPACK_IMPORTED_MODULE_0__["__wbindgen_malloc"], _index_bg_wasm__WEBPACK_IMPORTED_MODULE_0__["__wbindgen_realloc"]);
主要涉及arg、malloc、realloc三個引數
len0
:值為15
經分析,retptr 為指標地址,ptr0 為記憶體地址
- 重點看
_index_bg_wasm__WEBPACK_IMPORTED_MODULE_0__["sign"]
,打斷點。
主要傳了$var0
、$var1
、$var2
三個引數,重點看這三個變數的值,執行進來。
在其餘包含有sign
關鍵字的語句也打上斷點,釋放斷點,看會進入哪一個。最終進入$match_twenty::sign::MD5::hash::hd3cc2e6ebf304f6f
。
再看$var0
、$var1
、$var2
三個引數的值。
長度$var2
由15變成了31,說明在這個函式中進行了加密。$var1
變成了1114192。
繼續釋放斷點,跳不過的就取消斷點,最後回到了getStringFromWasm0
函式。
- 此時將
$var1
、$var2
值傳入getStringFromWasm0
函式,在控制檯輸出。
明文,並且在明文後面加了鹽D#uqGdcw41pWeNXm
。 - 再結合加密函式的名字為MD5,嘗試對明文進行MD5加密。
再將得到的r0
和r1
傳入getStringFromWasm0
函式,在控制檯輸出。
發現跟我們MD5加密的結果一致, 所以這是個加鹽的MD5加密。 - 開始編寫python程式碼了。
執行得到結果。import requests import time import hashlib import re pattern = '{"value": (?P<num>.*?)}' num_sum = 0 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"} cookies = {"sessionid": "xxxxx"} for i in range(1, 6): t = str(int(time.time()) * 1000) ming = str(i) + "|" + t + "D#uqGdcw41pWeNXm" sign = hashlib.md5(ming.encode()).hexdigest() url = "https://match.yuanrenxue.cn/api/match/20?page={}&sign={}&t={}".format(i, sign, t) resp = requests.get(url, headers=headers, cookies=cookies) content = resp.text findall = re.findall(pattern, content) for item in findall: num_sum += int(item) print(num_sum)
- 提交,成功透過。