论文学习_Trex: Learning Execution Semantics from Micro-Traces for Binary Similarity

news2025/5/14 15:42:26

摘要:检测语义相似的函数在漏洞发现、恶意软件分析及取证等安全领域至关重要,但该任务面临实现差异大、跨架构、多编译优化及混淆等挑战。现有方法多依赖语法特征,难以捕捉函数的执行语义。对此,TREX 提出了一种基于迁移学习的框架,通过函数的微型执行轨迹学习执行语义,并迁移用于语义相似函数匹配。尽管微型轨迹本身精度有限,TREX 的关键在于利用其训练模型理解指令序列语义。该方法设计了无监督预训练任务,无需人工标注或特征工程,并引入分层Transformer架构以捕捉语义信息。在超过147万函数的跨架构、优化和混淆测试中,TREX 分别比先进方法提升7.8%、7.2%、14.3%,且运行速度提高8倍。消融实验验证了预训练的重要性,案例研究亦发现16个未公开的漏洞。代码与数据已开源:https://github.com/CUMLSec/trex。

引言

函数语义相似性指的是衡量两个函数在行为层面上的相似程度,这一能力在程序分析中具有基础性地位,并在实际安全领域中发挥着广泛作用,包括漏洞检测、漏洞利用生成、恶意软件谱系分析和数字取证等。例如,OWASP 在 2020 年的十大应用安全风险中就将“使用存在已知漏洞的组件”列为主要威胁之一。因此,在大规模软件项目中自动识别语义相似的易受攻击函数,能够显著减少人工审计的工作量。研究背景

在面向安全关键应用(如漏洞发现)进行语义相似函数匹配时,研究对象往往是二进制级别的软件,例如商用固件或遗留程序。但这一任务本身存在诸多困难:(1)函数在编译过程中会丢失高级语义信息,如数据结构定义等,使得分析难度大幅上升。(2)更为复杂的是,函数可能被编译用于不同的指令集架构,并经过多种编译优化或轻量级混淆处理,这进一步加剧了语义相似性识别的挑战。语义相似函数任务的挑战

近年来,基于机器学习的方法在应对上述挑战方面展现出巨大潜力。通过从函数二进制中学习稳健的特征,这类方法能够在不同体系结构、编译优化等级,甚至某些混淆情况下识别出语义相似的函数。其核心思路是让模型从函数中学习表示向量(即嵌入表示),然后通过两个函数嵌入之间的距离来衡量它们的相似度——距离越小,表示函数越相似。相比于依赖手工特征(如基本块数量)的传统签名方法,这类基于嵌入距离的策略已在多个研究中取得领先效果,表现优于早期技术。更重要的是,该策略在大规模函数匹配任务中极具优势,查找百万级函数仅需约0.1秒,效率极高。基于机器学习的语义相似函数检测


尽管已有方法取得了显著进展,但在处理语法和结构差异较大的语义相似函数时,匹配准确性仍面临挑战。其根本原因在于,代码的语义本质上是由其运行时行为决定的。然而,现有所有基于学习的方法都未考虑程序的执行语义,它们仅基于静态代码进行训练。这种训练方式容易使模型依赖于表层模式进行匹配,一旦这些模式发生变化或不存在,模型的准确性便会显著下降。核心思想,代码的语义本质上是由其运行时行为决定的

例如,考虑这样一对 x86 指令序列:mov eax, 2; lea ecx, [eax+4]mov eax, 2; lea ecx, [eax+eax*2],它们在语义上是等价的。但若一个机器学习模型仅关注语法特征,可能会因为两者共享如 moveaxleaecx 等相同子串,而错误地认为这是它们相似的主要依据。实际上,这种模式并未真正体现两者在语义上的等价关系。若模型无法理解大致的执行语义,就很容易依赖这些表面模式进行匹配,而忽略了本质原因:当 eax 为 2 时,[eax+eax*2][eax+4] 实际上计算的是相同的内存地址。现存问题,现有技术无法捕获代码运行时特征

现有的动态方法试图通过直接比较函数的运行时行为来规避静态分析中的局限性,以判断其语义相似性。然而,由于精准构造能够触达目标函数的输入是一项极具挑战且耗时的任务,相关研究通常采用“弱约束动态执行”的方式,即随机初始化函数的输入状态(如寄存器、内存)并直接执行目标函数。尽管这种方式避免了输入生成的复杂性,但若直接利用其生成的执行轨迹来判定函数相似性,往往会导致大量误报。例如,当两个本质不同的函数都对输入有严格检查时,随机输入可能频繁触发类似的浅层异常处理逻辑,从而使它们在行为上看起来“伪相似”。解释为什么不通过动态的方式实现运行时特征捕获

现有的静态方法和动态方法均存在问题


本文提出了一种名为 TREX(TRansfer-learning EXecution semantics)的方法,通过弱约束动态轨迹训练机器学习模型,从中学习指令在上下文中的近似执行语义。与以往直接利用这些轨迹进行相似性判断的方法不同,TREX 首先在多样化的轨迹数据上进行预训练,使模型掌握每条指令在特定上下文中的行为效果;随后再将预训练中获得的知识迁移用于语义相似函数的匹配任务。大量实验证明,这种对执行语义的近似学习在预训练阶段显著提升了语义相似函数匹配的准确性,尤其在跨体系结构、编译优化和混淆环境下,TREX 表现尤为突出。

核心观点在于,尽管弱约束动态执行轨迹中可能包含大量不可达的程序状态,但其中的许多指令仍然能够准确反映其真实的执行效果。因此,可以通过大量来自不同函数的轨迹数据,让机器学习模型观察并学习这些指令在实际上下文中的行为。一旦模型掌握了各类指令的大致执行语义,便能利用这些已学习的知识,进一步训练模型以实现语义相似函数的匹配。这样,在实际推理阶段,无需动态执行待匹配的函数,大幅降低了运行时开销。更重要的是,训练完成的模型在进行函数匹配时并不依赖动态轨迹本身,而是直接使用函数指令作为输入,但这些指令已通过预训练被赋予了丰富的语义信息。

在这项工作中,研究者将“微执行”(micro-execution)技术加以拓展,作为一种弱约束动态执行形式,用于在多种指令集架构下生成函数的“微轨迹”。所谓微轨迹,是由一系列对齐的指令及其对应的程序状态值构成的序列。模型的预训练则基于大量从不同函数中采集的微轨迹数据,采用掩码语言建模(masked LM)任务进行。该任务会随机遮盖序列中的部分信息,并要求模型根据上下文预测被遮盖的内容,从而迫使模型在推理缺失值的过程中学习函数的近似执行过程,无需依赖任何人工特征设计即可自动提取执行语义。此外,masked LM 是一种完全自监督的训练方式,因此 TREX 可以灵活地利用任意来源的函数数据持续进行训练与优化。

为实现这一目标,TREX 采用了一种分层式 Transformer 架构,专门用于学习函数的近似执行语义。不同于以往方法通常将数值信息视作无实际意义的占位符以规避庞大的词汇表规模,这一架构则显式建模微轨迹中的数值内容,从而更有效地捕捉那些可能蕴含关键语义的数值之间的依赖关系。此外,其自注意力机制经过特别设计,能够高效建模序列中的长距离依赖,使得 TREX 能够处理约 170 倍于现有模型长度的序列,并实现约 8 倍的运行加速,这对于从长执行轨迹中学习函数嵌入表示至关重要。

内容概述

挑战性案例:使用三个语义上等价但语法上不同的函数对证明仅从静态代码学习的一些挑战。

  • 跨架构匹配:它们都取某个寄存器的低12位,并将其与0x80进行比较。要识别这种语义相似性,不仅需要理解 x86 架构中的 and 指令与 ARM 架构中的 lsl/lsr 指令的大致执行语义,还需要掌握代码中具体数值(如 0xfff 和 0x14)在指令中的操作方式。然而,现有的机器学习方法大多仅基于静态代码进行训练,无法观测每条指令的实际运行效果。更进一步,由于完整引入所有可能的内存地址会导致词汇表规模过大,这些方法通常会将寄存器值和内存地址统一替换为抽象符号,结果无法利用关键的字节数值来判断底层的语义相似性。
  • 跨优化匹配[ebp+8][esp+4] 实际上访问的是同一内存地址——即调用者压入栈中的第一个函数参数。要识别这种相似性,模型需理解 push 指令会将栈指针 esp 向下移动4个字节;同时也要意识到第2行的 mov 指令将此时减少后的 esp 赋值给了 ebp,从而使得上方函数中的 ebp+8 与下方函数中的 esp+4 等价。然而,这类动态行为在静态代码中是无法直接体现的。
  • 简单混淆匹配:其本质是将 eax+1 替换为 eax-(-1)。要识别这种语义等价性,模型必须能够大致理解诸如 xorsubadd 等算术操作的执行行为。然而,静态代码本身并不足以揭示这些底层算术语义的等价关系。

微轨迹上训练语言模型:本节主要阐述了为何在函数的微轨迹上执行掩码语言建模(masked LM)预训练任务,能够有效促使模型学习其执行语义。尽管目前仍难以从理论上明确证明此类语言建模任务具体学习到了哪些类型的知识,但重点在于理解其背后的直觉逻辑:通过预测微轨迹中被遮盖的代码和数值,模型被迫去推理缺失信息在当前上下文中的合理性,这一过程正是促使模型掌握指令执行语义的关键

Masked LM:针对函数的微轨迹(包含指令和对应的值),随机遮盖其中部分内容,并训练模型根据未被遮盖的信息预测被遮盖的部分。由于这一过程仅依赖输入数据本身进行预测,完全不需要额外的人工标注,因此 TREX 可以利用大量自然获取的函数数据进行训练与持续优化。这种方式的优势在于,即使某条指令未在某个函数的微执行中出现,它很可能会出现在其他函数的微轨迹中,从而帮助 TREX 逐步掌握更广泛指令的执行语义,实现对多样化指令行为的近似建模。

Masking register:以图2c中的函数为例,这两个函数本质上都将栈中位置 [rbp-0x2c] 的值加一。上方函数采用了直接方式:将该值加载到 eax,加1后再写回栈中;而下方函数则使用了更曲折的方法,先将 -1 存入 ecx,然后通过 eax 减去 ecx 来实现加1的效果,最终同样将结果写回栈。研究人员在上方函数的第3行对 eax 进行了掩码处理,结果发现预训练模型能够准确预测出该寄存器的名称和动态值。这说明模型不仅理解了 add 指令的语义,还能根据第2行的 eax 值推断出加法后的结果。同样地,模型也能恢复下方函数第4行的 ecx 和第5行的 eax 值,表明其掌握了 xorsub 指令的执行效果。正是这种对底层语义的理解,在后续用于函数匹配的微调阶段,大幅增强了模型的鲁棒性,使其更倾向于依据执行行为而非表层语法特征来判断函数相似性。

Masking opcode:除了对寄存器及其值进行掩码外,还可以对指令的操作码(opcode)进行掩码处理。要正确预测被遮盖的操作码,模型必须理解各类操作码的执行效果。以图2b为例,在上方函数第2行将 mov 操作码遮盖后,预训练模型最终以最高概率预测出 mov,而非其他可能的候选指令如 addinc 等。要实现这一正确预测,模型需掌握函数语义中的多个关键点:首先,从上下文信息来看,比如第3行中 ebp 的值和第2行中 esp 的状态,模型能推断出 mov 最符合语义,因为它完成了将 esp 的值赋给 ebp 的操作;而其他指令则因其执行效果与后续寄存器状态不符而被排除。这表明模型已近似掌握了 mov 的执行语义。其次,模型也学习了 x86 指令的一般语法规则和调用约定,例如只有部分操作码支持两个操作数(如 ebp, esp),这使得模型能自动排除像 pushjmp 这类语法不合法的候选项。因此,模型能够进一步推断出上方函数第3行中的 ebpesp 值相等,同时还可能从其他训练样本中学到 push 会使栈指针 esp 减少4字节。正因如此,在经过微调用于函数匹配时,模型更有可能根据 [ebp+8][esp+4] 实际访问的是相同地址这一语义等价性进行判断,而不是依赖两段代码在语法上的相似性。

Other masking strategies:需要注意的是,在掩码操作中,并不受限于指令中被遮盖元素的数量或类型——既可以对寄存器、操作码等单个元素进行遮盖,也可以遮盖整条指令,甚至是连续的一段指令序列,还可以随机遮盖某些指令的输入输出值。更进一步,模型在每轮训练以及不同样本之间,都会动态选择不同的代码块和程序状态子集进行掩码操作。这样的设计使模型能够学习到多样化、复合型的指令序列执行效果,这对于识别使用不同指令实现的语义相似函数至关重要。在本研究中,采用的是一种完全随机的掩码策略,以固定比例在微轨迹中选取掩码位置(具体细节见第IV-C节)。不过,这也为后续研究提供了一个有趣方向,即探索如何以更高效但仍廉价的方式,动态优化掩码位置与比例,从而进一步提升模型效果。

研究内容

微轨迹语义:研究团队基于 Godefroid 提出的微执行方法进行了扩展,使其不仅支持原论文所描述的 x86,还适用于 x64、ARM 和 MIPS 架构。接下来的内容简要说明了如何对单个函数二进制进行微执行,并重点介绍了处理不同类型指令时所采用的关键算法。为了统一不同架构汇编语法的差异,文中引入了一种低层次的中间表示(IR)语言,用于建模函数的汇编代码,如下图所示。需要强调的是,这种 IR 仅用于阐述微轨迹生成过程的核心机制;在实际实现中,使用的是真实的汇编指令,并经过分词处理后作为模型输入。中间表示值得学习

微轨迹算法:首先,它会初始化内存以加载目标函数 f 的代码及其对应的栈空间,随后初始化除特殊用途寄存器(如栈指针、程序计数器)以外的所有通用寄存器。接下来,系统以线性方式依次执行函数中的指令;若执行过程中指令涉及内存读写操作,则按需映射相应内存地址;对于读取操作,还会在目标地址中初始化一个随机值。遇到调用或跳转指令时,系统会检查其目标地址,跳过无效的调用或跳转,这种处理方式被称为“强制执行”。通过绕过无法抵达的跳转路径或调用指令,系统能够持续执行函数至末尾,从而暴露更多潜在行为,例如规避由输入检查引发的异常。至于 nop 指令,由于其常用于函数内的填充操作,处理时则直接跳过。当函数所有指令执行完毕、遇到 ret 指令,或达到超时时间时,微执行过程即告终止。图13和图14展示了两个真实函数的微轨迹示例。

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

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

相关文章

在VirtualBox中安装虚拟机后不能全屏显示的问题及解决办法

在VirtualBox中安装Windows或Linux虚拟机后,将遇到启动虚拟机后,只能在屏幕中的一块区域里显示虚拟机桌面,却不能全屏显示的问题。要解决此问题,需要在虚拟机中安装与VirtualBox版本相对应的VBox GuestAdditons软件。 这里…

element-ui分页的使用及修改样式

1.安装 npm install element-ui -S 2.在main.js中引入,这里是全部引入,也可以按需引入 import ElementUI from element-ui import element-ui/lib/theme-chalk/index.css Vue.use(ElementUI) 3.使用 layout"prev, pager, next, jumper" :jumpe…

从数据中台到数据飞轮:数字化转型的演进之路

从数据中台到数据飞轮:数字化转型的演进之路 数据中台 数据中台是企业为整合内部和外部数据资源而构建的中介层,实现数据的统一管理、共享和高效利用,目标是打破信息孤岛,提高数据使用效率,支持业务决策和创新 实施成本…

2025年5月-信息系统项目管理师高级-软考高项一般计算题

决策树和期望货币值 加权算法 自制和外购分析 沟通渠道 三点估算PERT 当其他条件一样时,npv越大越好

zst-2001 上午题-历年真题 算法(5个内容)

回溯 算法 - 第1题 找合适的位置,如果没有位置就按B回家 d 分治 算法 - 第2题 b 算法 - 第3题 a 算法 - 第4题 划分一般就是分治 a 算法 - 第5题 分治 a 0-1背包 算法 - 第6题 c 算法 - 第7题 最小的为c 3100 c 算法 - 第8题 …

udp多点通信和心跳包

刷题 # UDP多点通信核心要点## 基础通信模式### 单播通信- 一对一通信方式- UDP默认通信模式- 地址指向具体目标主机### 广播通信- 一对多通信机制- 地址范围:xxx.xxx.xxx.255- 仅限局域网传输- 需设置SO_BROADCAST标志### 组播通信- 多对多群组通信- 地址范围&…

音视频学习:使用NDK编译FFmpeg动态库

1. 环境 1.1 基础配置 NDK 22b (r22b)FFmpeg 4.4Ubuntu 22.04 1.2 下载ffmpeg 官网提供了 .tar.xz 包,可以直接下载解压: wget https://ffmpeg.org/releases/ffmpeg-4.4.tar.xz tar -xvf ffmpeg-4.4.tar.xz cd ffmpeg-4.41.3 安装基础工具链 sudo …

如何使用 Qwen3 实现 Agentic RAG?

今天,我们将学习如何部署由阿里巴巴最新Qwen 3驱动的Agentic RAG。 这里是我们的工具栈: CrewAI用于代理编排。 Firecrawl用于网络搜索。 LightningAI的LitServe用于部署。 顶部的视频展示了这一过程。 图表显示了我们的Agentic RAG流程&#xff1…

相机、雷达标定工具,以及雷达自动标定的思路

本篇我们来看一下自动驾驶传感器配置一个非常重要的模块,也就是传感器的标定。这里主要是对我之前修改的功能包的使用进行一个介绍. 对应的资源也已经上传了,0积分下载 安装 首先整个项目是使用ros1来进行启动的,但是要想正常编译,需要先安装三个对应的…

vsomeip环境搭建保姆级教程

vsomeip环境搭建保姆级教程 ubuntu环境搭建 {% links %} site: VMware搭建ubuntu保姆级教程 url: https://zhuanlan.zhihu.com/p/1903219373906327339 desc: flechazo image: https://q1.qlogo.cn/g?b=qq&nk=2861099&s=5 color: “#9d5b8b” {% endlinks %} vsomei…

我的MCP相关配置记录

1.VSCode的Cline中的MCP {"mcpServers": {"github.com/modelcontextprotocol/servers/tree/main/src/github": {"autoApprove": [],"disabled": false,"timeout": 60,"command": "cmd","args&quo…

我们来学nacos -- 集群nacos2.5.1mysql8.4

2.5.1集群搭建 架构下载解压到3个文件夹初始化数据库&数据迁移检查端口可用配置cluster.confapplication.properties 使用mysql8.4的jar启动db.num is null报错datasource错误成功 nginx反向代理集群查看 架构 其中包含3个nacos节点,然后一个负载均衡器代理3个…

Rollup入门与进阶:为现代Web应用构建超小的打包文件

我们常常面临Webpack复杂配置或是Babel转译后的冗余代码,结果导致最终的包体积居高不下加载速度也变得异常缓慢,而在众多打包工具中Rollup作为一个轻量且高效的选择,正悄然改变着这一切,本文将带你深入了解这个令人惊艳的打包工具…

专题四:综合练习( 找出所有子集的异或总和再求和)

以leetcode1863题为例 题目分析: 找到每个子集,然后子集中的元素异或之后全部相加 算法原理分析: 画决策树:第一层为这个子集有一个元素 第二层这个子集有两个元素 从上往下罗列,把所有子集都罗列出来&#xf…

STM32 修炼手册

第一章 计算机体系结构(了解) 后续在板子上开发的时候,需要考虑是否有操作系统 方式一:有操作系统,通过c库通过os api操作硬件方式二:无操作系统, 通过c库通过固件库操作硬件 第二章 STM32开发板概述 板子/开发板&…

缓存(2):数据一致性

概述 一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。 强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大弱一致性:这种一致性级别约束了系统在写入成功…

ppy/osu构建

下载 .NET (Linux、macOS 和 Windows) | .NET dotnet还行 构建:f5 运行:dotnet run --project osu.Desktop -c Debug

基于几何布朗运动的股价预测模型构建与分析

基于几何布朗运动的股价预测模型构建与分析 摘要 本文建立基于几何布朗运动的股价预测模型,结合极大似然估计与蒙特卡洛模拟,推导股价条件概率密度函数并构建动态预测区间。实证分析显示模型在标普500指数预测中取得89%的覆盖概率,波动率估…

python如何提取Chrome中的保存的网站登录用户名密码?

很多浏览器都贴心地提供了保存用户密码功能,用户一旦开启,就不需要每次都输入用户名、密码,非常方便。作为python脚本,能否拿到用户提前保存在浏览器中的用户名密码,用以自动登录呢?必须有,小爬…

Redis实现分布式获取全局唯一自增ID的案例。

【1】简易自增版本(从 1 开始 1,2,3,...) 项目结构 下面是一个基于 RedisTemplate 实现的分布式全局唯一自增 ID 生成器的案例。适用于 Java Spring Boot 环境,利用 Redis 的原子操作 INCR 指令。 ✅ 原理说明 Redis 提供的 INCR 命令是原子性的&…