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

posted @ 2020-11-19 15:54  LuoSpider  阅读(1904)  评论(0编辑  收藏  举报