CN113900923A - 一种跨指令集架构的二进制函数相似性检查系统及方法 - Google Patents
一种跨指令集架构的二进制函数相似性检查系统及方法 Download PDFInfo
- Publication number
- CN113900923A CN113900923A CN202110936947.3A CN202110936947A CN113900923A CN 113900923 A CN113900923 A CN 113900923A CN 202110936947 A CN202110936947 A CN 202110936947A CN 113900923 A CN113900923 A CN 113900923A
- Authority
- CN
- China
- Prior art keywords
- function
- binary
- arm
- instruction
- similarity
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3608—Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Software Systems (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Health & Medical Sciences (AREA)
- Biomedical Technology (AREA)
- Data Mining & Analysis (AREA)
- Evolutionary Computation (AREA)
- Biophysics (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- Computational Linguistics (AREA)
- Artificial Intelligence (AREA)
- Mathematical Physics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Health & Medical Sciences (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Stored Programmes (AREA)
Abstract
本发明属于二进制函数相似性检测技术领域,具体涉及一种基于神经机器翻译模型的跨指令集架构的二进制函数相似性检查方法。该方法是利用神经机器翻译中的Transformer模型,把汇编指令中的操作码或操作数视为单词,基本块视为句子,整个二进制函数视为一个段落。首先通过预处理过程把具有多个执行路径的二进制函数转化为与文本类似的序列结构,然后利用神经机器翻译模型,通过无监督学习自动捕获二进制函数的语义信息,生成函数的嵌入向量,最后使用欧氏距离度量嵌入向量之间的距离来判断函数之间的相似关系。该方法在提高检测的准确率的同时大大提高了检查效率。
Description
技术领域
本发明属于二进制代码相似性检测技术领域,具体涉及一种跨指令集架构的二进制函数相似性检查系统及方法。
背景技术
二进制代码相似性检测用于度量两个或多个二进制程序组件之间的相似关系,根据检测粒度的不同,程序组件可以是基本块粒度、函数粒度或者是整个程序。代码相似性检测技术可以应用于恶意代码分析、漏洞检测、软件知识产权保护等场景中。例如,利用已经公布的已知漏洞样本,通过相似性分析,可以帮助安全分析人员快速查找和定位其他软件中是否包含相同或相似的漏洞。随着物联网设备的激增,越来越多的软件被移植到不同体系架构的平台上运行,因此,跨指令集架构的二进制代码相似性检测方法逐渐成为研究的热点。
相较于源代码级别的检测,跨平台二进制层面的相似性检测更具挑战性。首先编译过程会丢失大量程序语义信息,包括函数名,变量名以及定义的数据结构等。其次,不同架构的指令集(比如x86、ARM、MIPS)在指令类型、函数调用约定、内存访问机制以及寄存器种类等方面存在显著的差异,从而造成由相同源代码编译生成的二进制代码在表现形式上完全不同。此外,编译器种类以及编译优化选项的不同也会带来二进制代码结构上的差异(比如,内联函数)。因此导致传统的基于语法和结构相似性的检测方法都无法很好的解决跨平台二进制代码相似性检测的问题。
跨指令集架构的检测方法可以检测不同指令集架构的二进制程序之间的相似性。其与单一指令集架构的检测方法最大的不同之处在于,待检测的对象可以为两个不同指令集架构的二进制程序,例如一个为x86架构,另一个为ARM架构。通过对现有方法的总结,可以分为基于中间表示(Intermediate Representation,IR)的检测方法和基于特征的检测方法,但同时这些方法都存在相应的缺陷。
1、基于中间表示的检测
基于中间表示的检测方法的基本思想是借助中间语言(例如VEX-IR),把不同指令集架构的汇编指令转换到统一的中间表示形式,从而消除了不同指令集架构之间的差异。文献Multi-MH首先把不同指令集架构的二进制代码转化成中间表示形式,然后基于每个基本块的输入输出(I/O Pairs)行为,提取基本块的语义信息。为了减小度量两个基本块相似性的计算代价,作者采用改进的最小哈希算法比较基本块间的相似性,最后基于函数的控制流程图把单个相似的基本块扩展到多个相似的基本块,以至于覆盖到整个漏洞的代码段,从而确定出漏洞在目标代码中的具体位置。Multi-MH首次对解决跨平台二进制代码相似性检测问题做了尝试,但是输入输出对的计算代价以及匹配算法的时间开销过大,不能拓展到大规模二进制程序的相似性比对。
2、基于特征的检测
计算代码相似性比较常用的一种方法是将一段二进制代码表示为一个向量或一组特征,使得相似的二进制代码段具有相似的特征向量或特征集。特征捕获了二进制代码的句法、语义或结构属性,特征可以是布尔型、数字型或分类型。分类特征具有离散值,例如指令的助记符。一个特征向量通常具有全部数字特征或全部布尔特征,后者被称为位向量。分类特征通常首先使用独热编码(One-hot Encoding)编码为布尔特征,或使用嵌入(Embedding)编码为实值特征。一旦提取了特征,就可以使用特征向量或特征集之间的相似性度量来计算相似性。
文献Genius通过人工选取的基本块统计特征来构建二进制函数的属性控制流程图,然后使用聚类算法对函数的属性控制流程图进行聚类,利用生成的码本将目标函数的属性控制流程图表示成多维向量,最后通过计算两个向量之间的余弦距离来度量两个二进制函数的相似性。文献Gemini改进了Genius模型,首次基于神经网络生成二进制函数的嵌入向量,利用改进的Structure2vec模型来构成孪生网络,将二进制函数的属性控制流程图表示为高维的嵌入向量。虽然基于图嵌入的方法提高了检测效率,但是通过手工选取的统计特征来表示二进制函数会丢失大量的语义信息。此外手工选取特征时过度依赖于专家知识,如果选取了不重要的特征,或者没有把重要的特征考虑进来,就会引入人为误差。
近年来,深度学习在自然语言处理(Natural Language Processing,NLP)领域取得了丰硕成果,不少学者尝试使用NLP技术解决跨平台的二进制代码相似性分析问题。文献INNEREYE首先采用word2vec中的skip-gram模型生成汇编指令的嵌入向量,然后利用LSTM模型构建基本块的嵌入向量。文献MIRROR采用近似的思想,利用神经机器翻译模型将不同平台的基本块的语义信息映射到相同的向量空间中,实现跨平台的基本块嵌入。基于深度神经网络的相似性检测方法通过深度学习模型自动获取基本块的特征,取代了手工选取特征的方式,在保留较多的原始语义信息的同时避免了人为偏差的引入。但是,基于深度神经网络的检测方法一般只能从基本块粒度上生成嵌入向量,当利用图同构算法从基本块粒度拓展到函数粒度时,既不能完全消除由于控制流程图的变化而造成的影响,也不能保证覆盖到全部的基本块。
发明内容
针对目前基于深度神经网络的检测方法只能从基本块粒度上生成嵌入向量,既不能完全消除由于控制流程图的变化而造成的影响,也不能保证覆盖到全部基本快的缺陷和问题,本发明提供一种跨指令集架构的二进制函数相似性检查系统及方法。
本发明解决其技术问题所采用的方案是:一种跨指令集架构的二进制函数相似性检查方法,包括以下步骤:
步骤一、通过预处理把多个执行路径的二进制函数转化为与文本类似的序列结构;
步骤二、利用神经机器翻译模型,根据架构类型F1和F2分别对模型进行训练得到对应的语义嵌入模型F1-Encoder和F2-Encoder,将二进制函数的指令源序列输入到对应语义嵌入模型中,输出二进制函数的上下文语义矩阵M1和M2,将上下文语义矩阵按列求和生成对应函数的嵌入向量EF1和EF2;
步骤三、计算嵌入向量EF1和EF2的欧式距离以判断二进制函数之间的相似性,
式中:参数d代表嵌入向量的维度。
上述的跨指令集架构的二进制函数相似性检查方法,步骤一中预处理包括以下步骤:
S1、将内联函数扩展得到内联展开后的原函数,具体为:
(1)输入主函数f,运行getcallees(f)返回值给calleelist;
(2)对于每一个位于calleelist的被调用函数fc,如果被调用函数fc不在数据存储库列表,不进行处理;如果被调用函数fc为库函数则不进行内联展开;如果被调用函数的指令长度与主调函数指令长度之比且被调用函数指令总长度‖fc‖>numIns同样不进行内联展开,输出内联展开之后的原函数fI;
S2、生成二进制函数多序列,具体为:
(1)对二进制函数CFG进行采样,提取出所有的边;
(2)遍历每一条边,把该边的前序节点和后续节点进行拼接直至覆盖整个二进制函数内部所有节点;从而由一个二进制函数得到多个汇编指令序列f=(seq1,seq2,...,seqn),并将其作为模型的输入;
(3)将汇编指令标准化,包括对寄存器、对寻址内存的操作数、立即数以及对调用指令的跳转地址分别进行标准化。
上述的跨指令集架构的二进制函数相似性检查方法,将汇编指令标准化具体为:
(1)根据寄存器的根据寄存器的种类对寄存器进行标准化:寄存器被分为pointerregisters和general registers两种类型,分别记为“%reg_pointer”和“%reg_gen”;
(2)对寻址内存的操作数进行标准化;把属于直接寻址的内存操作数、利用基址寄存器和变址寄存器寻址的操作数以及利用寄存器和位移寻址的操作数替换为统一标记“ADDRESS”;
(3)对立即数进行标准化:把所有的立即数替换为统一标记“IMM”;
(4)根据调用指令的类型对调用指令的跳转地址进行标准化:若跳转地址为函数名,把跳转地址统一为“FUNC”;若跳转地址为基本块名,把跳转地址统一为“BB”。
上述的跨指令集架构的二进制函数相似性检查方法,步骤三还包括将两个二进制函数FuncF1和FuncF2嵌入向量EF1和EF2的欧氏距离映射到[0,1]区间内以更好的反应两个二进制函数的相似度,
上述的跨指令集架构的二进制函数相似性检查方法,F1架构为x86架构,F2架构为ARM架构,则对86-Encoder嵌入模型的预训练方法是将x86架构的二进制函数源序列S=(s1,s2,...,sm)和目标序列T=(t1,t2,...,tn)中的前k-1项T=(t1,t2,...,tk-1)预测目标序列的第k项tk的值,输出tk的条件概率分布,模型的损失函数为:
式中:n指目标序列的长度,l指目标序列所对应的词汇表的大小,p和q分别指真实值和预测值;
对ARM-Encoder语义嵌入模型的训练是将二进制函数的三元组(funcx86,funcarm,funcarm′)输入到ARM-Encoder模型中,模型的Decoder输出上下文语义矩阵Marm,对上下文语义矩阵Marm按列求和得到维度固定的嵌入向量Earm;ARM-Encoder的损失函数是基于边际距离的三元组损失函数,
L=max{D(Ex86,Earm)-D(Ex86,Earm′)+γ,0}
式中:Ex86,Earm,Earm′分别是三元组的嵌入向量,边际距离γ是一个大于0的超参数,运算D是指两个嵌入向量之间的欧式距离。
本发明还提供一种跨指令集架构的二进制函数相似性检测系统,该系统包括数据预处理模块、函数语义特征提取模块和相似度计算模块,所述预处理模块用以对数据集进行预处理得到汇编指令序列;所述函数语义特征提取模块用以根据架构类型对Transformer模型分别进行训练得到对应的语义嵌入模型,将二进制函数的指令源序列输入到对应语义嵌入模型中,输出二进制函数的上下文语义矩阵,将上下文语义矩阵按列求和生成对应函数的嵌入向量;所述相似度计算模块用以将函数语义语义提取模块输出的嵌入向量进行计算得到两二进制函数的相似度。
本发明的有益效果:
1、本发明采用分阶段的数据预处理过程,能够利用神经机器翻译模型把二进制函数作为模型的输入。其中,通过提出的内联函数的展开方法能够有效消除内联函数的影响。通过设计的二进制函数多序列生成算法,把函数的控制流程图(Control Flow Graph,CFG)转化为多个汇编指令的线性序列,其中每个序列代表一个潜在的执行路径,能够有效解决原始二进制无法直接作为神经机器翻译模型训练输入的问题;通过设计的汇编指令的标准化方法能够解决词汇外溢的问题。
2、本发明把二进制函数转化为维度固定的数字向量的形式,不同于传统的手工选取特征的方式,通过深度学习模型自动学习捕获二进制函数的语义信息,在保留较多原始语义信息的同时避免了人为偏差的引入,从而能够提高检测的准确率。本发明通过函数特征的向量化之后利用欧几里得距离可以快速比较大规模不同指令集架构二进制函数的相似关系,相较于传统的基于图匹配的检查方法能够大大提高了检查效率。
3、本发明的基于二进制代码的静态检测方法,既不需要源代码的获取,在检测过程中也不需要执行相应的二进制程序,对于无法获取源码的设备固件和一般的商用软件来说具有较好的通用性。
4、本发明把不同指令集架构的二进制函数转化为语义向量的形式,因此可以实现跨指令集架构的二进制函数相似性比对,例如x86、ARM和MIPS指令集架构的二进制函数之间的相似性分析。
附图说明
图1为二进制函数的控制流程图。
图2为二进制函数多序列生成算法最终生成的三个序列示意图。
图3为模型在训练集上和测试集上的损失值与训练周期数的关系图。
图4为跨指令集架构的二进制函数相似性检测框架BFS。
图5为BFS框架语义转换可视化效果图。
具体实施方式
针对目前基于深度神经网络一般只能从基本块粒度上生成嵌入向量,当利用图同构算法从基本块粒度拓展到函数粒度时,既不能完全消除由于控制流程图的变化而造成的影响,也不能保证覆盖到全部的基本块的问题,本发明提供一种跨指令集架构的二进制函数相似性检查方法,该方法考虑了汇编指令丰富的原始语义信息和控制流图结构系信息,直接在二进制函数粒度上生成嵌入向量。下面结合附图和实施例对本发明进一步说明。
实施例1:本实施例提供的一种跨指令集架构的二进制函数相似性检查方法,具体以x86架构和ARM架构为例,对本发明的方法进行详细说明,具体如下。
步骤一、数据集的预处理,包括对内联函数扩展得到内联展开后的原函数,生成二进制函数多序列把两两相邻的节点进行拼接构建为更长的汇编指令序列,并对汇编指令进行标准化处理。
1、内联函数扩展
函数内联是一种编译器优化技术,该技术通过展开主函数内部的被调函数以消除函数调用的开销。显而易见,使用函数内联和不使用函数内联会造成函数控制流程图结构的变化,因此会对二进制函数相似性比对产生障碍。本实施例采用算法1中描述的方法进行内联函数的展开,来减轻编译优化的影响。步骤如下:
(1)输入主函数f,运行getcallef返回值给calllist;
(2)对于每一个位于calllist的被调用函数fc,如果被调用函数fc不在数据存储库列表,不进行处理;如果被调用函数fc为库函数则不进行内联展开;如果被调用函数的指令长度与主调函数指令长度之比且被调用函数指令总长度‖fc‖>numIns同样不进行内联展开,输出内联展开之后的原函数fI。
具体代码如下:
其中f表示主函数,fc表示被调用函数,fI表示内联展开之后的原函数,||f||表示函数内部指令的总长度,threshold和numIns分别被设置为0.6和10。
2、生成二进制函数多序列
二进制函数的结构信息可以使用函数的CFG来表示。CFG中的节点和边分别为基本块和指令执行过程中的跳转关系,其中基本块是指程序内部顺序执行的最大单元。但是反汇编的二进制函数和文本之间不完全相同,文本内的每个句子在前后逻辑上构成了一个序列,而程序内部存在多条可能的执行路径,汇编指令的执行流程并不是按照指令地址的大小从上到下顺序执行的,因此不能直接将反汇编出的二进制函数作为模型的输入。为了处理这种差异,本文把两两相邻的基本块进行拼接构建一个更长的汇编指令序列。
首先,对二进制函数的CFG进行采样,提取出所有的边;
然后,遍历每一条边,把该边的前序节点(基本块)和后续节点(基本块)进行拼接,如果前序节点和后续节点还有相邻的节点则执行同样的拼接操作,直至覆盖整个二进制函数内部所有基本块;
最后,由一个二进制函数得到多个汇编指令序列,即f=(seq1,seq2,...,seqn),并将其作为模型的输入。
3、汇编指令的标准化
在NLP任务中,通常会生成一个字词库,目标任务中可能会出现一些罕见词、派生词或者使用其他规则产生的组合词,由于其不在现有的字词库中,所以无法用现有的词向量模型表示,称这些词汇被称为Out of vocabulary,简称OOV问题。由于原始汇编指令中存在大量的函数名、立即数以及反汇编工具自动识别的变量名,如果不做标准化处理,同样会遇到OOV的问题。为了解决以上问题,原始汇编指令的标准化方法如下所述:
(1)根据寄存器的种类对寄存器进行标准化。寄存器被分为pointer registers和general registers两种类型,分别记为“%reg_pointer”和“%reg_gen”
(2)对寻址内存的操作数进行标准化。把属于直接寻址的内存操作数(例如leaedx,ds:0[eax*4])、利用基址寄存器和变址寄存器寻址的操作数(例如mov[edi+ecx],eax)以及利用寄存器和位移寻址的操作数(例如mov eax,,edi+18h])替换为统一的标记“ADDRESS”。
(3)对立即数进行标准化。因为立即数可以取任意有意义的实数值,并且立即数的数值大小对函数语义的影响不大,所以可以把所有的立即数替换为统一的标记“IMM”。
(4)根据调用指令的类型,对调用指令的跳转地址进行标准化。如果跳转地址为函数名,则把跳转地址统一为“FUNC”,如果跳转地址为基本块名,则把跳转地址统一为“BB”。
步骤二、对语义嵌入模型进行训练
本发明采用Transformer模型,Transformer模型是基于编码器-解码器的框架结构,其中编码器由6个相同的堆栈层组成,每层包含一个自注意力机制子层和一个基于词语位置的前馈子层,解码器也遵循类似的结构。与传统的Seq2Seq(sequence-to-sequence)模型最大的区别在于Transformer模型引入了注意力机制,使其可以很好的处理由于长序列输入造成的信息损失问题。
首先,通过预训练得到一个NMT模型,把x86架构的二进制函数翻译成与其对应的ARM架构的二进制函数。该模型Encoder部分的输入是x86架构二进制函数的指令序列(称为源序列,记为funcx86),Encoder部分的输出是一个上下文语义矩阵M,随后模型的Decoder部分把上下文语义矩阵M作为输入生成对应的ARM架构的指令序列(称为目标序列,记为funcarm)。由于Encoder部分的输出上下文矩阵包含了丰富的源序列语义信息,所以可以对上下文语义矩阵M按列求和得到一个维度固定的向量E作为二进制函数的嵌入向量。该模型的Encoder部分称为x86-Encoder。
1、x86-Encoder嵌入模型的预训练:
预训练的目的是为了得到一个NMT模型,把x86架构的指令序列翻译成语义相似的ARM架构的指令序列,其中模型的Encoder部分作为x86架构二进制函数的嵌入模型(x86-Encoder)。为了描述上的方便,本文把x86架构的二进制函数(源序列)和ARM架构的二进制函数(目标序列)分别定义为S=(s1,s2,...,sm)和T=(t1,t2,...,tn),其中si和ti分别表示x86词汇表和ARM词汇表中token的索引。
预训练是通过源序列S=(s1,s2,...,sm)和目标序列中的前k-1项T=(t1,t2,...,tk-1)来预测目的序列的第k项tk的值,最后的输出结果是tk的条件概率分布。预训练过程使用交叉熵损失函数作为模型的损失函数,损失函数定义为:
其中n指目标序列的长度,l指目标序列所对应的词汇表的大小,p和q分别指真实值和预测值。在整个模型的训练过程中使用自适应学习率的Adam优化算法使损失函数最小化
然后,采用类似方式在预训练模型的基础上通过训练得到另一个NMT模型,把ARM架构的指令序列作为源序列,生成对应的x86架构的目标序列,相应的把该模型的Encoder部分称为ARM-Encoder。
2、ARM-Encoder嵌入模型的训练:
ARM-Encoder嵌入模型训练的目的是得到另一个NMT模型,把ARM架构的指令序列翻译成对应的x86架构的指令序列。模型的输入为二进制函数的三元组(funcx86,funcarm,funcarm′),其中funcx86和funcarm表示不同指令集架构语义相似的二进制函数对,funcx86和funcarm′表示不同指令集架构语义不同的二进制函数对。
本实施例采用基于边际距离的三元组损失函数(margin-based triple loss)来定义ARM-Encoder的损失函数,如公式2所示:
L=max{D(Ex86,Earm)-D(Ex86,Earm′)+γ,0} (2)
式中:Ex86,Earm,Earm′分别是三元组的嵌入向量,由x86-Encoder和ARM-Encoder生成,边际距离γ是一个大于0的超参数,运算D是指两个嵌入向量之间的欧式距离,
步骤三、由上述训练得到的语义嵌入模型x86-Encoder和ARM-Encoder分别得到二进制函数的语义嵌入向量Ex86和Earm,通过计算嵌入向量之间的距离即可得出二进制函数之间的相似关系,相似性度量方法为:
通过上述训练得到的x86-Encoder模型和ARM-Encoder模型,选取任意的两个二进制函数funcx86和funcarm,将其输入到对应的模型中去,得到各自的嵌入向量Ex86和Earm,然后通过两个嵌入向量之间的欧式距离D(Ex86,Earm)来度量两个二进制函数的相似程度。欧式距离的值越小则说明两个二进制函数越相似,反之,欧式距离的值越大则说明两个二进制函数越不相似。但是为了更好的反应两个二进制函数的相似程度,通过公式(4)把两个二进制函数嵌入向量的欧式距离映射到[0,1]区间内,其结果越接近于1表明两个函数越相似。
式中:参数d代表嵌入向量的维度。
试验例1:本试验例通过实际运行判断本发明方法的效果。
1、实验环境
实验部署在一台Ubuntu18.04 LTS 64位操作系统的服务器上,训练机器的具体配置如下:CPU为两颗Intel Xeon(R)Silver 4114CPU@2.20GHz,10核2线程;内存大小为62GB;GPU为两块英伟达Tesla K80。
2、数据集
数据集Ⅰ:开源的源代码文件
本数据集用来训练二进制函数相似度检测模型及进行相关性能测试。其中包含3个具有代表性的开源项目的源代码文件,分别是openssl-1.0.1f,openssl-1.0.1u,coreutils-8.29,coreutils-8.31,binutils-2.26和binutils-2.28。然后使用GCC v5.4在O0~O3四种不同优化选项下对源文件进行编译,生成x86和ARM32两种架构的二进制文件。由于Transformer模型在处理超长文本时会造成信息损失,所以本文把函数序列的最大长度限定为400。在去除IDA Pro无法解析以及过长的函数之后,最终生成了223412对相似的二进制函数对。
数据集Ⅱ:CVE漏洞和固件镜像文件
CVE漏洞数据集主要用来对模型的漏洞查找性能进行评估。该数据集包括CVE-2014-0160漏洞以及待检测的opessl-1.0.1f源文件和路由器固件NetgearReadyNAS-v6.1.6(ARM)镜像文件。
3、模型参数确定
通过调整不同的超参数并根据其对模型检测效果的影响,来确定模型的超参数。本实验最主要的超参数包括模型收敛需要的周期数epoch,二进制函数的嵌入维度P以及边际距离γ。本文从数据集Ⅰ中随机选取了20000个相似的二进制函数对作为模型参数选取的数据集,并按照8:2的比例分为训练集和测试集。模型在训练集上和测试集上的损失值与训练周期数的关系如图3所示。
从图3中可以看出在epoch的值为20时,训练集和测试集上的损失值基本趋于稳定,所以epoch的取值为20。二进制函数的嵌入维度P是指二进制函数通过x86-Encoder或者ARM-Encoder生成的嵌入向量Ex86或Earm的维度。维度太小会使精确度降低,维度太高会增加模型训练的时间,降低效率。通过实验发现在嵌入维度P大于等于512时实验的AUC值非常接近,因此从精度和效率两方面综合考虑,确定最优的嵌入维度P为512。与此类似确定边际距离γ的值取为150。
4、对比实验
选取Gemini模型作为BFS检测框架的基线。另外选择信息检索领域中经常使用的P@N(precision at N)评价指标作为对比实验的评价指标。P@N评价指标的具体计算方法如下所述:
首先任意选取1个某种指令集架构(例如x86)的二进制函数Funcx86;
然后再选取1个与之语义相似的ARM架构的二进制函数Funcarm作为正例,以及99个随机选取的ARM架构的二进制函数Funcarm1′,Funcarm2′,…Funcarm99′作为负例;
最后计算这100个二进制函数与Funcx86的相似性,并按照相似性由高到低的顺序进行排序。如果真实的正例Funcarm排序为第一,则P@1的值为100%,类似的可以计算P@3和P@10。因此可以通过P@N的值来评估模型的准确率,P@N的值越大说明模型的检测效果越好。
从数据集Ⅰ中随机选取了10万个相似的二进制函数对作为对比实验的数据集,保证了Gemini模型和BFS模型在对比测试中使用相同的数据集(其中Gemini模型是在二进制函数粒度上进行相似性比对的,并且其实验效果要明显优于传统的二进制函数相似性检测方法)。实验的对比结果如表1所示。
表1 BFS与Gemini实验结果对比
从表1的实验数据可知,本发明无论是从x86架构到ARM架构的相似性检测还是从ARM架构到x86架构的相似性检测,其P@1,P@3,P@10的准确率都要高于Gemini模型,并且P@10最少能够达到88.0%,比Gemini提上了10.6%。说明通过深度神经网络获取的二进制函数语义信息相较于手工选取的统计特征更加可靠。
试验例2:真实漏洞搜索
本发明同时还提供了一种跨指令集架构的二进制函数相似性检测框架BFS,该检测框架BFS由以下三个模块构成:数据预处理模块、函数语义特征提取模块和相似度计算模块。BFS的总体架构如图4所示,其中预处理模块用以对数据集进行预处理得到汇编指令序列;所述函数语义特征提取模块用以根据架构类型对Transformer模型分别进行训练得到对应的语义嵌入模型,将二进制函数的指令源序列输入到对应语义嵌入模型中,输出二进制函数的上下文语义矩阵,将上下文语义矩阵按列求和生成对应函数的嵌入向量;所述相似度计算模块用以将函数语义语义提取模块输出的嵌入向量进行计算得到两二进制函数的相似度。
利用二进制函数相似性检测框架BFS对实际的软件和路由器固件进行真实漏洞的搜索,将其与Multi-MH和Multi-k-MH方法作对比。具体是以心脏出血漏洞(CVE-2014-0160)作为待检测的真实漏洞,心脏出血漏洞是OpenSSL加密库中的一个漏洞,OpenSSL v1.0.1a-f及之前的版本和许多包含OpenSSL库的设备中都包含该漏洞。另外选择OpenSSL v1.0.1f源代码文件和路由器固件Netgear ReadyNAS-v6.1.6(ARM)的镜像文件作为待检测的文件。由于心脏出血漏洞位于tls1_process_heartbeat(TLS)和dtls1_process_heartbeat(DTLS)这两个函数,所示可以根据函数名在数据集Ⅰ中提取出两种指令集架构的(x86和ARM)漏洞函数TLS和DTLS。然后将漏洞函数以及由待检测文件编译出的二进制函数作为BFS模型的输入,通过嵌入向量相似性的计算,定位到待检测文件中真实的漏洞函数,返回一个漏洞排名的匹配表。漏洞搜索的结果如表2所示。
表2心脏出血漏洞搜索结果
其中,ARM→OpenSSL(x86)是指已知漏洞函数为ARM架构,在OpenSSL编译生成的x86架构的二进制函数中进行漏洞搜索,列表中的值表示待测二进制文件中真实漏洞函数在漏洞匹配表中的排名,排名越高说明漏洞检测效果越好。
由表2可以看出,BFS在X86→OpenSSL(ARM)和X86→ReadyNAS两种情况下的搜索效果更好。
试验例3:可视化
本试验例对BFS框架语义转换的效果进行可视化。从数据集Ⅰ中随机选取10个语义相似的二进制函数对,然后将其输入到BFS模型中分别得到各自的嵌入向量,通过计算嵌入向量的相似度,可以得到相似性的可视化效果图如图5所示。
从图5中可以观察到位于斜对角线上的二进制函数对的相似性取值最高,由此说明由BFS模型得到语义提取网络x86-Encoder和ARM-Encoder在对二进制函数做嵌入时能够保留较多的原始语义信息,而忽略目标体系架构,编译器及编译优化选项带来的影响。
Claims (6)
2.根据权利要求1所述的跨指令集架构的二进制函数相似性检查方法,其特征在于:步骤S1中预处理包括以下步骤:
S1、将内联函数扩展得到内联展开后的原函数,具体为:
(1)输入主函数f,运行getcallees(f)返回值给calleelist;
(2)对于每一个位于calleelist的被调用函数fc,如果被调用函数fc不在数据存储库列表,不进行处理;如果被调用函数fc为库函数则不进行内联展开;如果被调用函数的指令长度与主调函数指令长度之比且被调用函数指令总长度‖fc‖>numIns同样不进行内联展开,输出内联展开之后的原函数fI;
S2、生成二进制函数多序列,具体为:
(1)对二进制函数CFG进行采样,提取出所有的边;
(2)遍历每一条边,把该边的前序节点和后续节点进行拼接直至覆盖整个二进制函数内部所有节点;从而由一个二进制函数得到多个汇编指令序列f=(seq1,seq2,...,seqn),并将其作为模型的输入;
(3)将汇编指令标准化,包括对寄存器、对寻址内存的操作数、立即数以及对调用指令的跳转地址分别进行标准化。
3.根据权利要求2所述的跨指令集架构的二进制函数相似性检查方法,其特征在于:将汇编指令标准化具体为:
(1)根据寄存器的根据寄存器的种类对寄存器进行标准化:寄存器被分为pointerregisters和general registers两种类型,分别记为“%reg_pointer”和“%reg_gen”;
(2)对寻址内存的操作数进行标准化;把属于直接寻址的内存操作数、利用基址寄存器和变址寄存器寻址的操作数以及利用寄存器和位移寻址的操作数替换为统一标记“ADDRESS”;
(3)对立即数进行标准化:把所有的立即数替换为统一标记“IMM”;
(4)根据调用指令的类型对调用指令的跳转地址进行标准化:若跳转地址为函数名,把跳转地址统一为“FUNC”;若跳转地址为基本块名,把跳转地址统一为“BB”。
5.根据权利要求1所述的跨指令集架构的二进制函数相似性检查方法,其特征在于:F1架构为x86架构,F2架构为ARM架构,则对86-Encoder嵌入模型的预训练方法是将x86架构的二进制函数源序列S=(s1,s2,...,sm)和目标序列T=(t1,t2,...,tn)中的前k-1项T=(t1,t2,...,tk-1)预测目标序列的第k项tk的值,输出tk的条件概率分布,模型的损失函数为:
式中:n指目标序列的长度,l指目标序列所对应的词汇表的大小,p和q分别指真实值和预测值;
对ARM-Encoder语义嵌入模型的训练是将二进制函数的三元组(funcx86,funcarm,funcarm′)输入到ARM-Encoder模型中,模型的Decoder输出上下文语义矩阵Marm,对上下文语义矩阵Marm按列求和得到维度固定的嵌入向量Earm;ARM-Encoder的损失函数是基于边际距离的三元组损失函数,
L=max{D(Ex86,Earm)-D(Ex86,Earm′)+γ,0}
式中:Ex86,Earm,Earm′分别是三元组的嵌入向量,边际距离γ是一个大于0的超参数,运算D是指两个嵌入向量之间的欧式距离。
6.一种跨指令集架构的二进制函数相似性检测系统,其特征在于:包括数据预处理模块、函数语义特征提取模块和相似度计算模块,所述预处理模块用以对数据集进行预处理得到汇编指令序列;所述函数语义特征提取模块用以根据架构类型对Transformer模型分别进行训练得到对应的语义嵌入模型,将二进制函数的指令源序列输入到对应语义嵌入模型中,输出二进制函数的上下文语义矩阵,将上下文语义矩阵按列求和生成对应函数的嵌入向量;所述相似度计算模块用以将函数语义语义提取模块输出的嵌入向量进行计算得到两二进制函数的相似度。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110936947.3A CN113900923A (zh) | 2021-08-16 | 2021-08-16 | 一种跨指令集架构的二进制函数相似性检查系统及方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110936947.3A CN113900923A (zh) | 2021-08-16 | 2021-08-16 | 一种跨指令集架构的二进制函数相似性检查系统及方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113900923A true CN113900923A (zh) | 2022-01-07 |
Family
ID=79187742
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110936947.3A Pending CN113900923A (zh) | 2021-08-16 | 2021-08-16 | 一种跨指令集架构的二进制函数相似性检查系统及方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113900923A (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114047929A (zh) * | 2022-01-12 | 2022-02-15 | 广东省科技基础条件平台中心 | 基于知识增强的用户定义函数识别方法、装置及介质 |
CN114610606A (zh) * | 2022-02-25 | 2022-06-10 | 中国人民解放军国防科技大学 | 基于到达-定值分析的二进制模块相似性匹配方法及装置 |
CN114791811A (zh) * | 2022-05-17 | 2022-07-26 | 中国人民解放军国防科技大学 | 一种基于元函数模板的汇编器实现方法 |
CN115758164A (zh) * | 2022-10-12 | 2023-03-07 | 清华大学 | 二进制代码相似度检测方法、模型训练方法及装置 |
CN115906089A (zh) * | 2022-10-24 | 2023-04-04 | 中国人民解放军国防科技大学 | 一种基于二进制函数相似性的漏洞检测方法与系统 |
CN116578979A (zh) * | 2023-05-15 | 2023-08-11 | 软安科技有限公司 | 一种基于代码特征的跨平台二进制代码匹配方法及系统 |
CN116578979B (zh) * | 2023-05-15 | 2024-05-31 | 软安科技有限公司 | 一种基于代码特征的跨平台二进制代码匹配方法及系统 |
-
2021
- 2021-08-16 CN CN202110936947.3A patent/CN113900923A/zh active Pending
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114047929A (zh) * | 2022-01-12 | 2022-02-15 | 广东省科技基础条件平台中心 | 基于知识增强的用户定义函数识别方法、装置及介质 |
CN114610606A (zh) * | 2022-02-25 | 2022-06-10 | 中国人民解放军国防科技大学 | 基于到达-定值分析的二进制模块相似性匹配方法及装置 |
CN114610606B (zh) * | 2022-02-25 | 2023-03-03 | 中国人民解放军国防科技大学 | 基于到达-定值分析的二进制模块相似性匹配方法及装置 |
CN114791811A (zh) * | 2022-05-17 | 2022-07-26 | 中国人民解放军国防科技大学 | 一种基于元函数模板的汇编器实现方法 |
CN114791811B (zh) * | 2022-05-17 | 2024-04-12 | 中国人民解放军国防科技大学 | 一种基于元函数模板的汇编器实现方法 |
CN115758164A (zh) * | 2022-10-12 | 2023-03-07 | 清华大学 | 二进制代码相似度检测方法、模型训练方法及装置 |
CN115906089A (zh) * | 2022-10-24 | 2023-04-04 | 中国人民解放军国防科技大学 | 一种基于二进制函数相似性的漏洞检测方法与系统 |
CN115906089B (zh) * | 2022-10-24 | 2024-04-12 | 中国人民解放军国防科技大学 | 一种基于二进制函数相似性的漏洞检测方法与系统 |
CN116578979A (zh) * | 2023-05-15 | 2023-08-11 | 软安科技有限公司 | 一种基于代码特征的跨平台二进制代码匹配方法及系统 |
CN116578979B (zh) * | 2023-05-15 | 2024-05-31 | 软安科技有限公司 | 一种基于代码特征的跨平台二进制代码匹配方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113900923A (zh) | 一种跨指令集架构的二进制函数相似性检查系统及方法 | |
US11604956B2 (en) | Sequence-to-sequence prediction using a neural network model | |
CN109697162B (zh) | 一种基于开源代码库的软件缺陷自动检测方法 | |
Alayrac et al. | Unsupervised learning from narrated instruction videos | |
KR102342066B1 (ko) | 뉴럴 네트워크 모델을 이용한 기계 번역 방법, 장치 및 그 장치를 학습시키기 위한 방법 | |
CN112733137B (zh) | 一种面向漏洞检测的二进制代码相似性分析方法 | |
JP6727610B2 (ja) | 文脈解析装置及びそのためのコンピュータプログラム | |
JP2017519300A (ja) | ソフトウェアアナリティクスのためのシステム及び方法 | |
CN113672931B (zh) | 一种基于预训练的软件漏洞自动检测方法及装置 | |
CN110210032A (zh) | 文本处理方法及装置 | |
CN109299479A (zh) | 通过门控机制将翻译记忆融入神经机器翻译的方法 | |
CN108491228A (zh) | 一种二进制漏洞代码克隆检测方法及系统 | |
CN112596736B (zh) | 一种基于语义的跨指令架构二进制代码相似性检测方法 | |
Sellam et al. | Deepbase: Deep inspection of neural networks | |
CN110807335A (zh) | 基于机器学习的翻译方法、装置、设备及存储介质 | |
CN115146279A (zh) | 程序漏洞检测方法、终端设备及存储介质 | |
CN115168856A (zh) | 二进制代码相似性检测方法及物联网固件漏洞检测方法 | |
CN113591093A (zh) | 基于自注意力机制的工业软件漏洞检测方法 | |
CN115066674A (zh) | 使用源代码元素的数值数组表示来评估源代码的方法 | |
CN113536308B (zh) | 软件基因视角下多粒度信息融合的二进制代码溯源方法 | |
CN114115894A (zh) | 一种基于语义空间对齐的跨平台二进制代码相似性检测方法 | |
CN116595537A (zh) | 一种基于多模态特征的生成式智能合约的漏洞检测方法 | |
CN116595189A (zh) | 基于两阶段的零样本关系三元组抽取方法及系统 | |
CN112861131B (zh) | 基于卷积自编码器的库函数识别检测方法及系统 | |
CN115455945A (zh) | 基于实体-关系的漏洞数据纠错方法和系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |