• 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

  • 相关阅读:
    Python练习题 016:猴子吃桃
    Date() 及其 如何验证用户输入的日期是合法的
    关于事件触发的一个小tips
    KVO监听导航栏
    使用CoreText动态下载更换字体
    UICollectionView 的使用
    echarts散点图搭配时间轴
    使用百度echarts画图表的步骤
    canvas画图中drawImage使用
    html5canvas简单画图
  • 原文地址:https://www.cnblogs.com/luocodes/p/14006078.html
Copyright © 2020-2023  润新知