腾讯科恩实验室论文Order Matters的工具 Binaryai 工具复现

 

论文简介

标题:Order Matters: Semantic-Aware Neural Networks for Binary Code Similarity Detection
链接:https://keenlab.tencent.com/en/whitepapers/Ordermatters.pdf
内容:

binaryai 工具的流程

 

主要内容

本工具首先利用改进的BERT模型将函数CFG节点转换为语义嵌入向量,然后利用改进的MPNN模型获得CFG的语义结构嵌入向量,再利用CNN模型获得CFG节点顺序嵌入向量,最后将两者整合 作为最终的函数嵌入向量,用于函数相似度测量。

该模型有三个部分:语义感知模型、结构感知模型和顺序感知模型。

语义感知模型

在语义感知建模中,它提出了一个BERT预训练模型,有4个任务来处理CFG。

Bert实现的四个任务:MLM, ANP, BIG 和 GC.

  • 屏蔽语言模型(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$。

MPNN 主要公式

这里G指整个图,v指节点,N(v)指节点v的相邻节点,我们在消息函数M上采用MLP,在更新函数U上采用GRU来学习时间迭代的顺序信息,有人已经证明求和函数是读出函数R的最佳选择。

本文使用的MPNN

顺序感知模型

在这个组件中,我们旨在提取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

token存放位置

或者直接在idapro里面放到:

token存放位置2

使用

命令行使用binaryai

命令行使用Binaryai

具体的使用请参考官方文档:https://binaryai.readthedocs.io/en/latest/index.html

使用binaryai 创建一个函数集

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 工具可以用于漏洞查找,可以构建一个已知漏洞函数集,然后用这个函数集对未知文件进行测试,看这个二进制文件里面有没有类似的漏洞。但是主要是在函数级别实现匹配,匹配成功之后还需要人工验证一下。

(完)