0%

Wasm-由一道CTF题初探

0. wasm

​ WebAssembly是一种新的适合于编译到Web的,可移植的,大小和加载时间高效的格式,是一种新的字节码格式。它的缩写是”.wasm”,.wasm 为文件名后缀,是一种新的底层安全的“二进制”语法。它被定义为“精简、加载时间短的格式和执行模型”,并且被设计为Web 多编程语言目标文件格式。 这意味着浏览器端的性能会得到极大提升,它也使得我们能够实现一个底层构建模块的集合。

1. 解题思路

用开发者工具dump出wasm文件,右键->save as:

image-20210330103137550
图1 dump出wat文件

然后使用https://webassembly.studio/ 来反编译wat文件,创建一个empty wat project:

image-20210330103448519
图2 创建wat project

然后将main.wat的内容替换成dump出的内容:

image-20210330103627749
图3 替换wat文件

但是我发现dump出的内容是经过base64编码的,所以首先得解码:

image-20210330110051295

图4 解码asm文件

查看解码后的文件内容,以“.asm”开头,这个是二进制文件:

image-20210330110222972
图5 wasm二进制文件

然后再想办法找一下wasm转wat的工具,ubuntu好像有命令wasm2wat可以转,但我搜索的时候,直接就出来了一个在线转换的网站,于是就用了,https://webassembly.github.io/wabt/demo/wasm2wat/

image-20210330110457615
图6 wasm2wat

这个就和在开发者工具中看到的一样了,不知道为啥dump出来的不能就是这个text format。

替换上面main.wat中的内容:

image-20210330110723736
图7 替换main.wat

尝试build的时候发现不太正常,看到下面的提示说修改main.wat的内容被忽略了,需要点一下右上角的save:

image-20210330111033094
图 8 build过程

备注:留下的坑吧,没有填上,但在月赛的时候出了一道简单的wasm的题,https://github.com/spwpun/wasm_chall, 解题思路就是下载wasm文件,然后通过wasm的开发套件wabt环境去反编译,做逆向或者pwn。