猿人学第一届第18题

前言:记录学习

  • 实验目的

  • 确定分析参数,通过抓包得知,加密参数为page,t,v。page不用分析,t有点像时间戳,v需要重点关注,跟进去看看。

最多跟到这,接下来就又是艰苦的混淆代码了

跟进去,能看到使用CryptoJS AES加密,写个hook看看

old=_[1][0]['CryptoJS']['AES']['encrypt']
_[1][0]['CryptoJS']['AES']['encrypt']=function(a,b,c){
    console.log(a,b,c)
    debugger
    return old(a,b,c)
}

找到了,能看到明文为'4|321m282,322m282,322m283,322d283,322u283',密钥和iv向量为67212c9f67212c9f,目前还是有点懵逼,下一步看看日志。

在apply处下一个条件断点,看看它的函数调用日志

能看到这个地方出现了密钥,按照toString(16)方法试一下,

能看到key就是时间戳转为16进制67212ef9后重复两次,

接下来进行验证,js标准库CryptoJS是否与网站的相同

// 定义模式和填充方式
const mode = CryptoJS.mode.CBC; // 可以选择 CryptoJS.mode.ECB 或其他模式
const padding = CryptoJS.pad.Pkcs7; // 可以选择 CryptoJS.pad.NoPadding 或其他填充方式

// AES 加密
function encryptText(text, key, iv, mode, padding) {
    const keyWordArray = CryptoJS.enc.Utf8.parse(key);
    const ivWordArray = CryptoJS.enc.Utf8.parse(iv);
    const encrypted = CryptoJS.AES.encrypt(text, keyWordArray, {
        iv: ivWordArray,
        mode: mode,
        padding: padding
    });
    return encrypted.toString();
}

function encrypt(text){
    const ming_r='|326m312,324m312,322m312,322d312,322u312'
    const ming=text+ming_r
    const key=parseInt(new Date().getTime() /1000);
    var key_hex=key.toString(16)
    //var key_hex='6720a4c7'
    key_hex=key_hex+key_hex
    console.log(key_hex)
    return {
        page:text,
        t:key,
        v:encryptText(ming, key_hex, key_hex, mode, padding)
    }
}
k=encrypt('2')

验证当使用key和iv,明文与浏览器相同时,结果也一样,将明文除page外参数写死。

三。编写python代码,进行结果获取

import requests
import json
import execjs

import requests


def get_res(page):
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
    }
    cookies = {
        "sessionid": "sxsq4a5lmg7xk2quhc7xo5gunzv5dnn3",
    }
    url = "https://match.yuanrenxue.cn/match/18data"
    with open("encrypt.js", "r", encoding="utf-8")as f:
        code = f.read()

    params= execjs.compile(code).call('encrypt', str(page))
    print(params)
    response = requests.get(url, headers=headers, cookies=cookies, params=params)
    print(response.text)

    return response.text

def get_data(get_res,check,check_fun=None):

    def sub(datalist):
        """
        求和
        """
        result=0
        for data in datalist:
            result+=data
        return result

    def avg(datalist):
        """
        求平均值
        """
        return sub(datalist)/len(datalist)


    def get_data(datalist):
        result=[]
        for data in datalist:
            result.append(data['value'])
        print(result)
        return result

    result=[]
    for i in range(1, 6):
        res= get_res(i)
        data= json.loads(res)['data']
        result.extend(get_data(data))
    print(result)
    if check_fun:
        answer= eval(check_fun)(result)
    else:
        answer=eval(check)(result)
    print(answer)

if __name__ == "__main__":
    get_data(get_res, 'sum')

得出结果,浏览器验证答案正确,分析结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值