[原创] 崔大Scrape十四题, 入门级wasm加密分析

查看 91|回复 9
作者:ZenoMiao   
本次分析的地址为: aHR0cHM6Ly9zcGExNC5zY3JhcGUuY2VudGVyLw==
本题如图所示: 为wasm加密, ajax接口且有时间限制(应该涉及到时间戳)


image.png (28.34 KB, 下载次数: 0)
下载附件
2025-7-10 22:34 上传

开搞!
F12抓包发现sign值应该就是目标值


image.png (53.67 KB, 下载次数: 0)
下载附件
2025-7-10 22:40 上传

通过XHR断点后跟栈轻松可以找到sign加密的位置, 已知是wasm加密所以就不管他了, 先把wasm文件拿下来


image.png (74.51 KB, 下载次数: 0)
下载附件
2025-7-10 22:38 上传

下载下来之后再通过@逍遥一仙 发的一个软件一键转.o文件用IDA进行分析
软件连接: https://www.52pojie.cn/forum.php?mod=viewthread&tid=1438499
打开ida, 点击Go(work on your own) -> File -> Open ->选择刚转下来的wasm.o文件 -> OK


image.png (81.29 KB, 下载次数: 0)
下载附件
2025-7-10 22:47 上传

通过ida左边的Functions window和js的调用找到加密函数(双击)


image.png (196.34 KB, 下载次数: 0)
下载附件
2025-7-10 22:49 上传

然后按F5还原伪C代码, 第一个参数为全局结构体, 注意第二第三个形参和return
第二个形参则是js传进去的n值, 第三个形参则是十三位时间戳除1000后向上取整的值


image.png (24.23 KB, 下载次数: 0)
下载附件
2025-7-10 22:50 上传



image.png (21.63 KB, 下载次数: 0)
下载附件
2025-7-10 22:52 上传

return上面并没有用到变量a3和a2所以函数体内的代码直接忽略了, 直接看return
[C] 纯文本查看 复制代码return a3 / 3 + a2 + 16358;
翻译成中文return的值就是: 十三位时间戳除1000后向上取整 / 3 + n + 16358
ida分析完毕后我们再分析一下在浏览器中wasm源代码
通过之前打的加密e值的断点单步进去可以看到wasm代码


image.png (10.9 KB, 下载次数: 0)
下载附件
2025-7-10 22:55 上传

可以看到他这里有两个参数, 均是int32的类型 变量名为$var0和$var1
[C] 纯文本查看 复制代码
(func $encrypt (;4;) (export "encrypt") (param $var0 i32) (param $var1 i32) (result i32)
    local.get $var0
    local.get $var1
    i32.const 3
    i32.div_s
    i32.add
    i32.const 16358
    i32.add
  )
通过local.get $var0 把第一个形参的值压入堆栈0
通过local.get $var1 把第一个形参的值压入堆栈1
通过i32.const 3 新建一个类型为int32常量为3的值压入堆栈2
i32.div_s为把堆栈按顺序拿出来"计算有符号除法", 先把堆栈2的值"3"拿出来作为除数, 再把$var1的值拿出来作为被除数进行计算.
注意: 堆栈因为前面计算拿出来了两个值, 所以目前堆栈只有一个变量为$var0, 然后前面因为计算后的值需要保存, 所以也被压入栈内, 所以目前栈内有2个值 $var0和除法计算后的值
然后i32.add 是把栈内2个栈拿出来进行相加, 也就是把$var0 和除法计算后的值进行相加, 也就是(时间戳 / 3) + n, 把结果再压入栈内.(目前栈内只有这个相加后的值)
再通过i32.const新建一个类型为int32的局部变量为16358的常量, 再压入栈内 (目前栈内有2个)
再通过i32.add把栈顶的两个值拿出来进行相加. 执行完最后一段代码后result 一个int32类型的值
如下图所示


b02db9bd6b8bd66645a78a919c6f6acc.png (19.57 KB, 下载次数: 0)
下载附件
2025-7-10 23:33 上传

搞完撸py代码
[Python] 纯文本查看 复制代码
import math
import time
# i是页码
n = (i - 1) * 10
sign = math.ceil(time.time() / 3) + n + 16358
以上是所谓的"核心代码"(其实就只有2行有用), 其他的代码自己撸吧, 提高动手能力


image.png (150.23 KB, 下载次数: 0)
下载附件
2025-7-10 23:36 上传

打完收工

下载次数, 堆栈

风子09   

已经收藏,不知道需多少天才能消化
ZenoMiao
OP
  


风子09 发表于 2025-7-11 06:57
已经收藏,不知道需多少天才能消化

主要是他操作堆栈的理解, 代码内容并不难
datoneids   

完全看不懂,不懂就请教:这是在干嘛?
NoSugarLatte   

收藏在说
zhangmingyu   

感谢分享
goodrain   

感谢分享
Shenwei520   

大佬对堆栈的理解出神入化了
Hernnin   

感谢感谢。学习到了!
lanjishu   

感谢,支持一下。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部