wasm逆向-真的是web
2019/07/25 wasm Writeup RE Web

拿到题目
ewMcTA.png

给出三个文件

先进行简单运行测试

ewMyeH.png

随意输入

ewM2FI.png

逻辑很清晰

输入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

ewMrOe.png
接着放在wasm2c目录里进行编译

ewM6wd.png

进行gcc编译

gcc -g test.c -o test

发现会报错

因为很多wasm的函数并没有具体实现 因为我们主要目的是为了方便逆向,方便观察逻辑 所以我们只需要编译不做链接

gcc -c test.c -o test

生成了test文件 接着我们拖进ida

ewMSII.png

 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}

请杯咖啡呗~
支付宝
微信
本文作者:ios
版权声明:本文首发于ios的博客,转载请注明出处!