UNCTF2020-WEB:俄罗斯方块(wasm反编译)
wasm(WebAssembly )
打开页面是一个俄罗斯方块的游戏。F12发现了提示,猜测要打到一定分数才能获取到flag
观察得知这是一个wasm的游戏,F12下载wasm文件
linux下安装wabt
$ git clone --recursive https://github.com/WebAssembly/wabt cd wabt mkdir build cd build cmake ..
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文件,然后在解释器中运行其测试
使用WABT将wasm文件转换为文本格式
root@xxx:~/opt/wabt/build$ ./wasm2wat /home/xxx/temp/blocks.wasm -o /home/xxx/temp/test.wat
查找99999,发现了这个,更改数值即可
修改完成后使用WABT将文件
root@xxx:~/opt/wabt/build$ ./wat2wasm /home/xxx/temp/blocks.wat -o /home/xxx/temp/blocks.wasm
搭建服务器,复制题目原来的页面,替换修改后的wasm运行游戏即可得到一个网址,访问后得到flag
注意:原题页面会报错,修改后的页面代码
<html> <script src="encoding.min.js"></script> <script src="wasm_exec.js"></script> <script src="pako_inflate.min.js"></script> <script> window.addEventListener('DOMContentLoaded', async () => { const go = new Go(); const name ="blocks"; const curWwwPath=window.document.location.href; const pathName=window.document.location.pathname; const pos=curWwwPath.indexOf(pathName); const localhostPath=curWwwPath.substring(0,pos); let url = `${localhostPath}/${name}.wasm.gz`; // 'await import' doesn't work on the old Edge browser: // await import('/scripts/pako_inflate.min.js'); let wasm = pako.ungzip(await (await fetch(url)).arrayBuffer()); // A fetched response might be decompressed twice on Firefox. // See https://bugzilla.mozilla.org/show_bug.cgi?id=610679 if (wasm[0] === 0x1f && wasm[1] === 0x8b) { wasm = pako.ungzip(wasm); } const result = await WebAssembly.instantiate(wasm, go.importObject).catch((err) => { console.error(err); }); go.run(result.instance); }); </script> </script> </html>
参考wasm逆向分析:https://www.cnblogs.com/Mayfly-nymph/p/12974921.html