1625-5 王子昂 总结《2017年12月29日》 【连续第455天总结】
A. 34c3ctf - wasm
B.
搜索一下题目,得到WebAssembly的关键词
WebAssembly 主要试图解决现有技术的一些问题:
JavaScript:性能不够理想,以及语言本身的一堆坑(这个大家都懂)
Flash:私有技术(而且漏洞一堆),并且是纯二进制格式
Silverlight:私有技术,并且是纯二进制格式
各种插件(Plug-in):安全性问题,平台兼容问题
由于js作为编译型语言的种种缺陷,浏览器厂商大佬们决定联合起来成为偶像制定一个新的快速好用的标准
就是WebAssembly
它可以将任意语言编译成二进制的中间字节码,然后在浏览器中执行
简单来说,C/C++写网页不是梦233
于是从开发者工具中下载到了flag.wasm
现阶段的WebAssembly还需要一个js文件做中间衔接来调用,可以看出来是调用了wasm中的check函数
官方提供了将wasm反汇编的工具wasm2wat
wat就是对人可读的代码了,虽然读起来仍然跟汇编一样晦涩麻烦
锁定到check函数以后发现有800行OTZ
这一行一行看下去不是要人命嘛
查了一下发现在Chrome中可以动态调试,下断重新载入发现OK
但是这个调试器很菜……虽然能看到各个变量和内存的值,但是极其不方便
比如说上图arg0的值是一个指针,该地址中保存着input字符串
然而要看指针的值的话,需要在这个列表中慢慢翻找
而且查看类型和宽度都支持十进制/字节
汇编代码中频繁对指针进行了操作,指针的值看起来太麻烦了,控制台里也没找到输出的办法…OTZ
随便试了两下,发现它还有调用别的函数,这个就很要命了=A=
于是现在只剩下两条路
写反汇编器,将800行wat转成伪代码来读
动态调试,耐心慢慢跟
反汇编器大概有一点思路,因为wat是栈型的代码,调用的指令都是直接对栈操作,而没有源操作数和目的操作数,这样执行和识别起来更快捷,反编译的话感觉也会比较方便吧
因为得到的wat是S表达式型的代码,因此只需要按照括号来将指令也放入一个栈中,然后依次取出执行,执行的时候提供模拟的内存区和栈区即可
主要难点是代码块的区分和之间跳转的指令,例如while/if等等,这些我本身对编译的认识就不够,更别说wat中不熟悉的block等指令了
明后天进行尝试-0-希望平台不要关的太快吧~
C. 明日计划
反编译器/动态调试wasm