本文翻译自:https://www.fireeye.com/blog/threat-research/2018/10/reverse-engineering-webassembly-modules-using-the-idawasm-ida-pro-plugin.html


简介

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

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

WASM ,全称WebAssembly,是一种可以使用非 Java 编程语言编写代码并且能在浏览器上运行的技术方案,也是自 Web 诞生以来首个 Java 原生替代方案。

WebAssembly虽然是一种新的标准,但也有一些分析工具:

但这些工具都不常用也不熟悉。如果可以在IDA Pro中分析.wasm文件,就可以更好地应对通过WebAssembly传播的恶意软件。

idawasm IDA Pro插件是一个加载器和处理器模块,有了该模块分析师可以用熟悉的接口来检查WebAssembly模块。

idawasm

安装完idawasm后,就可以在IDA Pro中加载.wasm文件。Load a new file对话框表示加载器模块识别出了WebAssembly模块。目前,该插件支持WebAssembly的MVP (version 1)版本。

图1: IDA Pro加载WebAssembly模块

然后处理器模块会重构控制流,并启用IDA的graph mode。这就很容易识别高级的控制重构,比如if和while。

图2: WebAssembly指令的控制流图

除了控制流,处理器模块还会用嵌入在.wasm文件中的元数据对函数名和类型进行语法分析。还可以提取出全局变量的交叉引用,分析师就可以列出交叉引用并找出操作了特定值的代码。因此,所有的idawasm分析的元素都可以交互性地重命名和注释。最后,可以把关于WebAssembly恶意软件样本的知识记录到.idb文件中,并与其他分析师分享。

图3就是分析师重命名了局部变量并加入注释来解释函数帧在函数开始时是如何被操作的。

图3: IDA Pro中WebAssembly的注释

idawasm处理器检测到LLVM编译的WebAssembly模块后,就会开始分析。LLVM用WebAssembly说明中提供的原语来在全局内存中实现函数栈帧(stack frame)。函数开始执行时,前几条指令会在全局栈中分配帧(frame),然后再返回前清除。idawasm会自动找出全局帧栈指针的引用并重构每个函数的帧布局。通过这些信息,处理器会更新IDA的栈帧结构,并再这些结构中将偏移量标为immediate constant。这意味着更多的指令操作数实际上是可以注释和重命名的符号(标记),如图4所示。

图4: 自动重构函数帧

WebAssembly编译器会略去引用Single Static Assignment (SSA)形式中的变量的指令。这对浏览器引擎来说是有好处的,因为SSA形式中的代码更容易输入到分析系统中。使用SSA形式是因为最简单的函数也有几十到几百的本地变量。

但对分析师来说,SSA形式很难分析。因此,idawasm中含有一个WebAssembly模拟器可以追踪符号级(symbolic level)的指令。这可以使分析师将一个简单但相关联的指令序列拆分为一个复杂表达式。

还需要在一个单一的基本区块中选择指令区,并运行wasm_emu.py脚本。脚本会模拟指令、简化效果、渲染全局变量、本地变量、内存和栈的效果。图5是函数被简化为一个全局变量更新:

图5: wasm_emu.py表达函数帧分配的效果

当有许多算术运算时,wasm_emu.py会简化为一个表达式。比如图6就是32个指令通过2个输入字节变成XOR的过程:

图6: wasm_emu.py将多个简单指令简化为一个复杂指令

结论

idawasm是通过加载器和处理器支持WebAssembly模块的IDA Pro插件。因此,分析师用一个熟悉的接口来逆向.wasm文件wasm_emu.py可以帮助理解WebAssembly指令流的效果。现在处理这种新的文件格式和架构就容易多了。


源链接

Hacking more

...