ViC: Virtual Compiler Is All You Need For Assembly Code Search
作者: Zeyu Gao, Hao Wang, Yuanda Wang, Chao Zhang
分类: cs.SE, cs.AI, cs.CL
发布日期: 2024-08-10
💡 一句话要点
提出ViC:利用虚拟编译器进行汇编代码搜索,提升逆向工程效率
🎯 匹配领域: 支柱九:具身大模型 (Embodied Foundation Models)
关键词: 汇编代码搜索 逆向工程 大型语言模型 虚拟编译器 代码生成
📋 核心要点
- 汇编代码搜索是逆向工程的关键,但高质量数据集的构建复杂性限制了其发展。
- 论文提出训练大型语言模型作为虚拟编译器(ViC),生成大规模汇编代码数据集。
- 实验表明,使用ViC生成的数据集训练的模型在汇编代码搜索任务上显著优于现有方法,提升达26%。
📝 摘要(中文)
汇编代码搜索对于减轻逆向工程师的负担至关重要,它允许他们在庞大的二进制程序中使用自然语言快速识别特定函数。然而,构建高质量的数据集面临诸多挑战,阻碍了这项关键任务的发展。本文探索训练一个大型语言模型(LLM)来模拟通用编译器。通过利用Ubuntu软件包编译的200亿token数据集,我们进一步预训练CodeLlama,得到一个虚拟编译器(ViC),它能够将任何语言的任何源代码编译成汇编代码。这种方法允许跨多种编程语言进行虚拟编译,而无需真正的编译器,从而保留语义等价性并扩展了汇编代码数据集构建的可能性。此外,我们使用ViC构建了一个足够大的数据集用于汇编代码搜索。利用这个广泛的数据集,我们在汇编代码搜索性能方面取得了显著的提升,我们的模型超越了领先的基线26%。
🔬 方法详解
问题定义:汇编代码搜索旨在通过自然语言描述在二进制程序中定位特定函数。现有方法受限于高质量汇编代码数据集的匮乏,真实编译器的使用复杂且难以覆盖多种编程语言和架构,导致模型泛化能力不足。
核心思路:论文的核心在于训练一个大型语言模型(LLM)来模拟编译器的行为,即“虚拟编译器”(ViC)。ViC能够将各种编程语言的源代码“编译”成汇编代码,从而绕过对真实编译器的依赖,并能生成大规模、多样化的汇编代码数据集。这样可以有效解决数据集构建的瓶颈问题。
技术框架:该方法主要包含两个阶段:1) ViC的预训练:使用大规模源代码数据集(来自Ubuntu软件包)对CodeLlama进行预训练,使其具备将源代码转换为汇编代码的能力。2) 汇编代码搜索模型的训练:使用ViC生成的大规模汇编代码数据集训练一个汇编代码搜索模型。该模型接收自然语言描述作为输入,并输出对应的汇编代码片段。
关键创新:最重要的创新点在于使用LLM模拟编译器,即ViC。与传统方法依赖真实编译器不同,ViC能够以更灵活、高效的方式生成汇编代码,并且可以覆盖多种编程语言和架构。这使得构建大规模、多样化的汇编代码数据集成为可能,从而显著提升了汇编代码搜索的性能。
关键设计:ViC的预训练采用了CodeLlama作为基础模型,并使用200亿token的源代码数据集进行训练。汇编代码搜索模型的具体结构未知,但其训练目标是最小化自然语言描述和对应汇编代码片段之间的距离(例如,通过对比学习)。论文未提供关于损失函数或网络结构的具体细节。
🖼️ 关键图片
📊 实验亮点
实验结果表明,使用ViC生成的数据集训练的汇编代码搜索模型,在性能上显著超越了现有的领先基线,提升幅度高达26%。这一结果验证了ViC在汇编代码数据集构建方面的有效性,并展示了其在提升汇编代码搜索性能方面的巨大潜力。
🎯 应用场景
该研究成果可广泛应用于软件安全、漏洞分析、恶意代码检测等领域。通过快速准确地定位二进制程序中的特定函数,可以加速逆向工程过程,提高安全分析人员的工作效率。此外,该方法还可以用于构建大规模的汇编代码知识库,为自动化漏洞挖掘和代码相似性分析提供支持。
📄 摘要(原文)
Assembly code search is vital for reducing the burden on reverse engineers, allowing them to quickly identify specific functions using natural language within vast binary programs. Despite its significance, this critical task is impeded by the complexities involved in building high-quality datasets. This paper explores training a Large Language Model (LLM) to emulate a general compiler. By leveraging Ubuntu packages to compile a dataset of 20 billion tokens, we further continue pre-train CodeLlama as a Virtual Compiler (ViC), capable of compiling any source code of any language to assembly code. This approach allows for virtual compilation across a wide range of programming languages without the need for a real compiler, preserving semantic equivalency and expanding the possibilities for assembly code dataset construction. Furthermore, we use ViC to construct a sufficiently large dataset for assembly code search. Employing this extensive dataset, we achieve a substantial improvement in assembly code search performance, with our model surpassing the leading baseline by 26%.