wasm逆向

BHC-Calc

暑假复现之路漫漫。。

关于wasm

https://github.com/WebAssembly/wabt这里的工具可以把wasm转成c代码

关于wasm逆向的一篇很好的帖子

调试wasm

1
2
3
在.wasm文件下打开命令行输入:
python -m http.server 8000
搭建本地服务器

chrome输入地址 http://localhost:8000/calc.html 即可运行wasm程序

f12控制台可以下断点调试

1.png

本题解法

首先通过上面的方法得到c代码和优化后的.o文件(上面帖子里有方法)

把html调起来,会发现,click checking!先是调用了一个check_input()函数,接着里面调用Module.ccall()

2

接着步入,调用了一个h函数(.c里和IDA反编译.o里的w2c_h函数)

IDA里的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
_BOOL8 __fastcall w2c_h(unsigned int a1)
{
unsigned int v1; // eax
int v3; // [rsp+Ch] [rbp-14h]
unsigned int v4; // [rsp+10h] [rbp-10h]

if ( ++wasm_rt_call_stack_depth > 0x1F4u )
wasm_rt_trap(7LL);
w2c_g0 -= 128;
v4 = w2c_g0;
w2c_f81(a1, w2c_g0);
v3 = memcmp(v4); //这里是静态分析函数内容看出来的,就是一个类似memcmp的作用
if ( v3 )
v1 = 1085; //"Oops....something wrong"的偏移地址
else
v1 = 1077; //"Success"
w2c_f29(v1); //这个函数起 输出该处字符串的作用
w2c_g0 = v4 + 128;
--wasm_rt_call_stack_depth;
return v3 == 0;
}

解释一下,成功和失败的字符串都在data_segment_data_0里面,calc.c里有这么一句LOAD_DATA(w2c_e, 1024u, data_segment_data_0, 641);意思是把data_segment_data_0里的内容载入w2c_e+1024

3

这里计算1024+61刚好就是1085,也就是”Oops….something wrong”的偏移

再就是这里有一串奇怪的16进制编码:0x77678b0f3e6cf6e263e6fe3a4c39f3多半和flag脱不了干系

这里往后我就有点没分析出来了,T神用改输入观察结果的方法找规律发现是0x80进制的算法变换

套用这个结论写exp

1
2
3
4
5
6
7
8
text = 0x77678b0f3e6cf6e263e6fe3a4c39f3
f = ''
while text>0x80:
f = chr(text % 0x80) + f
text //= 0x80
print(chr(text) + f)

#flag{w3bass3mb1y_cR0ss}

Comments