TREX
约 1731 个字 预计阅读时间 6 分钟
CONTENT
语义相似函数的匹配:
- 与高级编程语言相比,机器码的可读性较低,数据结构和算法的意图难以推测,尤其是在函数实现方式不同、架构不同、编译器优化和混淆等情况下,要在这种环境下检测函数间的相似性变得尤为困难。
- 大多数现有的方法只基于语法特征来匹配函数,忽视了代码的执行语义,这导致模型在语法变化时往往会匹配失败。
TREX方法概述:
- TREX提出了一种基于迁移学习(transer learning)的框架,自动从函数的“微跟踪”中学习执行语义。微跟踪是一种动态执行跟踪,捕捉了函数执行时的指令序列和相关的动态值。
- TREX的关键见解是,即使微跟踪中的动态执行信息在传统上被认为不够准确,但它们仍能为机器学习模型提供足够的信息,帮助模型学习指令序列的执行语义。
- 通过捕捉与平台无关的特征(即稳定特征),利用函数嵌入(embedding)之间的距离来计算相似性。这种方法优于传统的静态分析技术,后者主要通过比对字符串或寄存器的使用情况来推测相似性。然而,静态分析的缺陷在于它只能通过表面特征进行推测。
- 动态分析通过运行代码来推断函数的功能特征,但要找到合适的输入以触发函数的执行非常困难。传统方法通常通过生成随机输入数据来直接测试待测函数,但这种方法容易导致“假相似性”的问题。例如,如果两个函数都严格检查输入数据,那么随机数据大多会触发异常,而并不能反映函数的实际功能相似性。
主要方法:
- 预训练阶段:使用 Mask Machine Learning,通过随机掩盖微跟踪中的部分信息,让模型预测被掩盖的信息来学习执行语义。这种方法避免了人工标注,并且能从多架构、多优化的函数中学习。Mask 的策略:
- register:需要知道寄存器的值和操作码的含义
- opcode:也是需要知道每个操作码的作用
- other:可以直接抹掉一整句或者一段指令,可以在每个训练循环随机抹除。这篇论文是每次循环按照固定比例去随机抹除。
- 微跟踪的扩展:TREX扩展了微跟踪的方法,使其能够跨越不同的指令集架构生成微跟踪,并在各种函数上进行训练。这篇论文的核心方法有如下几点:
- IR Language:简单来说就是统一了不同架构下的汇编语言的表示
- 微追踪算法:线性地执行代码,跳过不可抵达的跳转和函数调用操作,保证程序能运行到底,记录这个过程中对内存的访问操作
- 输入处理:用操作码、值、位置、架构的序列来表示输入
- 神经架构设计:论文提出了一种层次化的Transformer模型,能够处理长序列并捕捉指令间的依赖关系,支持对跨架构、跨优化、混淆函数的语义匹配。
实验验证:
- 验证了模型对从多个热门开源代码库取样验证了多种架构、不同优化和不同混淆模式的机器码相似程度判定的运行效果。
- TREX在不同的架构、优化和混淆情况下均取得了比现有方法更好的匹配精度,特别是在跨架构匹配上提升了7.8%,优化匹配提升了7.2%,混淆匹配提升了14.3%。
- 实际应用中,TREX成功在180个固件图像中发现了16个未被披露的漏洞,展示了该方法的实际价值。
Relevant Knowledge
Transfer Learning
迁移学习(Transfer Learning)指的是将一个任务上学到的知识应用到另一个不同但相关的任务中。与传统机器学习模型从零开始训练不同,迁移学习通过在已有模型上进行调整,使得模型能够在新任务上表现得更好,尤其是在新任务数据量不足的情况下。
optimization
- O0:无优化,用于快速编译和调试。
- O1:基础优化,适合开发和调试环境。
- O2:平衡优化性能与编译时间,适合大多数生产环境。
- O3:最大化运行性能,但可能增加编译时间和二进制体积,适用于性能关键的应用。
obfuscation
obfuscation(混淆)是一种技术,主要用于使源代码或编译后的代码更难以理解或逆向。通过对代码进行混淆,编译器或者工具可以将可读性高、结构清晰的代码转换为一种复杂且难以理解的形式,而不改变代码的功能。这通常用于保护代码的知识产权、防止反编译或破解。
代码混淆常用手段: * 名称混淆:将有意义的类,字段、方法名称更改为无意义的字符串。 * 流混淆:用于if, switch, while,for等关键字,对字节码进行细微的修改,模糊控制流,而不改变代码在运行时的行为。 * 无用代码注入:加一些没有实际作用的代码来增加代码的复杂度和长度,干扰分析。
MLM
Masked Language Model (MLM) 是一种语言模型的训练方法,通常用于自监督学习的自然语言处理任务中。它的核心思想是通过掩蔽(masking)部分输入数据,然后让模型预测被掩蔽的词,从而学习词汇和上下文之间的关系。
传统的语言模型,比如前向语言模型(如 GPT),只能根据左边的上下文预测接下来的词,而 MLM 通过掩蔽部分输入,要求模型使用双向(左右两边)的上下文信息,从而捕捉更丰富的语义信息。这使得模型在处理需要全局上下文信息的任务时表现更好。
IR
IR (Intermediate Representation) 语言是一种介于高级编程语言(如C、C++、Python等)和机器语言(如汇编语言或字节码)之间的中间层表示。IR 通常被用于编译器中,将高级语言的源代码转换为更低级的表示,然后进一步优化和转换为目标机器代码。IR 语言能够以更抽象的方式描述程序,方便编译器进行各种优化。