猿人学web端爬虫攻防大赛赛题第15题——备周则意怠-常见则不疑

题目网址: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

posted @ 2024-11-01 22:29  死不悔改奇男子  阅读(22)  评论(0编辑  收藏  举报