【论文阅读笔记】jTrans(ISSTA 22)

个人博客地址

[ISSTA 22] jTrans(个人阅读笔记)

论文:《jTrans: Jump-Aware Transformer for Binary Code Similarity》

仓库:https://github.com/vul337/jTrans

提出的问题

  • 二进制代码相似性检测(BCSD)对于发现已知漏洞、恶意软件检测、软件抄袭检测、补丁分析以及软件供应链分析等众多应用至关重要。
  • 随着二进制程序数量的不断增加以及二进制分析任务的普遍性,迫切需要开发更具可扩展性和准确性的BCSD解决方案。
  • 现有方法仍存在一些局限性:
    • 首先,基于 NLP 的汇编语言建模只考虑指令的顺序和指令之间的关系,而不考虑程序的实际执行信息(如控制流)。因此,仅依赖 NLP 的方法将缺乏对所分析二进制文件的语义理解,也不能很好地适应编译器优化后代码可能发生的重大变化。
    • 其次,仅仅依靠 CFG 会遗漏每个基本块中指令的语义。部分解决方案使用 GNN 来处理 CFG,而 GNN 只能捕捉结构信息。GNN 的训练和并行应用也相对困难,这限制了其在现实世界中的应用。
    • 现有的数据集不够大或多样化,导致模型可能过度拟合,评估往往不能反映真实世界的案例。

方法

jTrans基于Transformer的模型,专门设计用于解决上述问题。

二进制函数表示建模

在jTrans 沿用了 BERT 用于文本建模的一般方法,即为每个token(即单词)创建嵌入,并使用 BERT 强大的注意力机制来有效地建模二进制代码。然而,二进制代码与自然语言在几个方面有所不同:

  1. 词汇量过多:二进制代码中有许多词汇(例如常量和字面量)。
  2. 跳转指令:二进制代码中存在跳转指令。对于跳转指令,将其操作数token表示为source token,指定跳转目标指令的地址。为简单起见,将目标指令的助记符token表示为target token,并表示这对跳转对为<source token, target token>。

因此,要应用BERT,需要解决以下两个问题:

  • 词汇表外(OOV)token:和NLP领域一样,需要在包含分析语料中最常见标记的固定大小词汇表上训练jTrans。不包含在词汇表中的标记需要以一种方式表示,使得Transformer能够有效地处理它们。
  • 建模跳转指令(Modeling jump instructions):二进制代码在预处理后,对于跳转对的source token和target token,留下的信息很少。BERT很难推断出它们之间的联系。这个问题由源和目标之间可能的大距离加剧,这使得上下文推断变得更加困难。

预处理指令(Preprocessing instructions)

旨在缓解词汇表外(OOV)问题。使用先进的反汇编工具IDA Pro 7.5来分析输入的二进制程序,生成汇编指令序列。为了规范化汇编代码并减小其词汇量,应用以下tokenization策略:

  • 使用助记符和操作数作为token

  • 将字符串字面量替换为特殊标记<str>

  • 将常量值替换为特殊标记<const>

  • 对于外部函数调用,保留它们的名称和标签作为标记,而将内部函数调用的名称替换为 <function>

    • 原因:外部函数调用反映了模块间的接口,并且在不同版本的二进制文件之间不会频繁更改,但内部函数调用则没有这种性质。
  • 对于每对跳转指令,用JUMP_XXX标记替换其source token(跳转目标的绝对或相对地址),其中XXX是这对跳转对中target token的为序。通过这种方式,可以消除二进制文件随机基址的影响。

为跳转指令建模(Modeling jump instructions)

jTrans采用了Transformer架构中的关键部分——位置编码(positional encodings)。位置编码使模型能够确定token之间的距离,通常距离越大,token之间的相互影响越弱。然而,跳转指令会将代码中可能相距很远的区域联系起来,因此jTrans修改了位置编码机制,以反映跳转指令的影响。通过**参数共享(parameter sharing)**来实现:

  • 对于每个跳转对,源标记的嵌入(见图 3 中的 E J U M P _ 14 E_{JUMP\_14} EJUMP_14)被用作目标标记(见 P 14 P_{14} P14)的位置编码。

    image-20240123160544181

    然后,每个token被转换为token embedding和position embedding,而其最终的输入嵌入则是这两个嵌入的总和。

    这种表示法实现了两个重要目标:首先,共享嵌入使Transformer能够识别source token和target token之间的上下文联系。其次,这种强上下文联系在训练过程中保持不变,因为shared parameters会同时为两个标记更新。

    对于间接跳转,尽管它们可能对控制流信息的表示也很重要,但如何识别间接跳转的目标仍是一个公开的挑战,目前尚未包含在jTrans的工作范围内。

提出方法的原理

jTrans模型的设计理念是通过共享跳转对(jump pair)中source token和target token之间的参数,从而在它们的表示中创建高度的相似性。这样做的结果是,当jTrans的注意力机制分配高权重给这些token之一(即确定它对理解或分析二进制代码很重要)时,它们也会自动给对应的配对token分配高权重。因此,这种表示确保了跳转指令的两部分——以及在代码中与它们相邻的指令——都将包括在推理过程中。

公式分析:

对于给定的二元函数 f = [ x 1 , ⋅ ⋅ ⋅ , x n ] f = [x_1, · · · , x_n] f=[x1,⋅⋅⋅,xn] x i x_i xi f f f 的第 i i i 个标记。所有token在输入 jTrans 之前将被转换为混合嵌入向量 E ( x 1 ) , ⋅ ⋅ ⋅ , E ( x n ) {E (x_1), · · ·, E (x_n)} E(x1),⋅⋅⋅,E(xn)。将第 m 层的嵌入表示为 E m = [ E m ( x 1 ) , ⋅ ⋅ ⋅ , E m ( x n ) ] E_m = [E_m (x_1), · · · , E_m (x_n)] Em=[Em(x1),⋅⋅⋅,Em(xn)]

  • image-20240123205236392
    • 这是标准的-Transformer模型中的注意力机制。模型首先计算查询( Q m Q_m Qm)、键( K m K_m Km)和值( V m V_m Vm)矩阵。注意力得分是通过查询和键的缩放点积计算得到的,然后对这些得分应用 S o f t m a x Softmax Softmax函数来获得概率分布,最后用这个分布来加权值矩阵,得到该层的注意力输出。
  • image-20240123205604570
    • 在有多个注意力头的情况下,每个头产生的更新嵌入 E m h + 1 E^h_m+1 Emh+1是通过应用注意力机制到相应的查询、键和值上获得的。这里的 h h h代表注意力头的编号。
  • image-20240123205738674
    • 在获取了所有注意力头的输出后,它们被连接在一起,并通过输出转换矩阵 W m O W^O_m WmO来获得下一层的嵌入表示 E m + 1 E_{m+1} Em+1。然后,这个表示通过一个前馈网络 F F N m FFN_m FFNm来进一步转换。
  • image-20240123211133057
    • jTrans的最终输出是模型最后一层的输出。函数嵌入 E f E_f Ef是通过将特殊标记<CLS>的嵌入与函数嵌入权重矩阵 W F W^F WF进行 T a n h Tanh Tanh非线性激活函数处理后获得的。
  • image-20240123211332073
    • 这个公式说明了source token i i i通常比其他任何token l l l给予target token j j j更多的注意力。 A i j A_{ij} Aij代表token i i i对token j j j的注意力权重,而 A i l A_{il} Ail代表token i i i对token l l l的注意力权重。
    • 在Appendix部分有对这个公式的具体注明,我还没细看
预训练模型

第一个任务:掩码语言模型任务(The Masked Language Model Task, MLM)

  • 它使用了BERT的掩码策略,其中80%的选择标记被一个特殊的<MASK>标记替换,10%被其他随机标记替换,剩下的10%保持不变。MLM任务的目标是重构这些被掩盖的标记,其目标函数公式如下:
    min ⁡ Θ L M L M ( Θ ) = ∑ i − log ⁡ P ( x i ∣ f m l m ) \min_{\Theta} L_{MLM}(\Theta) = \sum_{i} -\log P(x_i | f_{mlm}) minΘLMLM(Θ)=ilogP(xifmlm)
    其中 f m l m f_{mlm} fmlm代表含有掩码标记的函数, Θ Θ Θ代表模型参数, i i i是被掩码的标记的索引。

    - Θ \Theta Θ:代表模型的参数。优化这个目标函数意味着我们想要调整模型的参数以最小化损失函数的值。

    - L M L M ( Θ ) L_{MLM}(\Theta) LMLM(Θ):是损失函数,特定于MLM任务。这个函数衡量的是模型对于被掩码标记正确预测的准确性。这个值越低,表示模型的预测越准确。

    - ∑ i \sum_{i} i:表示对所有被掩码的标记进行求和。这意味着我们会计算每个被掩码标记的预测损失,并将它们加起来得到总损失。

    - − log ⁡ P ( x i ∣ f m l m ) -\log P(x_i | f_{mlm}) logP(xifmlm):是对给定的掩码序列 f m l m f_{mlm} fmlm 中第$ i$ 个被掩码标记的负对数似然。这里的$ P(x_i | f_{mlm})$ 表示模型预测实际标记$ x_i$ 的概率。

    - f m l m f_{mlm} fmlm:是经过掩码处理后的函数或代码序列。在这个序列中,一些标记被特殊的 <MASK> 标记替换,模型需要预测这些标记原来的值。

第二个任务:跳转目标预测任务(Jump Target Prediction, JTP)

  • JTP任务要求模型预测给定source token的target token。这个任务对于模型来说很有挑战性,因为它需要模型深入理解CFG。JTP任务通过先选择一部分可用的跳转source token,然后用<LOC>替换这些token来进行。JTP任务的目标函数可以表述为:
    m i n Θ L J T P ( Θ ) = ∑ i − log ⁡ P ( x i ∣ f j t p ) min_{\Theta} L_{JTP}(\Theta) = \sum_{i} -\log P(x_i | f_{jtp}) minΘLJTP(Θ)=ilogP(xifjtp)
    其中 f j t p f_{jtp} fjtp代表含有<LOC>token的函数, i i i是跳转符号的位置集合。

预训练阶段jTrans的总体损失函数是MLM和JTP目标函数的和:
m i n Θ L P ( Θ ) = L M L M ( Θ ) + L J T P ( Θ ) min_{\Theta} L_{P}(\Theta) = L_{MLM}(\Theta) + L_{JTP}(\Theta) minΘLP(Θ)=LMLM(Θ)+LJTP(Θ)

二进制相似性检测的微调

目标是训练jTrans最大化相似二进制函数对之间的相似性,同时最小化不相关函数对的相似性。使用余弦相似度作为函数相似性的度量。

目标函数:
m i n θ L F ( θ ) = ∑ ( f , g + , g − ) ∈ D max ⁡ ( 0 , ϵ − cos ⁡ ( E f , E g + ) + cos ⁡ ( E f , E g − ) ) min_{\theta} L_{F}(\theta) = \sum_{(f,g^+,g^-) \in \mathcal{D}} \max(0, \epsilon - \cos(E_f, E_{g^+}) + \cos(E_f, E_{g^-})) minθLF(θ)=(f,g+,g)Dmax(0,ϵcos(Ef,Eg+)+cos(Ef,Eg))
其中 θ \theta θ 表示模型参数, ϵ \epsilon ϵ 是一个超参数(通常在0到0.5之间选择), E f E_f Ef E g + E_{g^+} Eg+ E g − E_{g^-} Eg 分别表示函数 f f f、相似函数 g + g^+ g+ 和不相关函数 g − g^- g 的嵌入向量。这个目标函数试图确保查询函数 f f f 的嵌入与相似函数 g + g^+ g+ 的嵌入的余弦相似度比与不相关函数 g − g^- g 的余弦相似度大 ϵ \epsilon ϵ

大规模数据集的构建

数据集是基于ArchLinux官方仓库和Arch用户仓库构建的。

  • 出于编译兼容性的考虑,选择了C/C++项目来构建数据集。(根据PKGBUILD文件判断)

  • 修改后的编译器会更改与优化级别相关的命令行参数,并将预期的编译参数附加到原始参数中。

  • 收集标签需要首先获取unstripped的二进制文件并获取函数的偏移量。许多实际项目在编译过程中会调用strip。故用修改后的strip版本替换了strip,无论传入参数如何,它都不会剥离符号表。

实验和效果

BinaryCorp数据集:包含了由自动编译管道生成的大量二进制文件。这些文件是基于官方ArchLinux包和Arch用户仓库使用gcc和g++编译的,其中包含了48,130个不同优化级别的二进制程序。

image-20240124184047031

image-20240124183745240

二进制相似性检测性能

jTrans明显优于baseline

池大小对性能的影响

随着池大小的增加,所有基准模型的相对性能均不如jTrans。此外,jTrans的性能没有出现急剧下降,而基准模型的性能在池大小达到100时通常会更快地下降。(详见论文Figure 6)

现实世界的漏洞搜索

对一个已知漏洞数据集中的八个CVE(公共漏洞和曝光)进行了漏洞函数搜索。为每个函数制作了10个不同编译器(gcc、clang)和不同优化级别的变体。评估指标为recall@10。

image-20240124184618667

Jump-aware设计的影响

研究团队训练了一个标准的BERT模型,该模型不使用跳转信息的表示,并将其与jTrans进行比较。

在BinaryCorp3M数据集上,使用池大小为10,000的Recall@1指标评估了标准BERT模型和jTrans。评估结果表明,标准BERT的性能显著低于jTrans,jTrans平均优于BERT 7.3%。

另外,在BinaryCorp-3M数据集上进行的实验显示,jTrans能够高效地预测跳转位置。预训练模型可以以92.9%的top-1准确率和99.5%的top-10准确率预测跳转指令的目标。

预训练的有效性

为了评估预训练方法(包括掩蔽语言模型(MLM)和跳转目标预测(JTP))的有效性,研究团队评估了一个未进行任何微调的模型版本,称为jTrans-zero。

即使没有微调,jTrans-zero在池大小为10000的设置中仍然超过了所有基准模型。

在池大小为32的设置中,jTrans-zero超过了除SAFE以外的所有基准模型

结论

在讨论中,作者指出:尽管jTrans目前专注于x86架构,但提出的技术也可应用于其他架构。

在现实世界场景中,池大小可能会更大。直接以两个二进制函数作为输入的模型可能更好地捕获函数间关系,即使在大型池中也能进一步提高BCSD的性能。然而,直接比较两个函数的模型训练将具有更高的开销。如何在实际BCSD任务中平衡jTrans的准确性和开销,将作为未来的研究工作。

这项工作提出了jTrans,这是首个将控制流信息嵌入基于Transformer的语言模型的解决方案。该方法采用了一种新颖的跳转感知架构设计,不依赖于图神经网络(GNNs)。自注意力的理论分析证明了设计的合理性。实验结果表明,该方法在二进制代码相似度检测(BCSD)任务上始终大幅度超过现有最先进方法。通过深入评估,作者还发现了当前最先进方法评估中的弱点。此外,作者还向社区呈现并发布了一个新创建的数据集,名为BinaryCorp。该数据集包含了迄今为止最大量的多样化二进制文件,作者相信它可以作为未来这一领域研究的高质量基准。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/10335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024数维杯数学建模B题完整论文讲解(含每一问python代码+结果+可视化图)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024数维杯数学建模挑战赛生物质和煤共热解问题的研究完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 B题论…

数学学习笔记1——二次函数中的数形结合

二次函数中的数形结合 一、解一元二次不等式 基本方法&#xff1a;配方。 x 2 − 4 x 3 < 0 → ( x − 2 ) 2 < 1 → ∣ x − 2 ∣ < 1 → 1 < x < 3 x^2-4x3<0\to(x-2)^2<1\to\lvert x-2\rvert<1\to1<x<3 x2−4x3<0→(x−2)2<1→∣x−…

VBA_MF系列技术资料1-605

MF系列VBA技术资料1-605 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-0…

具备教学意义的实操(用队列实现栈)

225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/implement-stack-using-queues/description/ 实现逻辑 一个是先进先出&#xff08;队列&#xff09;&#xff0c;一个是后进先出&#xff08;栈&#xff09; 这里用两个队列导入一下数据…

项目管理 | 如何做好项目管理?

大部分人在做项目管理时会遇到以下问题&#xff1a; 团队沟通不畅&#xff0c;对于项目的各个环节和配合方无法掌控项目的任务分配和跟踪困难&#xff0c;项目进度不透明项目上线进度慢&#xff0c;没有威信难以服众 那项目管理怎么做&#xff1f;这篇就结合简道云团队的经验…

爬虫学习:XPath提取网页数据

目录 一、安装XPath 二、XPath的基础语法 1.选取节点 三、使用XPath匹配数据 1.浏览器审查元素 2.具体实例 四、总结 一、安装XPath 控制台输入指令&#xff1a;pip install lxml 二、XPath的基础语法 XPath是一种在XML文档中查找信息的语言&#xff0c;可以使用它在HTM…

数据结构----二叉树

博主主页: 码农派大星. 关注博主带你了解更多数据结构知识 1. 树型结构 1.1 概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上…

【软考】模拟考卷错题本2024-05-11

1 设计模式- 适配器模式 基本上上述的图解已经涵盖了绝大多数主流的设计模式和其特点。理解记忆下即可&#xff0c;这里对下午的考题也有帮助的。 2 计算机组成原理 cpu 访问速度 这个真的是憨憨咯~看到内存就选内存&#xff0c;题目都没审好。这里的速度比cpu内部的要比外部的…

c++ STL 之栈—— stack 详解

vector 是 stl 的一个关联容器,名叫“栈”&#xff0c;何为“栈”&#xff1f;其实就是一个数组&#xff0c;但有了数组何必还需栈&#xff0c;这是一个高深的问题。 一、简介 1. 定义 栈&#xff0c;是一个柔性数组&#xff08;可变长数组&#xff09;&#xff0c;可以变大变小…

Centos7安装图形化界面

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; Centos7安装图形化界面https://myweb.myskillstree.cn/43.html 目录 一、安装GNOME桌面 二、开机自启动修改为命令行模式 三、卸载图形化界面 一、安装GN…

【C++】string类的使用③(修改器Modifiers || 非成员函数重载Non-member function overloads)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 前言&#x1f525;修改器&#xff08;Modifiers&#xff09;**operator**appendpush_back和pop_backassigninserterasereplaceswap &#x1f525;非成员函数重载&#xff…

Java入门基础学习笔记4——开发Helloworld入门程序

Java程序开发的三个步骤&#xff1a; 1&#xff09;编写代码 2&#xff09;编译代码 3&#xff09;运行代码 注意事项&#xff1a; 第一个java程序建议使用记事本来编写。 建议代码文件名全英文、首字母大写、满足驼峰模式&#xff0c;源代码文件的后缀必须是.java 注意&a…

栈实现队列

一、分析 栈的特点是先出再入&#xff0c;而队列的特点为先入先出&#xff0c;所以我们创造两个栈&#xff0c;一个用来存放数据&#xff0c;一个用来实现其它功能此时栈顶为队尾&#xff1b;当要找队头数据时将前n-1个数据移入到另一个栈中&#xff0c;此时剩余那个数据为队头…

Sqlite在Mybatis Plus中关于时间字段的处理

我的个人项目中&#xff0c;使用Mybatis-Plus 和 Sqlite数据库&#xff0c; 但是在存储和查询时间字段的时候&#xff0c;总是出现问题&#xff0c;记录下我解决问题的过程。 Sqlite会默认把时间字段转成时间戳存储到数据库的字段中&#xff0c;看起来不直观&#xff0c;所以我…

在Linux上安装并运行RabbitMQ

目录 准备CentOS服务器 下载rabbit-server和erlang文件 启动RabbitMQ服务 准备CentOS服务器 两个命令&#xff0c;选一个能用的&#xff0c;查看CentOS服务器的版本 lsb_release -a下载rabbit-server和erlang文件 参考文章&#xff1a;http://t.csdnimg.cn/t8BbM 1、创建新…

Python专题:八、列表(3)

列表的场景应用 统计和肺考试成绩 >不支持字符串和整数之间的比较 sort()函数从小到大排列 reverse&#xff08;&#xff09;函数从大到小排列 列表推导式 字符串列表的转化&#xff0c;join&#xff08;&#xff09;函数列表生成字符串 split&#xff08;&#xff09;函…

黑马程序员HarmonyOS4+NEXT星河版入门到企业级实战教程【18~23】

视频0~17的笔记 页面路由 实现不同页面之间的跳转和数据传递。 页面栈。上限是32个页面&#xff0c;使用router.clear()可以清空页面栈释放内存。 两种跳转模式&#xff1a; 参数一致&#xff0c;都是三个参数 router.pushUrl()&#xff0c;新页面压入页面栈&#xff0c;可以…

keep健身小程序基于FastAdmin+ThinkPHP+UniApp(源码搭建/上线/运营/售后/更新)

基于FastAdminThinkPHPUniApp&#xff08;目前仅支持微信小程序和公众号&#xff09; 开发的健身相关行业微信小程序&#xff0c;程序适用于健身房、瑜伽馆、游泳馆、篮球馆等健身培训场所。平台拥有课程售卖、课程预约、多门店管理、私教预约、教练端、会员卡办理、在线商城、…

【35分钟掌握金融风控策略20】贷前风控策略详解-5

目录 反欺诈模型体系和模型在策略中的应用 申请反欺诈评分卡模型 欺诈传导模型 欺诈团伙识别模型 GPS评分卡模型 如何在贷中应用贷前模型 反欺诈模型体系和模型在策略中的应用 反欺诈横型体系主要包括识别个体欺诈和识别团伙欺诈的两类模型。在贷前&#xff0c;常用的识别…

【3dmax笔记】036:FDD修改器

一、FDD修改器简介 FDD修改器是对模型进行变形处理的命令,FDD后面的数字越大,编辑节点越多,编辑越精细,但是FDD控制点多的同时,模型上的节点也要多才可以。 FFD修改器是一种非常灵活的修改器,可以让我们对模型进行自由的变形操作。通过在FFD修改器中设置变形点,我们可…