猿人學web端爬蟲攻防大賽賽題第20題——2022新春快樂

死不悔改奇男子發表於2024-11-17

題目網址:https://match.yuanrenxue.cn/match/20

解題步驟

解題之前需要先了解wasm是什麼:https://docs.pingcode.com/ask/294587.html

  1. 看資料包。
    image
  2. sign是一串加密的字串,t一看就是時間戳。全域性搜尋api/match/20,只有一處。
    image
  3. 打斷點,觸發。
    image
  4. 看下sign的生成邏輯。
    "sign": window.sign(window.page + '|' + t.toString())
    window.page:當前的頁碼
    t:時間戳
    window.sign:一個函式,主要關鍵點。
    找到定位,打斷點,讓斷點執行到此處。
    image
    可以看到傳進來的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"]
      image
    • 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三個引數
      image
      image
    • len0:值為15
      image
      經分析,retptr 為指標地址,ptr0 為記憶體地址
  5. 重點看_index_bg_wasm__WEBPACK_IMPORTED_MODULE_0__["sign"],打斷點。
    image
    image
    主要傳了$var0$var1$var2三個引數,重點看這三個變數的值,執行進來。
    image
    在其餘包含有sign關鍵字的語句也打上斷點,釋放斷點,看會進入哪一個。最終進入$match_twenty::sign::MD5::hash::hd3cc2e6ebf304f6f
    image
    image
    再看$var0$var1$var2三個引數的值。
    image
    長度$var2由15變成了31,說明在這個函式中進行了加密。$var1變成了1114192。
    繼續釋放斷點,跳不過的就取消斷點,最後回到了getStringFromWasm0函式。
    image
  6. 此時將$var1$var2值傳入getStringFromWasm0函式,在控制檯輸出。
    image
    明文,並且在明文後面加了鹽D#uqGdcw41pWeNXm
  7. 再結合加密函式的名字為MD5,嘗試對明文進行MD5加密。
    image
    再將得到的r0r1傳入getStringFromWasm0函式,在控制檯輸出。
    image
    發現跟我們MD5加密的結果一致, 所以這是個加鹽的MD5加密。
  8. 開始編寫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)
    
    執行得到結果。
    image
  9. 提交,成功透過。
    image

相關文章