[翻译]WebAssembly的静态手动逆向分析
在我们上一篇关于WebAssembly(Wasm)的博客中,我们初步了解了一个未知的Wasm二进制文件,并对其进行了一些行为分析。今天我们将继续深入研究相同的Wasm样本。我们将通过研究Wasm文本格式手动分析该样本。
为了能够手动分析Wasm文本,我们首先需要学习更多理论。我们之前的博文描述了如何处理内存和数据。在此基础上,我们将介绍一些对逆向Wasm有用的概念,然后应用这些知识来分析Wasm样本。
注意:这篇文章是系列文章的一部分。该系列的上一篇文章介绍了Wasm内存处理,所以可能需要阅读这些文章。
Wasm指令集
正如我们在今年早些时候讨论的那样,Wasm本身不能与外界联系。与外部环境的所有通信都需要通过JavaScript API调用。考虑到这一点,我们现在主要讨论那些Wasm中对实际计算一些有用的指令 ,而不是调用JavaScript的指令。
与x86或x64的指令集相比,Wasm的指令集非常小,有几组不同的功能:
- 算术指令
- 控制流指令
- 内存访问指令
- 比较指令
- 转换指令
以下是常见Wasm指令的几个示例。有关更全面的说明列表,请参阅参考手册。
| 指令 | 描述 |
|---|---|
| get_local <variable> | 获取本地存储中变量的值,将其压入堆栈使其可用于后续指令 |
| set_local <variable> | 设置本地存储中变量的值,从堆栈中弹出值并将该值分配给相关的局部变量 |
| get_global <variable> | 获取全局变量的值 |
| set_global <variable> | 设置全局变量的值 |
| i32.add | 从堆栈中弹出两个数字相加,并将结果压入堆栈 |
| call<func nbr> | 直接调用指定的函数号 |
| call_indirect <var> | 调用函数号在运行时生成的函数 |
| if/else/end | 条件分支 |
| br | 无条件分支 |
| br_if | 条件分支 |
| loop | 定义要循环的代码块 |
| block | 定义一个代码块 |
| return | 函数返回 |
了解文本格式
上面给出是WebAssembly文本格式的说明。由于Wasm是二进制格式,因此这些文本指令将在编译文件中用字节码表示。
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
复制成功
