猿人學web端爬蟲攻防大賽賽題第15題——備周則意怠-常見則不疑

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

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

解題步驟

  1. 看觸發的資料包。
    image
    image

  2. 有個m引數,一看就是經過處理的,我們得知道m是如何組成的。看Initiator模組。
    image

  3. 還是看request函式,往上一看就看到了m的賦值操作。
    image

  4. 打斷點,觸發。
    image

  5. 看下window.m()的定義。
    image

  6. 比較好理解的,t1t2就是對時間戳做相應的處理,關鍵是window.q函式,定位一下。
    image

  7. 定位的一頭霧水,啥也沒有呀。回到剛剛的地方,發現它載入了/static/match/match15/main.wasm檔案,可能window.q函式在檔案裡面定義的。
    image

  8. 先寫程式碼獲取/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上執行的問題。

  9. 嘗試呼叫wasm檔案中的encode函式來完成m的生成。
    image

    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)
    

    執行得到如下結果,形式與資料包中一致。
    image

  10. 編寫最終程式碼。

    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)
    

    執行得到最終結果。
    image

  11. 提交結果,成功透過。
    image

相關文章