拿到题目
给出三个文件
先进行简单运行测试
随意输入
逻辑很清晰
输入flag、 验证、返回是否正确
当然核心逻辑一定在test.wasm文件中
先利用wabt中的wasm2c 将wasm文件反编译成c文件
┌─[ios@iosdeMacBook] - [~/wabt/out/clang/Debug] - [四 7 25, 11:01]
└─[$] <git:(master*)> ./wasm2c test.wasm -o test.c
执行完成命令后可以看到文件夹下面生成了一个test.c和一个test.h
接着放在wasm2c目录里进行编译
进行gcc编译
gcc -g test.c -o test
发现会报错
因为很多wasm的函数并没有具体实现 因为我们主要目的是为了方便逆向,方便观察逻辑 所以我们只需要编译不做链接
gcc -c test.c -o test
生成了test文件 接着我们拖进ida
for ( i = 0; i < (unsigned int)f81(v14); ++i )
{
v13 = v14 + i;
v12 = (char)i32_load8_s(*Z_envZ_memory, v14 + i);
if ( (signed int)i % 2 == 0 )
i32_store8((_QWORD *)*Z_envZ_memory, v13, (v12 ^ 0x30) & 0xFF);
else
i32_store8((_QWORD *)*Z_envZ_memory, v13, (v12 ^ 0x25) & 0xFF);
}
注意这段代码
很明显是一段异或操作而且根据循环次数的奇偶做不同的异或。
根据wasm特性 会在底部存储字符串 所以我们可以利用这一特性去查找我们需要的字符串
static const u8 data_segment_data_0[] = {
0x67, 0x4a, 0x47, 0x7a, 0x69, 0x4a, 0x45, 0x7a, 0x42, 0x40, 0x51, 0x49,
0x5c, 0x5c, 0x6f, 0x6e, 0x00, 0x4b, 0x47, 0x7a, 0x67, 0x40, 0x52, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xc0,
0x03, 0x00, 0x00, 0xc0, 0x04, 0x00, 0x00, 0xc0, 0x05, 0x00, 0x00, 0xc0,
0x06, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xc0, 0x08, 0x00, 0x00, 0xc0,
0x09, 0x00, 0x00, 0xc0, 0x0a, 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x00, 0xc0,
0x0c, 0x00, 0x00, 0xc0, 0x0d, 0x00, 0x00, 0xc0, 0x0e, 0x00, 0x00, 0xc0,
0x0f, 0x00, 0x00, 0xc0, 0x10, 0x00, 0x00, 0xc0, 0x11, 0x00, 0x00, 0xc0,
};
这里截取了最前一部分的字符串 因为直接hex可以看到下部字符串为good wrong 而上部无法解析 根据他主逻辑做了异或操作可以猜测 这些不解析的字符串就是加密后的flag
所以我们写出测试exp
a=[0x67, 0x4a, 0x47, 0x7a, 0x69, 0x4a, 0x45, 0x7a, 0x42, 0x40, 0x51, 0x49,
0x5c, 0x5c, 0x6f, 0x6e, 0x00, 0x4b, 0x47, 0x7a, 0x67, 0x40, 0x52,0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xc0,
0x03, 0x00, 0x00, 0xc0, 0x04, 0x00, 0x00, 0xc0, 0x05, 0x00, 0x00, 0xc0,
0x06, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xc0, 0x08, 0x00, 0x00, 0xc0,
0x09, 0x00, 0x00, 0xc0, 0x0a, 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x00, 0xc0,
0x0c, 0x00, 0x00, 0xc0, 0x0d, 0x00, 0x00, 0xc0, 0x0e, 0x00, 0x00, 0xc0,
0x0f, 0x00, 0x00, 0xc0, 0x10, 0x00, 0x00, 0xc0, 0x11, 0x00, 0x00, 0xc0,
0x12, 0x00, 0x00, 0xc0, 0x13, 0x00, 0x00, 0xc0, 0x14, 0x00, 0x00, 0xc0,
0x15, 0x00, 0x00, 0xc0, 0x16, 0x00, 0x00, 0xc0, 0x17, 0x00, 0x00, 0xc0,
0x18, 0x00, 0x00, 0xc0, 0x19, 0x00, 0x00, 0xc0, 0x1a, 0x00, 0x00, 0xc0,
0x1b, 0x00, 0x00, 0xc0, 0x1c, 0x00, 0x00, 0xc0, 0x1d, 0x00, 0x00, 0xc0]
flag=''
i=0
for i in range(0,55):
if i%2==0:
flag+=chr((a[i]^0x30)& 0xFF)
else:
flag+=chr((a[i]^0x25)& 0xFF)
print flag
运行查看结果
└─[$] <> python was.py
Wow_You_really_K0nw_Web%0%0%0%0%2%0?3%0?4%0?5%0?6%0?7
看到有明文字符串 这肯定就是flag了~
加入flag头提交即可
最后flag{Wow_You_really_K0nw_Web}