wasm逆向——(极客大挑战2021wasm

 WebAssembly是一种全新的Web编程语言,但是与JavaScript不同,它不是一种让你直接手动编写的语言,而是C / C ++,Rust,C#和TypeScript等不断增加的上层语言的编译目标。

wasm是基于堆栈的虚拟机的二进制指令格式

wabt包安装

尝试了gitclone的方法,一直没安装成功,尝试:

sudo apt install wabt

我的环境:ubuntu20.4

WABT(我们将其称为“ wabbit”)是用于WebAssembly的一套工具,包括:

  • wat2wasm:从WebAssembly文本格式转换为 WebAssembly二进制格式
  • wasm2wat wat2wasm的逆函数,从二进制格式转换回文本格式(也称为.wat)
  • wasm-objdump:显示有关wasm二进制文件的信息。与objdump类似。
  • wasm-interp:使用基于堆栈的解释器解码并运行WebAssembly二进制文件
  • wasm-decompile:将wasm二进制文件反编译为可读的类似C的语法。
  • wat- desugar:解析规范解释程序支持的.wat文本格式(S表达式,平面语法或混合格式)并打印“规范”平面格式
  • wasm2c:将WebAssembly二进制文件转换为C源代码和标头
  • wasm-strip:删除WebAssembly二进制文件的部分
  • wasm-validate:验证WebAssembly二进制格式的文件
  • wast2json:将wasm spec测试格式的文件转换为JSON文件和关联的wasm二进制文件
  • wasm-opcodecnt:计算指令的操作码使用量
  • spectest-interp:读取Spectest JSON文件,然后在解释器中运行其测

 

 打开压缩包,是三个这个文件

1. 静态分析:

 ①反汇编:

wasm2wat xorwasm.wasm -o xorwasm.wat

 把wasm文件转换成webassmebly文件。

②反编译:

wasm2c xorwasm.wasm -o xorwasm.c

但是这样得到的.c代码与wasm的汇编代码没有什么区别,只是省略了⼀些出⼊栈的操作

③重新编译后⽤ida反编译进⾏优化:

之前我们得到的.c⽂件也是⽆法分析的,我们可以⽤gcc 编译.c⽂件,然后⽤ IDA 分析输出⽂件

⾸先我们要先将wabt/wasm2c⽂件夹下的wasm-rt.h和wasm-rt-impl.h头⽂件移动到我们反编译出来的.c和.h⽂件夹下

⽤gcc编译,直接gcc wasm.c会报错,因为很多wasm的函数没有具体的实现。但是我们可以只编译不链接,我们关⼼的只是程序 本⾝的逻辑,不需要真正编译出能运⾏的elf来

gcc -c xorwasm.c -o xorwasm.o

由于我没有使用clone我是去官网 上拷贝下wasm-rt.h和wasm-rt-impl.h到虚拟机中再执行

得到 xorwasm.o,放入64位IDApro

④关键函数分析:

 if函数判断栈内空间,我们来看一下f11函数

几点特殊说明:f**函数一般是基本函数,print,scanf,strlen之类的

根据第一个参数猜测功能 0x400的偏移都对应常量开头,第一个参数的值减去0x400,再加上下面的基地址,就是函数所用的常量

 下面我们加载看一下加密函数f10.

 

 很简单写脚本

a=[0x35, 0x3F, 0x25, 0x1D, 0x11, 0x07, 0x15, 0x0B, 0x39, 0x2F,
  0x15, 0x39, 0x35, 0x56, 0x39, 0x21, 0x09, 0x56, 0x02, 0x47,
  0x47, 0x1B]
for i in range(len(a)):
  print(chr(a[i]^ord('f')),end='')

flag:SYC{wasm_Is_S0_Go0d!!}

总结:wasm逆向第一次接触,主要是看懂函数。。。

二:动态调试

我使用的是windos自带的msedge浏览器.

双击.html文件毫无收获 

 这样是没有正确运⾏起来的,⾸先要在对应⽂件夹开⼀个简易服务器,才能正确的运⾏ ⾸先cd进对应⽬录 然后使⽤python创建⼀个简易的本地局域⽹

python -m http.server -b localhost

之后便可以直接⽤浏览器访问: 

http://localhost:800
0/xorwasm.html

 

 提示输入flag,随机输入

可以看⻅验证失败 接下来我们逐渐跟进去进⾏调试 F12打开调试器 打开wasm文件

 ctrl+f 查找main函数

点击地址栏下好我们的断点

然后刷新,可以看⻅被断下

F8执⾏(等价于IDA的F9),F10单步步过,F11单步步⼊ 然后跟进func11直到要求我们输⼊flag 查看内存的⽅法

 点击memory右上角的图标

 输入要想查询的值

执行完func96屏幕出现

 

 猜测为输出函数

执行到func17 查询1084的值

 

为%猜测是输入函数。

 

这⾥判断我们输⼊的字符串的⻓度,然后将⻓度存放到了var22中 

 判断长度是否等于二十二不等于执行这个

我们再次输入一个22长度的

跟进f10

 

发现关键异或,就是将我们输⼊的字符串取出和const 102进⾏异或之后再存放回去 加密之后返回 

 跟进到f9

var2存放的是我们的⽐较数据的地址 将⽐较数据取出写出解题脚本即可 

 

a=[0x35, 0x3F, 0x25, 0x1D, 0x11, 0x07, 0x15, 0x0B, 0x39, 0x2F,
  0x15, 0x39, 0x35, 0x56, 0x39, 0x21, 0x09, 0x56, 0x02, 0x47,
  0x47, 0x1B]
for i in range(len(a)):
  print(chr(a[i]^ord('f')),end='')

flag:SYC{wasm_Is_S0_Go0d!!}

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值