论文简介
标题:Order Matters: Semantic-Aware Neural Networks for Binary Code Similarity Detection
链接:https://keenlab.tencent.com/en/whitepapers/Ordermatters.pdf
内容:
主要内容
本工具首先利用改进的BERT模型将函数CFG节点转换为语义嵌入向量,然后利用改进的MPNN模型获得CFG的语义结构嵌入向量,再利用CNN模型获得CFG节点顺序嵌入向量,最后将两者整合 作为最终的函数嵌入向量,用于函数相似度测量。
该模型有三个部分:语义感知模型、结构感知模型和顺序感知模型。
语义感知模型
在语义感知建模中,它提出了一个BERT预训练模型,有4个任务来处理CFG。
- 屏蔽语言模型(Masked language model ,MLM):对于节点内部的token序列,我们采用(MLM)来提取块内的语义信息。MLM是一个令牌级的任务,在输入层对令牌进行屏蔽,在输出层进行预测。
- 邻接节点预测任务(Adjacency node prediction task ,ANP) :这是一个块级任务。在ANP任务中,我们提取一个图上所有相邻的块,并随机抽取同一图中的几个块,预测两个块是否相邻。
- 图内块任务(Block inside graph task ,BIG)。BIG任务试图让模型判断同一图上是否存在两个节点。
- 分类任务(Classification task ,GC):GC使模型对不同平台、不同架构或不同优化方案的块进行分类。
结构感知模型
它使用MPNN(Message Passing Neural Networks)来计算每个CFG的图语义和结构嵌入。
消息传递阶段,消息函数M和更新函数U运行T个时间步,然后读出函数R计算整个图的语义与结构嵌入$g_ss$。
这里G指整个图,v指节点,N(v)指节点v的相邻节点,我们在消息函数M上采用MLP,在更新函数U上采用GRU来学习时间迭代的顺序信息,有人已经证明求和函数是读出函数R的最佳选择。
顺序感知模型
在这个组件中,我们旨在提取CFG的节点顺序信息。
这三个图表示(无语义信息的图块)及其相邻矩阵。
首先考虑a和b,三角形上增加了一个新的节点,但三角形的节点顺序没有被打破。即使位移发生了变化,但两个相邻矩阵中的三角形特征(1,1,0,1的正方形)并没有改变。
再看c,似乎增加的节点2打破了三角形的节点顺序。但是,当我们去掉邻接矩阵的第二行和第二列时,三角形特征方块仍然存在。
提示: 这里直接看邻节矩阵里面的值更容易理解
复现笔记
参考
参考blog:
https://my.oschina.net/u/4079523/blog/4883160
项目地址:
https://binaryai.readthedocs.io/en/latest/index.html
在参考对应blog 搭建的时候遇到一些细节性的问题,所以这里需要记录一下
环境
windows10
Python: Python 3.9.2
idapro7.5
网盘链接:链接:https://pan.baidu.com/s/1h2bWvkIG2GTkwuv2RHxDiQ
提取码:wo5s
解压密码:www.jb51.net
idapro 安装步骤
将下载的idapro解压到,进入对应的目录
运行IDA Pro 7.5 SP3.msi idapro会自动安装到C:\Program Files\ 目录下
以管理员身份运行idapyswitch.exe, 选择对应的python版本
将\Hex-Rays_IDA_Pro_7.5.201028_SP3\Hex-Rays IDA Pro 7.5.201028 SP3 x64\ida75sp3_python39_win\python\3\PyQt5\python_3.9\sip.pyd 放到C:\Program Files\IDA Pro 7.5 SP3\python\3\PyQt5 目录下
binaryai 安装
pip install binaryai
binaryai install_ida_plugin
之后会将binaryai Plugin放入
C:\Users\用户名\AppData\Roaming\Hex-Rays\IDA Pro
安装成功之后在idpro 里面会出现binaryai 的插件
申请令牌
在这个网址申请对应的token(不知道为什么要申请可以继续看下面的内容)
https://binaryai.tencent.com/apply-token
申请之后放到
C:\Users\用户名\AppData\Roaming\Hex-Rays\IDA Pro\cfg\binaryai.cfg
或者直接在idapro里面放到:
使用
具体的使用请参考官方文档:https://binaryai.readthedocs.io/en/latest/index.html
binaryai 有两种使用方式private 表示创建自己的函数集来进行匹配,public表示使用作者使用的函数集来进行匹配。这里我们主要说明使用自己创建的函数集来进行匹配的情况,这种情况也更通用。
binaryai create_funcset
1ba1cc0d-7d62-4152-a0fe-17e2f4a9d9ee 将这个填入如下,这里的private 表示创建私有的数据集,不使用它提供的公共数据集来进行匹配。
1.表示上传指定的函数
2.表示上传当前文件的所有函数,他会进行简单的过滤
这里我选择了2 上传所有的函数
然后可以在命令行查询所有的函数:
binaryai query_funcset -s 1ba1cc0d-7d62-4152-a0fe-17e2f4a9d9ee
用idapro打开另一个去除符号表之后的版本
然后点击,1,或者2 进行匹配,这里idapro里面的binaryai不用再进行配置,已经自动配置好了。
binaryai 会自动将函数名重名名为匹配成功的函数
匹配结果为:
/*
query: main
target[0]: main
target[0] info: None:None
score: 0.923361
*/
这里不是100% 的匹配主要是因为目标文件是对源码进行了简单的修改之后重新生成的。
应用
binaryai 工具可以用于漏洞查找,可以构建一个已知漏洞函数集,然后用这个函数集对未知文件进行测试,看这个二进制文件里面有没有类似的漏洞。但是主要是在函数级别实现匹配,匹配成功之后还需要人工验证一下。