二进制代码漏洞特征提取:反汇编vs反编译? 您所在的位置:网站首页 gcc编译程序被杀掉了 二进制代码漏洞特征提取:反汇编vs反编译?

二进制代码漏洞特征提取:反汇编vs反编译?

2023-06-08 02:14| 来源: 网络整理| 查看: 265

      二进制代码本身由“0”和“1”组成,这些字符很难被人理解,并且包含的语义信息较低。因此,二进制程序的漏洞检测通常基于对二进制代码进行反汇编得到的汇编代码来提取语法、语义、结构等特征。然而,由于编译的多样性,二进制程序会产生很大的变化,这使得汇编代码差异较大。例如,如图1所示,用GCC O1和GCC O3编译示例程序(来自于SARD中的CWE122_Heap_Based_Buffer_Overflow__cpp_CWE193_char_cpy_44.cpp),然后通过IDA Pro反汇编得到汇编代码。基于反汇编的结果可以发现:

第一,这两种汇编代码的结构存在差异。例如,O1中的35-38行是一个新的基本块。 第二,指令的顺序改变了。例如,O1中的第11、17、27和30行vs. O3中的第7、22、32和26行。 第三,存在添加、删除和替换一些指令。例如,O1中的第16、18、24和25行vs. O3中的第18、17、27和28行。

    众所周知,漏洞的原因通常只与少数几条指令有关。但是,这种编译的多样性会影响指令的更改,使得基于汇编代码提取更健壮的漏洞特征变得困难。

图1 一个通过不同优化级别编译的二进制文件反汇编得到的汇编代码比较的示例

图2 一个通过不同优化级别编译的二进制文件反编译得到的伪代码比较的示例

      当前的反编译技术得到了迅速的发展。有许多优秀的反编译工具,如IDA。此外,反编译技术还被用于静态二进制代码分析的各个领域。如图2所示是利用IDA反编译代码的示例。虽然反编译不同优化级别的二进制文件获得的伪代码之间存在差异,如变量名更改(O1中的v3和v4 vs. O3中的v2和v3)和删除语句(O1中的12和14行)。然而,这种差异只有较少的语句被影响,这些影响可以被缓解。与图1中的汇编代码相比,伪代码受编译多样性的影响更小。

      现在有许多可用的反编译工具,如IDA Pro和Ghidra。然而,并不是所有反编译器反编译的伪代码都是有用的,因为所获得的伪代码的质量是不同的。在同样的二进制程序中评估了IDA Pro, Ghidra , RetDec和Radare2 等四款反编译器,并使用图3显示其中一个反编译伪代码的示例。可以从反编译的结果中总结出以下的发现:

第一,RetDec在恢复函数原型和参数时存在很多错误。例如,在图3中RetDec错误地反编译函数CWE126...look_01_bad为函数CWE126...look_01_bad和函数。 第二,Radare2在恢复高级语义(如变量、数据结构和控制流)方面非常差。例如,在图3中Radare2恢复的变量和操作仍然类似于汇编代码。 第三、IDA Pro和Ghidra反编译伪代码在恢复高级语义方面有一定优势,而且可读性也较高。 第四,有研究者调查发现IDA Pro在恢复函数边界和恢复指令方面比Ghidra高出约2%。此外,也有研究者重用了开发良好的编译器测试技术EMI测试,指出Ghidra比IDA Pro的反编译缺陷高2.55倍。

      从反编译的角度来讲,商业化的IDA相比其它开源的软件还是有不少优势。而且当前还存在很多利用机器学习的方法来进一步提升反编译代码的质量,当进一步利用这些技术时,获得的伪代码将更加准确,也更有利于后续的分析任务。

图3 不同反编译器得到的伪代码的示例

      总体而言,反编译伪代码在高级语义结构信息方面相比汇编代码和中间表示具有优势。例如,反编译可以重构控制结构,如不同类型的循环和分支结构。因此,有可能通过反编译生成程序的合理准确的高级语言表示。此外,分析二进制代码和中间表示的时间和空间复杂性要比分析相应的伪代码的时间和空间复杂性大。因此反编译伪代码被用于二进制程序的安全性分析是一个很有意义的领域。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有