Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization
用于理解恶意软件的内部工作原理,并发现系统中的漏洞,逆向工程是一种耗费人工的却很重要的技术。汇编克隆搜索引擎是通过识别那些重复的或者已知的部件来帮助逆向工程师的工作,要想设计健壮的克隆搜索引擎是一项挑战,因为存在各种编译器的优化和代码混熊技术。
一个实用的克隆搜索引擎依赖于汇编代码的健壮向量表示,现有的方法依赖于人工特征提取过程从现有的汇编函数中提取特征向量,没有考虑到特征之间的关系,没有确定出能够静态区分汇编函数的这种独特模式。为了解决这个问题,基于汇编代码的汇编函数的词法语义关系和向量表示模型Asm2Vec诞生了,此模型用来汇编代码表示学习。
这个模型只需要汇编代码作为程序的输入,可以发现和合并在汇编代码中出现的token之间的丰富语义关系。利用最先进的静态方法和动态克隆搜索方法,进行了大量的实验和检测了这模型,展示了模型学到表示形式更加健壮,并且在对抗混淆和优化的引入方面。其性能更加优于现有的方法。
汇编代码克隆搜索是一种新兴的信息检索技术,有助于解决安全相关的问题。它已经被用来通过定位改变的部分来区别不同的二进制文件[4],识别已知的库函数[5],在现有的软件或者IoT设备固件中寻找已知的编程错误或者zero-day漏洞[6][7],以及当源代码不可获取时检测软件剽窃或GNU许可侵权行为。
困难点:因为各种编译器优化和混淆技术使得逻辑上相似的汇编函数看起来有很大的不同,优化或者混淆汇编函数破坏了控制流程和基本块的完整性,将这些语义相似但结构和语法不同的汇编函数作为克隆来识别是具有挑战性的。
开发克隆搜索解决方案需要汇编代码的健壮向量表示,通过这种表示可以度量查询和索引函数之间的相似性。根据人工工程的特点,相关研究可以分为静态研究和动态研究。动态方法通过动态分析汇编代码[10][11][12]的I/O行为来建模语义相似性。静态方法通过查找汇编代码在语法或描述性统计信息[6][7][8][14][15][16][17][18]方面的静态差异来为它们之间的相似性建模。静态方法比动态方法更具可伸缩性并提供更好的覆盖率,动态方法在语法变化时更健壮,但可伸缩性更差。这篇文章确定了两个可以减轻的问题,以提高静态特性的语义丰富性和鲁棒性。实验结果表明,考虑这两个因素,静态方法能够获得比最先进的动态方法更好的性能。
P1:现有的最先进的静态方法没有考虑到特征之间的关系。LSH-S[16],ngram[8],n-perm[8],BinClone[15]和Kam1n0[17]将汇编代码片段建模为操作频率值和分类操作数;Tracelet[14]将汇编代码建模为指令之间的编辑距离;Discovre[7]和Genius[6]构造描述性特征,如算术汇编指令的比例,传输指令的的数量,基本块的数量等。所有这些方法都假设每个特性或类别都是一个独立的维度。然而,SSE寄存器和SSE操作数相关;fclose libc函数调用与其他文件相关的libc调用(如fopen)相关;可以用memcpy替换strcpy libc调用。这些关系提供的语义信息比单个tokens或描述性统计信息更多。为了解决这个问题,提出将词汇语义关系奶如刀特征工程过程中。在实践中,从汇编语言的先验知识中手动指定所有可能的关系是费时的,这是不可行的。相反,直接从普通汇编代码中学习这些关系。
Asm2Vec探索了tokens之间的共生关系,并发现了tokens之间丰富的词汇语义关系,Asm2Vec在训练过程中不需要任何先验知识。
P2:现有的静态方法假设特征是同等重要的[14][15][16][17],或者需要一个等效汇编函数的映射来学习权重[6][7]。所选的权重可能不包含区分一个汇编函数和另一个汇编函数的重要模式和多样性。一个有经验的逆向工程师不会通过平等地查看整个内容或逻辑来识别一个已知的函数,而是根据二进制分析的过去经验来确定识别特定函数的关键点和重要模式,还不需要等效汇编函数的映射。为了解决这个问题,可以模拟一个有经验的逆向工程师的工作方式。受近年来表示学习[19][20],提出训练一个神经网络模型来读取许多汇编代码数据,并让模型确定区分一个函数和其他函数的最佳表示形式。
本文贡献:
1.提出了一种新的汇编克隆检测的方法。这是第一个使用表示学习为汇编代码构造特征向量的工作,作为减轻当前手工特性中的P1和P2问题的一种方法。
2.开发了一个用于汇编代码语法和控制流程图的表示学习模型,即Asm2Vec。该模型学习了tokens之间潜在词汇语义,并将汇编函数表示为内部加权混合的集合语义。学习过程不需要任何关于汇编代码的先验知识,只需要将汇编代码函数作为输入即可。
3.证明了Asm2Vec比最先进的静态特征和动态方法更能适应代码混淆和编译器优化。事宜按包括不同编译器配置和一个强大的混淆器,它替换指令,分割基本块,添加为逻辑,并完全破坏原始的控制流图。在对一个公开的漏洞数据集进行了漏洞搜索案例研究,其中Asm2Vec实现了零误报和100%召回。它的性能优于动态最先进的漏洞搜索方法。
Asm2Vec作为一种静态方法不能完全消除代码混淆。然而,它比最先进的静态特性更能适应代码混淆。
Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization的更多相关文章
- Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization(二)
接着上篇Asm2Vec神经网络模型流程继续,接下来探讨具体过程和细节. 一.为汇编函数建模 二.训练,评估 先来看第一部分为汇编函数建模,这个过程是将存储库中的每一个汇编函数建模为多个序列.由于 ...
- Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization(一)
接着上一篇,现在明确问题:在汇编克隆搜索文献中,有四种类型的克隆[15][16][17]:Type1.literally identical(字面相同):Type2.syntactically equ ...
- 【Code clone】Distributed Code Clone Detection Based on Index
1 摘要 随着软件产业的发展,代码克隆现象越来越常见,随之带来的安全漏洞.可维护性.产权等问题也引起人们重视.代码克隆按照复制程度分为4类:完全复制.修改名称.更换顺序和自实现.现有的代码克隆检测工 ...
- 机器学习&恶意代码检测简介
Malware detection 目录 可执行文件简介 检测方法概述 资源及参考文献 可执行文件简介 ELF(Executable Linkable Format) linux下的可执行文件格式,按 ...
- 3. Dubbo原理解析-Dubbo内核实现之动态编译 (转)
转载自 斩秋的专栏 http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159 我们运行的Java代码,一般都是编译之后的字节码 ...
- 将百分制转换为5分制的算法 Binary Search Tree ordered binary tree sorted binary tree Huffman Tree
1.二叉搜索树:去一个陌生的城市问路到目的地: for each node, all elements in its left subtree are less-or-equal to the nod ...
- binary heap
In computer science, a heap is a specialized tree-based data structure that satisfies the heap prope ...
- state-of-the-art implementations related to visual recognition and search
http://rogerioferis.com/VisualRecognitionAndSearch2014/Resources.html Source Code Non-exhaustive lis ...
- Top 40 Static Code Analysis Tools
https://www.softwaretestinghelp.com/tools/top-40-static-code-analysis-tools/ In this article, I have ...
随机推荐
- [MV] - You Give REST a Bad Name
本首歌改自Bon Jovi经典歌曲"You Give Love a Bad Name". 改编的作者是Dylan Beattie, 他是Spotlight的系统架构师. 改编后的歌 ...
- 获取model的自定义特性
class Program { static void Main(String[] args) { var t = typeof(A); var pName = t.GetProperty(" ...
- 基于winserver部署Apollo初次体验(附.net客户端demo)
前言 配置中心伴随着这几年分布式系统演变和微服务架构的兴起,已经成为必不可少的需求之一.试下一下如果哪天公司的所有应用服务,从公司服务器迁移到云服务,成千上万的配置,修改起来是多么耗时费劲的事(我们公 ...
- Latex文件分别用Texwork和Winedt打开时,产生中文乱码的解决方法
中文兼容方法(能保证编译成功) \usepackage{CJK} \begin{document} \begin{CJK}{GBK}{kai} ... 中文 ... \end{CJK} \end{do ...
- SpringCloud Ribbon的分析(二)
上文我们分析到 loadBalancer 根据具体的算法选择相应的server. protected Server getServer(ILoadBalancer loadBalancer) { if ...
- JVM(1)---虚拟机在运行期的优化策略
1.解释器与JIT编译器 首先我们先来了解一下运行在虚拟机之上的解释器与JIT编译器.当我们的虚拟机在运行一个java程序的时候,它可以采用两种方式来运行这个java程序: 采用解释器的形式,也就是说 ...
- 【转载】ASP.NET Core Web 支付功能接入 微信-扫码支付篇
转自:http://www.cnblogs.com/essenroc/p/8630730.html 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步 ...
- REST API设计指导——译自Microsoft REST API Guidelines(四)
前言 前面我们说了,如果API的设计更规范更合理,在很大程度上能够提高联调的效率,降低沟通成本.那么什么是好的API设计?这里我们不得不提到REST API. 关于REST API的书籍很多,但是完整 ...
- javaweb请求编码 url编码 响应编码 乱码问题 post编码 get请求编码 中文乱码问题 GET POST参数乱码问题 url乱码问题 get post请求乱码 字符编码
乱码是一个经常出现的问题 请求中,参数传递的过程中也是经常出现乱码的问题 本文主要整理了请求乱码中的问题以及解决思路 先要理解一个概念前提: 编码就是把图形变成数值码所以说: 图形的字符 -- ...
- Linux,在不使用U盘的情况下使用wubi.exe程序在Win7上安装ubuntu-14.04.3版系统
本文介绍如何在不使用U盘的情况下使用wubi.exe程序在Win7上安装ubuntu-14.04.3版系统. 花了一天的时间终于安装上了Ubuntu14.04,过程坎坷,是血泪史,开始报“cannot ...