WASM进阶-猿人学第二十题

本文详细解读了如何通过Python调用WASM文件并逆向分析JavaScript代码,揭示了sign函数中的MD5加密和盐值处理过程。作者通过实际操作演示了如何获取明文和验证加密结果,适合对Web技术逆向感兴趣的开发者。
摘要由CSDN通过智能技术生成

image.png

目标是 sign 参数的生成,直接搜

image.png

进入sign函数内部查看

image.png

这里 _index_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ 名字很长,其实就是 wasm 模块的意思

image.png

前面已经写过文章介绍了三种方法,python如何调用wasm文件,直接上代码试试:

文件地址:https://match.yuanrenxue.com/api/match20/wasm

In [1]: import pywasm

In [2]: runtime = pywasm.load('wasm.wasm')

报错:Exception: pywasm: missing import ./index_bg.js.__wbg_instanceof_Window_434ce1849eb4e0fc

果然没那么简单 😅 看一下源码,从外部js导入了其他函数

image.png

没办法,只能硬着头皮去肝wasm源码了,先上一段wasm 基础

                  |  代表导出函数 sign  |
        伪id  71  |  export修饰         |    $var0,$var1 参数名 i32代表类型 int32
(func $sign (;71;) (export "sign") (param $var0 i32) (param $var1 i32) (param $var2 i32)
local 为当前函数内部用到的变量
(local $var3 i32) (local $var4 i32) (local $var5 i32) (local $var6 i32) (local $var7 i32) (local $var8 i32) (local $var9 i32) (local $var10 i32) (local $var11 i32) (local $var12 i32) (local $var13 i32) (local $var14 i32) (local $var15 i32) (local $var16 i32) (local $var17 i32) (local $var18 i32) (local $var19 i32) (local $var20 i32) (local $var21 i32) (local $var22 i32) (local $var23 i32) (local $var24 i32) (local $var25 i32) (local $var26 i32) (local $var27 i32) (local $var28 i32) (local $var29 i32) (local $var30 i32) (local $var31 i32) (local $var32 i32) (local $var33 i32) (local $var34 i32) (local $var35 i32) (local $var36 i64)
global.get $global0         global.get 从全局变量中读东西
local.set $var3             local.set  写到局部变量中    读写一般都是成对出现的,一般为赋值操作    (约等于$var3 = $global0)
i32.const 80                也是读操作,从类型定义了一个80的数
local.set $var4             写入到 $var4   (约等于:$var4 = 80)
local.get $var3             读$var3
local.get $var4             读$var4
i32.sub                     写操作,i32的减法操作
local.set $var5             写入到 $var5    (约等于:$var5 = $var3 - $var4)堆栈操作  先读的在前
local.get $var5
global.set $global0
local.get $var5
local.get $var1
i32.store offset=64         内存操作,store:缓存,load:读取,offset:偏移量
local.get $var5
local.get $var2
i32.store offset=68
i32.const 16
local.set $var6
local.get $var5
local.get $var6
i32.add						加操作,也属于写操作
local.set $var7
local.get $var7
local.get $var1
local.get $var2
call $func246           执行函数操作,可看之前的get操作一直到set停止,这里就相当于 将$var7,$var1,$var2,传入函数执行
local.get $var5
i32.load offset=16
local.set $var8

image.png

加密步骤其实只有这一步,len0 就是 content 的长度,下面几步是从内存中获取值,进入到 wasm 内部查看 sign函数

image.png

再次进入 sign 函数

image.png

一直往下滑,直到看到 md5 字样,然后再次进入函数内部

image.png

此时发现 content 长度发生变化,看一下长度,大概是经过了md5加密,那就先来看一下明文是啥?

image.png

这段代码的意思,大概相当于 md5($var56, $var55),利用 getStringFromWasm0 函数,我们可以查看传入的明文

getStringFromWasm0(1114192, 31)
>>> '1|1662882794000D#uqGdcw41pWeNXm'

就是在 content 加了一段盐值,经过多次调试发现,盐值不变

验证一下是否为标准的md5加密:

image.png

结果一直,至此逆向分析过程结束

python 代码

import requests
import time
import hashlib


yuanrenxue_headers = {
    "User-Agent": "yuanrenxue.project",
    "Cookie": "sessionid=替换成你自己的cookie"
}


def get_sign(page, ts):
    data = f"{page}|{ts}D#uqGdcw41pWeNXm".encode()
    return hashlib.md5(data).hexdigest()
    


def main():
    total = 0
    for page in range(1, 6):
        api = "https://match.yuanrenxue.com/api/match/20"
        t1 = int(time.time() * 1000)
        sign = get_sign(page, t1)
        params = {
            "page": page,
            "sign": sign,
            "t": t1,
        }
        res = requests.get(
            api, params=params, headers=yuanrenxue_headers
        )
        result = res.json()["data"]
        print(result)
        total += sum(d['value'] for d in result)
    print(total)

if __name__ == "__main__":
    main()

运行结果:

在这里插入图片描述

过关!

image.png

参考链接:

猿人学第20题(题目会不定时更新)_久见Bug了的博客-CSDN博客_猿人学

【JavaScript 逆向】猿人学 web 第二十题:新年挑战_Yy_Rose的博客-CSDN博客

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`make_a_snapshot`是pyecharts中的一个函数,用于生成图表的静态图片。如果您想在pyecharts中使用`make_a_snapshot`函数,需要先安装pyecharts库。可以使用以下命令进行安装: ``` pip install pyecharts ``` 安装完成后,您可以使用以下代码生成静态图片: ```python from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.render import make_a_snapshot from snapshot_selenium import snapshot # 创建柱状图 bar = ( Bar() .add_xaxis(["A", "B", "C", "D", "E"]) .add_yaxis("series", [5, 20, 36, 10, 75]) .set_global_opts(title_opts=opts.TitleOpts(title="Bar Chart")) ) # 生成静态图片 make_a_snapshot(snapshot, bar.render(), "bar.png") ``` 在上述代码中,我们首先创建了一个柱状图,并将其渲染为HTML文件。然后使用`make_a_snapshot`函数将HTML文件转换为静态图片,并将其保存为`bar.png`文件。需要注意的是,`make_a_snapshot`函数需要使用`snapshot_selenium`库提供的`snapshot`函数作为参数,该函数用于截取HTML文件的静态图片。因此,在运行上述代码前,您需要先安装`snapshot_selenium`库: ``` pip install snapshot_selenium ``` 另外需要注意的是,`make_a_snapshot`函数需要使用浏览器驱动,因此您需要确保已经安装了浏览器驱动,并将其添加到环境变量中。如果您使用的是Chrome浏览器,可以到以下链接下载相应版本的Chrome驱动:https://sites.google.com/a/chromium.org/chromedriver/downloads。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值