论文阅读Neural Machine Translation Inspired Binary Code Similarity Comparison beyond Function Pairs

《Neural Machine Translation Inspired Binary CodeSimilarity Comparison beyond Function Pairs 》

论文地址:https://arxiv.org/pdf/1808.04706.pdf
NDSS 2019
1:背景
二进制代码分析允许在不访问源代码的情况下分析二进制代码。二进制代码用汇编语言表示。作者认为二进制代码分析和自然语言处理有相似之处,比如语义提取、分类和代码/文本比较。因此,借鉴了NLP的思想来解决代码相似性比较问题中两个重要的问题。(I)给定一对不同指令集体系结构(ISAs)的基本块,判断它们的语义是否相似;(II)给定一段代码,确定它是否包含在另一段不同ISA的代码中。这两个问题的解决方案有很多应用,如跨架构漏洞发现和代码剽窃检测。
作者认为目前论文主要解决第一个问题:给定一对函数,判断它们的相似性。现在考虑第二个问题:给定一个代码组件,可以是函数的一部分也可以是一个函数集,来判断是否被包含在一个程序中,这是一个代码包含问题。现有针对该问题的方法只能解决相同的指令集架构,所以解决跨架构的代码包含问题是目前急需解决的问题。
2:核心思想
利用NLP中Neural MachineTranslation (NMT)的思想将代码中的一条条指令看作单词,一个个基本块看作句子,将检测不同架构下两个基本块的语义相似性的任务转化为检测不同语言中两个句子语义的相似性。利用Word2vec将指令嵌入,利用LSTM将基本块进行向量嵌入,可以学习到指令的特征和基本块间指令的依赖关系,通过测量两个基本块之间的嵌入距离来检测他们的相似度。嵌入不仅可以对基本块语义进行编码,而且还可以捕获架构之间的语义关系。
3:细节
数据预处理:

  1. 数字常数值用0代替,负号保留
  2. 字符串蚊子用代替
  3. 函数名字用FOO代码
  4. 其他符号常量用代替

汇编语言的指令中包括操作数和操作码,该预处理操作数不变,将操作码进行替换
在这里插入图片描述
(1)单词嵌入
使用word2vec中skip-gram模型学习单词的嵌入,生成嵌入矩阵Wx86;每一行代表函数的一个基本块,每一行中的小方块代表当前基本块中的一条指令。
相当于将一条指令当作一个单词,将由指令流组成的基本块当作句子;训练结果是每个单词被学习为一个数字,每个句子被学习为一个向量。
======一个函数有多个基本块组成,经过单词嵌入 过程,每个基本块都学习成一个向量(最后这个函数就是由多个向量组成的矩阵来表示)
在这里插入图片描述
论文中也提到:d(e)表示指令嵌入维度,V是词汇表中不同指令的数量(所有不同的指令构成一个词汇表);W的第i列表示词汇表中第i个指令的嵌入
Q:每个句子中单词数目不一样,最后学习成的矩阵维度一样吗?这是否是与word2vec有关系?需要进一步了解word2vec

(2)句子嵌入(基本块嵌入)
生成基本块嵌入的直接尝试是简单地将(例如,求和)基本块中指令的所有嵌入组合起来。然而,此处理无法处理跨体系结构的差异,因为来自相同源代码但属于不同体系结构的指令可能具有非常不同的嵌入,作者举例说明图4中两个代码的源代码相同,经过不同体系结构处理,显然虽然这两段二进制代码在语义上是等价的,但由于指令集、CPU寄存器和内存寻址模式不同,它们看起来非常不同。基本的块嵌入生成应该能够处理这种语法变化
在这里插入图片描述
在自然语言处理中,LSTM将一个句子看作是一系列具有内部结构(即,依赖关系)的单词,它以递增的方式,从左到右,一个字一个字地对句子的语义向量进行编码。在每个时间步,一个新单词被编码,并且嵌入在向量中的单词依赖项被“更新”。当这个过程到达句子的末尾时,语义向量已经嵌入了所有单词及其依赖项,因此,可以将其视为整个句子的特征表示。这个语义向量就是句子嵌入。
受NMT模型启发,作者设计了一个Siamese architecture结构,每边都使用相同的LSTM,最后对于嵌入生成,每个LSTM单元在每个时间步上依次接受一个输入(对于第一层输入是一个指令嵌入),积累和传递越来越丰富的信息。当到达最后一个指令嵌入时,最后一层的最后一个LSTM单元提供基本块的语义表示,即,一个块嵌入。最后,将两个基本块的相似度度量为两个块嵌入的距离
在这里插入图片描述
简单来说指令嵌入将单词也就是利用word2vec每一条指令学习为一个数字,基本块的嵌入是在指令嵌入的基础上,利用LSTM学习每条指令间的依赖关系,将基本块进行向量嵌入,利用Siamese architecture网络结构的原理输出两个基本块的相似性度量。
(3)路径/代码组件相似性比较
由于作者认为一个关键的代码部分,可以插入到函数中以避免检测,所以该部分主要解决跨架构的代码包含问题。
首先将查询代码组件Q的CFG分解成多个path,path代表基本块。将Q中的每一个path(基本块)与T中的多个基本块进行比较,利用以基本块为序列元素的LCS动态规划算法计算一个路径相似度得分。将Q中每个path得分集中起来决定目标程序T的一个组件是否与Q相似。
路径相似性比较
这里的路径指的是线性无关的路径。这个概念在圈复杂度中使用,圈复杂度是一种代码复杂度的衡量方法,数量上表示为线性无关的路径条数,也表示判定条件的数量。

在这里插入图片描述
代码组件相似性比较
码组件嵌入到包含目标程序的位置是未知的,可以将其插入到函数的中间。确定正确的起点很重要,这样路径探索就不会被误导到目标程序中不相关的代码部分。与函数级代码相似性比较而言,这是一个独特的挑战。
寻找正确的起点(基本块)解决方法:
我们以如下方式寻找起始块。首先,将目标程序T的所有基本块的嵌入存储在一个对位置敏感的哈希数据库中,以实现高效的在线搜索。接下来,我们以查询代码组件Q中的第一个基本块作为起始块,并在数据库中搜索,以从目标程序T中找到语义上等价的基本块(SEBB),如果我们找到一个或多个SEBBs,我们将对每个SEBBs进行路径探索(第VI-A节)。否则我们从Q中选择另一个块作为起始块[37],并重复此过程,直到检查Q的最后一个块为止。
组件相似性得分。我们从Q中选择一组线性无关的路径,并计算每个线性无关路径的路径相似度分数。接下来,我们根据相应查询路径的长度为每个路径相似度评分分配一个权重。最后的组件相似度得分是加权平均得分。
4:实验评估
再补

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值