使用增强CFG的剥离二值神经逆向工程

2020-12-06 04:13:15

这是Nero-GNN的正式实现,该原型描述于:Yaniv David,Uri Alon和Eran Yahav,使用增强控制流图进行剥离二进制的神经逆向工程,将出现在OOPSLA中。 2020年,PDF。

我们的评估数据集和其他资源可在此处(Zenodo)获得。这些将被使用并在下面进一步解释。

GNN神经模型:使用过程表示来训练GNN模型以预测过程名称。

LLVM版本10和llvmlite& llvmcpy python软件包(其他版本可能有效。3.x无效)。

使用Linux的许可IDA-PRO安装,所有这些要求都被验证为可以在Ubuntu 20计算机上运行(甚至在Ubuntu 16上也需要更多的努力)兼容。

对于Ubuntu 20,您可以使用此存储库中的requirements.txt文件来针对本机python3.8版本安装所有python软件包:

IDA-python脚本(在datagen / ida / py2中)已针对与IDA-PRO 6.95捆绑在一起的python 2.7版本进行了测试,并且应与至少7.4以上的较新版本一起使用(更多信息,请参见此处)。如果没有,请提交错误。

还需要安装jsonpickle python软件包以供此捆绑的python版本使用:

请注意,以root用户身份安装时,IDA-PRO默认设置为安装在/opt/ida-6.95/idal64中。其他路径将需要在此处和其他脚本中进行调整。

python3.6。 (对于将同一台Ubuntu 20计算机用于培训和数据生成,我们建议使用virtualenv)

请注意,对于tensorflow-gpu版本1.13及更高版本,需要CUDA> = 10.1。 (有关更多信息,请参见此链接)

我们的二进制数据集是通过将几个GNU源代码包编译成二进制可执行文件并执行彻底的清除和重复数据删除过程(在本文中详细介绍)而创建的。

这些软件包分为三组:培训,验证和测试(每个都在其自己的目录中,该目录位于提取的档案中:培训,验证和测试代表)。

要获得这些二进制文件的预处理表示,您可以下载我们的预处理数据集,或者从我们或任何其他二进制数据集中创建一个新的数据集。

索引,即分析二进制文件并为其创建基于增强控制流图的表示,可以使用以下命令执行:

其中,TRAIN是保存要建立索引的二进制文件的目录,结果放置在TRAIN_INDEXED中。

要成功建立索引,二进制文件必须包含调试信息并遵守以下文件名结构:

请注意,建立索引过程可能要花费几个小时,其某些结果取决于为过程建立索引选择的超时值(由--index-timeout控制,默认值为30分钟)。我们建议在具有多个CPU内核和足够RAM的计算机上运行它。如果提取了1000多个唯一的CFG路径,过程索引也将停止。

这将从TRAIN_INDEXED中过滤并收集索引过程(应该保留索引的二进制文件以便从最后一步进行训练),并将它们存储在train.json中。

这将预处理training(train.json),validation(validation.json)和test(test.json)文件。请注意,此步骤需要TensorFlow和此处提到的其他组件。

提取过程表示档案将创建文件夹procedure_representations,并在其中另外两个文件夹:

raw:以上数据集中所有二进制过程的原始表示形式。每个过程在相关文件中的每一行用一行表示(training.json,validation.json和test.json)。

用于训练模型的文件:data.dict和data.train(相应的字典和预处理的训练集样本)

正如我们在论文中所显示的,Nero-GNN是我们方法的最佳变体,因此我们在此重点介绍。

其中NUM_GNN_LAYERS是GNN层的数量。在本文中,我们发现NUM_GNN_LAYERS = 4的性能最佳。(training)--data和(validation)--test参数的路径可以更改为指向新的数据集。在这里,我们提供了我们使用的数据集在本文中。

我们使用Tesla V100 GPU训练了模型。其他GPU可能需要更改GNN层数或其他暗淡以适合可用的RAM。

此档案库中提供训练有素的模型,将其提取将创建gnn目录,该目录由以下内容组成:

如果model_iter495是在训练期间在验证集上表现最佳的检查点(在提供的训练模型中就是这种情况)。NUM_GNN_LAYERS的值应与训练中的值相同。

在训练和测试期间使用--no_arg标志,以训练" no-values"模型(如本文表4所示)

在训练和测试过程中使用--no_api标志来训练"模糊的"模型(如本文表2所示)-一种不使用API​​名称的模型(假设它们被混淆了)。

本节提供了来自测试集的示例的名称预测演练(此处进一步说明)。为便于阅读,我们直接从图形表示开始(类似于本文图2(c)所示)。其余步骤。

find可执行文件中的get_tz过程是findutils包的一部分。该过程表示为在procedure_representations / raw / test.json的第1715行找到的json。

图节点是名为ob x的基本块。 (其中x是带有可选后缀的数字,例如,initialize)。

json包含有关节点之间的边缘以及每个节点中抽象的调用站点的数据。

在此json中,我们看到第一个节点ob-1.initialize包含对以Egetenv标记的External api调用getenv的调用。此api调用使用已解析为具体字符串TZ的参数进行。

使用抽象值CONST作为参数对memcpy和strlen进行其他调用。 该CONST抽象值在本文中称为STK(请参阅第14页)。 请注意,Nxmemdup是普通(内部)调用。 该名称取自调试信息,并保留在此处用于我们的调试目的,在训练/预测步骤中使用之前,将其再次删除。 我们的Nero-GNN对该程序的名称预测可以在模型预测日志文件的第876行中找到: 该行以预测代码开头:+,±或-表示完全匹配,部分匹配或不匹配。 然后,过程信息,基本事实,预测和截断的子令牌如下: