使用对抗程序欺骗基于深度神经网络的二进制代码匹配
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/wwkenwong/Deceiving-DNN-based-Binary-Matching
实施细节
请检查 这里
正如第 III-C 节中所讨论的,我们的节点重写方案包含两种策略:
- 用语义等价指令重写某些指令,以及
- 插入冗余指令序列。
1.用语义等价的指令重写某些指令
关于指令替换,我们利用三个映射规则将某些 x86 指令替换为它们的语义等效指令。值得注意的是,相当多的 x86 指令可以偷偷更改 CPU 标志。为了解决这个问题,我们按照惯例在替换指令之前放置一条pushf指令以将 CPU 标志存储在堆栈中,并使用popf指令在替换指令之后立即从堆栈中检索 CPU 标志。
2.插入冗余指令序列
至于垃圾代码插入,我们形成了三个垃圾代码序列候选的集合,它们是nop、mov 操作数、 operand和xchg 操作数、 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 和基本组件:
- 安装了 WSL 的 Ubuntu 18.04 LTS 或 Windows 10 和 适用于 Windows WSL 的 Ubuntu 18.04
- python3.7以上安装
- 带有 r2pipe 安装在 python 中的 radare2
对于二进制 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的要求
- 使用来自 Neural Code Comprehension: A Learnable Representation of Code Semantics 存储库(此处 )的 requirements.txt 安装 python 依赖项
安装攻击 binaryAI 的要求
- 使用 binaryAI 的 requirements.txt( 此处 )安装 python 依赖项
- 确保您已安装 IDA Pro 版本 > 7.1 以支持 IDA Pro 微码 API
- 从这里 获取binaryAI的access key
- 并将其粘贴到里面
ida_binaryai_linux.py
评估步骤:
- 创建一个名为
uroboro_testing - 构建 coreutils 并复制到
uroboro_testing
选项
该框架将采用 2 个参数
<seed_program>uroboro_testing:文件夹 下的二进制名称<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 表示攻击成功。