使用对抗程序欺骗基于深度神经网络的二进制代码匹配

作者:Sec-Labs | 发布时间:

项目地址

https://github.com/wwkenwong/Deceiving-DNN-based-Binary-Matching

实施细节

请检查 这里

正如第 III-C 节中所讨论的,我们的节点重写方案包含两种策略:

  1. 用语义等价指令重写某些指令,以及
  2. 插入冗余指令序列。

1.用语义等价的指令重写某些指令

关于指令替换,我们利用三个映射规则将某些 x86 指令替换为它们的语义等效指令。值得注意的是,相当多的 x86 指令可以偷偷更改 CPU 标志。为了解决这个问题,我们按照惯例在替换指令之前放置一条pushf指令以将 CPU 标志存储在堆栈中,并使用popf指令在替换指令之后立即从堆栈中检索 CPU 标志。

2.插入冗余指令序列

至于垃圾代码插入,我们形成了三个垃圾代码序列候选的集合,它们是nopmov 操作数、 operandxchg 操作数、 operand,其中每个操作数表示一个 CPU 寄存器或内存地址。每次我们都会随机决定从这些无意义的候选集合中挑选N条指令进行插入。N根据经验确定为 5。

子图注入

为了插入由所谓的不透明谓词保护的任意数量的新节点,我们首先创建一个数论结构的集合(例如,(x*(x-1) % 2 == 0) )。我们注意到,此类数论结构将始终被评估为false。因此,在分支上插入任意数量的新节点true而不在运行时执行是安全的。我们的数论构造首先作为不透明谓词候选者编译到 x86 汇编代码例程中。我们的实现从控制流图中随机选择一个目标基本块b,并在其前面插入一个不透明的谓词。然后我们创建一个包含N 个基本块的代码块 ( N在我们当前的实现中是 5),其内容是随机创建的,并将此代码块放在true插入的不透明谓词的分支上,表示插入原始控制流图中的垃圾子图。

控制流图扁平化

控制流图扁平化方案每次变换一个完整的函数;扁平化控制流图顶部的调度程序节点被实现为间接跳转指令。我们将每个控制传输的控制目的地硬编码到全局缓冲区中。每次调度节点读取这个全局缓冲区并更新间接跳转指令的目的地。

调用图操作

对于调用图操作,我们遵循编译器优化中的约定来执行函数内联和扩展调用点。特别是,为了内联函数f,我们将其调用点(即 x86 汇编指令call)替换为f的所有指令( ret指令除外)。我们还将指令的地址压入f开头的调用点旁边,并在结尾弹出它以平衡堆栈。为了创建额外的调用点,我们随机选择某些jmp指令并将它们翻译成一个函数调用指令到 a branch routine,它将控制转移重定向回扰动的目的地跳转指令。

系统要求

对于 Uroboros 和基本组件:

对于二进制 AI:

  • 安装了 idapython 和反编译器支持的 IDA Pro。

对于 NCC 的 inst2vec 再训练(可选):

  • 至少 >8GB 的​​ GPU,用于 inst2vec 模型再训练和扩充

Uroboros 的安装要求

sudo apt-get update
sudo apt-get -y install gcc gperf bison libtool gcc-multilib python python-dev python-pip gawk build-essential libc6-i386 lib32z1 lib32ncurses5 lib32bz2-1.0 libbz2-1.0:i386 wget git tar gcc-4.8 gcc-4.8-multilib

安装攻击ncc的要求

安装攻击 binaryAI 的要求

  • 使用 binaryAI 的 requirements.txt( 此处 )安装 python 依赖项
  • 确保您已安装 IDA Pro 版本 > 7.1 以支持 IDA Pro 微码 API
  • 从这里 获取binaryAI的access key
  • 并将其粘贴到里面 ida_binaryai_linux.py

评估步骤:

  1. 创建一个名为 uroboro_testing
  2. 构建 coreutils 并复制到 uroboro_testing

选项

该框架将采用 2 个参数

  1. <seed_program> uroboro_testing :文件夹 下的二进制名称
  2. <function_name> : 从Objdump/IDA Pro获取的函数名

为 ncc 运行攻击

python3 ./ncc_harness.py -binary_seed <seed_program> -function_name <function_name>

运行 asm2vec 攻击

python3 ./harness.py -binary_seed <seed_program> -function_name <function_name>

对 binaryAI 进行运行攻击

python3 ./ida_harness.py -binary_seed <seed_program> -function_name <function_name>

您可以在下看到变异的文件夹 ./uroboro_testing/function_container_<function_name>_<seed_program> 。 文件夹内的礼物 bypassed.txt 表示攻击成功。

标签:工具分享, 神经网络