Finding Inlined Functions in Optimized Binaries 阅读笔记

论文名称: Finding Inlined Functions in Optimized Binaries
链接: http://arxiv.org/abs/2103.05221
代码链接: https://zenodo.org/record/4280332#.YG70s2EzaUk
该篇论文旨在通过深度学习的方法,学习二进制文件反编译出的伪代码的特征,从而识别二进制中存在的内联函数,以提高已有反编译工具IDA Pro和Ghidra对高度优化选项下的二进制内联函数的识别。
下图即是Ghidra反编译一段二进制代码后的结果,可以看到Ghidra有效地识别出了strlen, malloc_or_quit 和 strcat 三个函数,但是发生内联的 strcpy 函数却不能有效识别,此篇论文即是以此为出发点,检测编译器优化下二进制代码中内联函数的识别问题。在这里插入图片描述
另外,此前已经有一些文章以及工具旨在检测低优化选项下的内联函数识别问题,但是在高优化选项下,内联函数的识别更加困难,这也是此篇论文研究的重点。
在这里插入图片描述

数据集构建

为了有效地检测高优化选项下的内联,作者首先需要构建一个庞大的数据集,同时需要插入一些高度稳定的标签,以供训练。
在这里插入图片描述
作者首先提出了对数据集的几点要求:大规模,多样的数据,可重现的编译,已经稳定的标签。其中前两项是通过大量收集持续开发,使用Travis且可以使用docker进行构建的项目,然后通过改进BUGSWARM来增加对C类型项目的处理能力,从而构建数据集的。
而对于插入一个稳定的标签,这里主要有两点要求:1. 标签的存在必须能够抵制优化选项而不发生变化; 2.在对二进制进行反编译时标签也要能够被反编译器识别出来。更为细致地来讲,这个插入的标签已不能影响到正常的编译和反编译过程,二不能和正常编译出来的二进制有太大的差异,否则如果在标签情况下和非标签情况下产生的反编译出的伪代码差异太大的,将无法正确确定训练的标签,最后也不能受到编译选项的影响。(这一部分似乎有些重复 😦)
而其实对于标签来讲最容易出现的问题就是,如果这段代码在其他地方没有调用,编译器将会直接去除这段代码。如插入char *marker1 = "function_inlined: printf()";,但是并没有在别的地方引用。
作者也尝试了几个命令,比如printf,puts,然而这些命令都或多或少会影响到最终二进制的生成,最终还是选择创建了一个全局字符串数组,而在每个函数调用的下面对它进行赋值。这种方法既可避免对二进制产生影响,又能记录每一次的函数调用。并且对于每一个文件都会创建一个单独可区分的数组,以防编译过程中将多个数组合并。
在这里插入图片描述
此外,因为这种标记的方法其实标记出了所有函数调用,在这里面需要把Ghidra正确识别的内联函数却去掉,最终只保留未能识别的内联函数部分。
值得注意的是,作者在构建数据集的时候需要要求源文件和二进制文件必须是一对一,而其实很多项目编译过程中会将多个源文件集合到一起,从而导致对于二进制反编译出的伪代码和源文件无法对应,无法作为论文中有监督训练时的数据集进行使用。

方法设计

在这里插入图片描述
为了弥补有标签数据集较小的问题,作者首先使用基于BERT的预训练模型MLM(masked language models (MLM))在无标签数据集上进行训练,得到伪代码token的预训练表示。另外,为了确定滑动窗口的大小(因为内联函数行数不定),作者进行了一个简单的测试,发现在标签上下10行的效果最佳。
在这里插入图片描述
此外,作者还提出了两种可用的模型,即Roberta-base和Transformer,实验过后也发现前者效果更佳。
作者在模型训练中还做了一系列,像是 合并连续的标签 和 处理数据不平衡问题, 此处就不再一一赘述。

实验结果

在这里插入图片描述
这里值得注意的是,反编译文件其实大部分代码都是没有发生内联,而这一部分的正确检测结果(TN)并未统计在precision中,导致其准确从90%降到了60%。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值