一步步学习Webassembly逆向分析方法

在强网杯2019线上赛的题目中,有一道名为Webassembly的wasm类型题,作为CTF新人,完全没有接触过wasm汇编语言,对该类型无从下手,查阅相关资料后才算入门,现将Webassembly的静态分析和动态调试的方法及过程整理如下,希望能够对于CTF萌新带来帮助,同时如有大佬光顾发现错误,欢迎拍砖予以斧正。

处理wasm文件

在逆向wasm的过程中,由于其执行的是以栈式机器定义的虚拟机的二进制指令格式,因此直接进行逆向分析难度较大,需要对wasm文件进行处理,增强可操作性,提高逆向的效率。在此参考了《一种Wasm逆向静态分析方法》一文,主要利用了WABT(The WebAssembly Binary Toolkit)工具箱实现。

一种Wasm逆向静态分析方法

前言

WebAssembly(缩写为Wasm)是基于堆栈的虚拟机的二进制指令格式。Wasm被设计为可编程C/ C ++ /Rust等高级语言的可移植目标,可在Web上部署客户端和服务器应用程序。

随着wasm的逐渐流行,在最近的ctf比赛中出现了很多wasm类型的逆向题。没接触过wasm的人会比较苦手。即使对wasm有一定的了解,由于wasm的汇编语言可读性十分差,逆向起来会非常的痛苦。本文以刚刚结束的defconquals中的一道题和其他一些题为例,介绍一种wasm的优化分析方法,初步探究wasm逆向。

用idawasm IDA Pro逆向WebAssembly模块

简介

本文介绍idawasm,为WebAssembly提供加载器和处理器的IDA Pro插件。Idawasm可以允许在所有支持IDA Pro的操作系统上,下载地址为https://www.github.com/fireeye/idawasm

去年的Flare-On challenge大赛上出现了一个新的文件格式:WebAssembly (“wasm”) 模块。因此,需要逆向基于WebAssembly栈的虚拟机中二进制文件中包括的关键逻辑。那么首先就要了解一下wasm:

WebAssembly实践

前言

JavaScript 最初被设计出来的时候,作者一定想不到 Web 会发展到今天的规模。随着前端技术发展,浏览器端应用越来越复杂,JavaScript的性能问题逐渐突出。Chrome的 V8 引擎对 JavaScript 预编译速度做了极大提升,但这还不够。因为 JavaScript的动态类型特性,始终无法回避类型推断。要进一步提高 Web端应用的性能,开发者向其它方向做出了努力,那就是向强类型靠近,彻底避免类型推断。前有Mozilla 的 asm.js,后有 Google 的NaCl,今有四大浏览器(Chrome/Firefox/Edge/Safari)厂商联手推出的 WebAssembly。自2017年11月四大浏览器开始全面支持 WebAssembly以来,WebAssembly 获得了广泛应用和更多关注。酷家乐几何中间件团队对WebAssembly 进行了一些实验,得到一些很有实践意义的结论。

本文重点讨论如何实践,过于细节的机制和原理等内容不在本文讨论范围内。如想了解更多细节,请关注几何中间件团队的WebAssembly 后续文章,或查阅文末给出的参考文献。