浅谈wasm逆向

wasm初识

WASM 是 WebAssembly 的缩写,是一种低级的类汇编语言,旨在为 Web 浏览器提供高效、可移植的执行环境。它被设计为一种高性能的编译目标,允许开发者使用多种编程语言(如 C、C++、Rust 等)编写代码,然后将其编译为 WASM,在浏览器或支持 WebAssembly 的运行时(如 Node.js)中运行。

wasm逆向

案例网站:https://spa14.scrape.center/

加密参数确定


我们发现这个是sign值可能是加密的,再次翻页发现sign值不一样了

看下调用堆栈

是异步站跟的时候要细心点

发现sign出现了

1
2
var n = (this.page - 1) * this.limit
e = this.$wasm.asm.encrypt(n, parseInt(Math.round((new Date).getTime() / 1e3).toString()));

我们发现n值是页数-1和每页条数的乘积,e值是调用wasm的encrypt方法生成的
进入wasm里寻找encrypt方法

发现代码的颗粒度很大,这是汇编语言的特点之一由于我选的例子相对来说简单点,所以看起来比较清晰,实际上是比较复杂的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(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
)
$encrypt是函数export是导出的函数encrypt的参数是两个i32类型,返回值是i32类型。
local.get $var0 获取第一个参数
local.get $var1 获取第二个参数
i32.const 3 定义一个常量3
i32.div_s 对第二个参数进行除法运算
i32.add 将第一个参数和除法运算的结果相加
i32.const 16358 定义一个常量16358
i32.add 将相加的结果和16358相加

js算法还原

1
2
3
 function encrypt(var0, var1) {
return var0 + Math.floor(var1 / 3) + 16358;
}

总结

wasm逆向的难度在于汇编语言的阅读和理解,需要一定的汇编基础和耐心
还是要熟悉汇编语言,才能更好的理解wasm代码
理解栈的工作原理(栈是先进后出),栈顶操作
下期我讲下ida来理解汇编语言