内容纲要

WebAssembly

一种可以由JavaScript调用,并与html交互的二进制指令格式文件。

img

静态调试

./wasm2c ./xxx.wasm -o xxx.c    #wasm转c
gcc -c webassembly.c -o webassembly.o   #将.c文件转为.o文件(要将它的.h还有wasm下的wasm-rt.h,wasm-rt-impl.c,wasm-rt-impl.h文件放在一块

拖入ida

动态调试

在html和wasm所在的目录下打开powershell,输入:

python -m http.server 8888

然后在浏览器输入http://127.0.0.1:8888/xxxxxx.html,点击WASM debuger插件工具,按下Ctrl+Shift+J 打开开发人员工具并转到控制台。

下断点刷新动调,F8,F9,F10,F11。

例题

i32_load形式的函数为取值函数,第一个参数为取值对象,第二个参数为偏移
i32_store形式的函数为操作存储函数,第一个参数为存储对象,第二个参数为存储位置,第三个参数为操作方式

image-20210505011601493

在calc.html的check_input下断点,动调后发现,会调用calc.js的ccall函数

image-20210505012152283

image-20210505012232018

接着往下走

image-20210505012542330

……醉了 真是要了解各个语言……这里竟然是调用了wasm里的h函数,js竟然可以这么写吗……(还有ident的不含”_“前缀也是蛮骚的……)

一路动调

image-20210505020618975

image-20210505021040880

image-20210505021205511

image-20210505021530005

image-20210505021732494

第二次输出

image-20210505020629448

image-20210505020700588

image-20210505023115957

发现两次输出都调用了同一个函数,也就是func29是用来输出字符的

鉴于我之前在wasm转c里看到了一堆十六进制数组,所以去搜了一下

image-20210505023553406

image-20210505023824155

看一下这都是啥

image-20210505024726992

这个开头总感觉很重要

再来找找调用的地方

image-20210505032159619

ida里找initmemory

image-20210505032147776

image-20210505032307841

这样看得更清楚

由于29前的45有点可疑,去ida看,这根本看不出来啥(wp说动调看出是判断结果……我直接???orz)

45动调下来发现var2的值在过程中会变(唯一会变的)

(然后就是wp的骚操作了……用cheat engine来看数值……orz)

经过多个数值的比较得到是0x80进制……

image-20210505035627747

image-20210505035638861

————————————————————————————————————————————

附上牛逼的wp……

2a089fc8962b6670

697f92f3cd91abe9