欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[翻译]WebAssembly的静态手动逆向分析

[翻译]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。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功