二进制代码相似性检测(BCSD),即两个二进制可执行代码的相似性检测,有着广泛的用途,如软件成分分析、恶意软件检测和软件剽窃检测等。
笔者给大家推荐一篇关于BCSD黑盒对抗代码生成算法的论文——FuncFooler:APracticalBlack-boxAttackAgainstLearning-base Binary Code Similarity Detection Methods。
image-1671433842545
论文地址:https://arxiv.org/abs/2208.14191。

二进制代码相似性检测BCSD

二进制代码相似性检测,首先对二进制可执行程序进行反汇编,得到反汇编的代码,然后根据代码片段粒度(函数)对反汇编的代码进行切割,得到代码片段,根据代码片段计算两个可执行程序的相似度。

传统的分析方法主要是分析代码的特征,可扩展性和检测性能较差。近年来,随着深度学习在各个领域的蓬勃发展,利用深度学习方法获取代码片段的语义信息已成为当下的主流研究方向,当前成熟有效的方案包括asm2vec,SAFE和jTrans等。

尽管基于深度学习的BCSD已经取得了很好的效果,对相似的二进制代码有很高的召回率。但由于深度学习本身的原因,使得模型容易受到输入代码微小变化的影响,尤其是对抗代码的存在,使得模型容易被欺骗,从而影响模型对代码的判断,降低相似代码的召回率。为了验证基于深度学习的方法的脆弱性并提高方法的鲁棒性,论文提出了FuncFooler,一种高效的黑盒对抗代码生成算法。

算法概要

不同于图像和文本领域的对抗攻击,对抗代码的搜索空间可以是离散的,目标汇编代码搜索范围局限于特定的架构指令集(如MIPS、Inter X86),且对抗代码必须满足语义约束,即
1.对抗代码功能与原始代码相同;
2.对抗代码的控制流图与原始代码相同。
FuncFooler是一种黑盒攻击下的对抗代码生成算法,通过三个任务:
1.确定可攻击集合;
2.插入对抗指令;
3.纠正对抗指令的语义错误。
生成对抗代码样本,并成功地应用于SPEC CPU 2006和SPEC CPU 2017基准测试中的三个最先进的基于深度学习的BCSD模型(asm2vec,SAFE,jTrans)。在对抗实验中,FuncFooler能通过向程序中添加较少的扰动,生成有效误导目标模型的对抗代码。

算法介绍

算法流程

image-1671433961619

图一
如图上图示,通过在恶意软件函数的第6条指令之后插入指令,得到了三个对抗样例。

对抗样例1可以欺骗基于深度学习的BCSD方法,但插入的跳转指令改变了控制流图,因此不是一个有效的对抗样例。
image-1671434381282
image-1671434388560

图2
### 对抗样例的生成 #### 如图2所示,对抗样例的生成步骤如下:

1.使用gcc/clang将源代码编译成二进制可执行程序。
2.FuncFooler将二进制可执行文件进行反汇编,得到二进制可执行文件的函数片段。
3.FuncFooler通过向指定位置插入指令对函数进行对抗转换,得到对抗指令。
4.FuncFooler将对抗指令写入源代码。
5.使用gcc/clang编译对抗源代码,得到对抗二进制可执行文件。

实验结果

评估指标

image-1671434558820

分析结果

image-1671434579169
image-1671434585019

图4

image-1671434609546
image-1671434633839

图5

image-1671434655518

参考文献

Jia L, Tang B, Wu C, et al. FuncFooler: A
Practical Black-box Attack Against Learning-based Binary Code Similarity
Detection Methods[J]. arXiv preprint arXiv:2208.14191, 2022.
论文地址:https://arxiv.org/abs/2208.14191。
注:本文图片均来源于以上论文