ARM 指令集包含了许多特性(例如 Thumb 指令模式切换、内联数据等),给反汇编带来了许多新的难题。今天我们推荐一篇被 IEEE S&P 2023 预录取的论文——D-ARM: Disassembling ARM Binaries by Lightweight Superset Instruction Interpretation and Graph Modeling,在这篇论文中,来自普渡大学和滑铁卢大学的研究人员为大家介绍了一种基于抽象解释的 ARM32 指令集反汇编技术。
以下图中 bzip2 源代码在编译后得到的 ARM32 代码为例,在 0x2dc24 处包含了 A32 和 T32 两种指令模式的切换,且在 0x2dc20 处包含了数据内联。如果采用传统的线性扫描法或是递归下降法,都会产生误报和漏报;而如果采用后验概率+指令超集的方法(P-Disasm),则发现其某一处的模式识别错误会产生“雪崩”式的误导效果,且容易导致内存爆炸;而如果采用基于迁移学习的方法(XDA),则难以避免一些基于机器学习的方法的通病:模型难以解释,忽略了语义信息。
基于上述考虑,D-ARM
在指令超集的基础上,学习内存相关指令的语义信息,将反汇编问题规约为图论中经典的 NP-Hard 问题 MWIS(最大权重独立集)。D-ARM
的整体工作流程如下图所示,分为两个阶段:
在第一阶段,D-ARM
对 ARM 指令集(包括 A32 和 T32 两种模式)在自定义的抽象域上进行了建模,形成了如下图所示的语言模型:
在解释指令时,D-ARM
对指令执行过程中的具体值和执行过程的关键寄存器进行了符号化处理,映射到了抽象域上,并定义了抽象指令的语义模型(如下图所示)。但和传统抽象解释不同的是,D-ARM
不会刻意追求分析的 soundness,而是尽可能多地为后续构建指令超集图提取语义信息。
在本文中,指令超集图如下图所示,其中每个节点为当前地址可能的指令/数据,每条边为节点之间可能(实线)/不可能(虚线)的流向关系。在节点和边的基础上,D-ARM
根据自定义的10类程序语法/语义属性来统计边权重。如果一条指令包含的语义关系越多,则更有可能是一条真实指令,在第二阶段, D-ARM
从而需要尝试找到其中最大权重的子图,并将其作为反汇编的结果。
此外,这样的子图还得满足一定的边约束。如下图所示,D-ARM
巧妙地将可能的流向关系(实线)转化为了不可能的流向关系(虚线) ,从而将此分析规约到了 MWIS 问题,并采用贪心方法求得近似解。
为了评估 D-ARM
的效果,作者提出了4个 Research Question。作者用到的数据集以及编译工具链如下图所示,在 SPEC 数据集的基础上突出了数据内联(Data)和模式切换(Inter)两个特征。
首先,作者评估了 D-ARM
在反汇编精度上的表现。和 Ghidra、IDA 及其他的工具相比,D-ARM
都取得了更好的 F1 Score 表现,尤其是在 Data 和 Inter 两个特殊构造的数据集上,表现得更好。
通过分析不同编译工具链下二进制文件的反汇编结果,也可以验证 D-ARM
的鲁棒性,如下图所示:
D-ARM
的分析效率和诸多商业工具和开源工具相比也不落下风。针对 AOSP 这样的大型真实项目,D-ARM
只需要 650s 就可以反汇编所有二进制文件。
为了验证 D-ARM
第一阶段采用的基于抽象解释的静态分析方法的有效性,作者还进行了对比实验。如下图所示,可以看出不同的指令超集的处理方法中,D-ARM
采用的方法是更好的。
作者还对混淆后二进制代码的反汇编进行了测试(注意本文采用的混淆方式和 O-LLVM 增加代码复杂度不同,而是设法插入垃圾指令来破坏语法信息)。但由于 D-ARM
是基于语义的,所以可以看到其对混淆的抵抗力比其他反汇编方法要强很多。
最后,本文还对二进制重写这一下游应用进行了案例分析,快去戳原文看看吧~
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...