0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

二进制代码相似度比较研究技术汇总

清欢科技 来源:清欢科技 作者:清欢科技 2022-10-13 08:59 次阅读

在对二进制应用程序进行安全分析过程中,二进制代码相似度比较技术是重要的技术手段之一,基于此技术,可以实现对恶意代码极其变种的追踪,已知漏洞检测、补丁存在性检测。该技术基础理论依据是如果源代码中存在的属性(恶意代码、已知漏洞、漏洞修复补丁)即使相同源代码编译出不同的二进制代码(cpu架构、OS、编译选项等会直接导致编译出来的二进制会存在较大的差别),这些属性在二进制代码中也是存在的(好像是废话,不然编译构建工具就有问题了)。因此若在一个样本二进制文件中已知存在上述类型的属性,如果发现另外一个待检测二进制代码和样本二进制代码相似,那么可以认为待检测二进制代码也存在相同类型的属性。

我们知道编译生成二进制代码的影响因素非常的多,同一套源代码基于不同因素的组合可以生成非常多不同二进制程序。

CPU架构:X86、ARM、MIPS、PPC、RISC-V;

架构位数:32bits、64bits;

OS:Linux、Windows、Android鸿蒙、VxWork;

编译选项:O0~O3;

安全编译选项:BIND_NOW、NX、PIC、PIE、RELRO、SP、FS、Ftrapv等;

按这些选项可以有5x2x5x4x8 =1600个组合,从中可以看出二进制代码相似度比较技术不管是学术界还是工业界来说都是一个挑战技术。但是基于广阔的应用前景,20多年来学术界一直在不停的探索和研究新的方法想来解决这个技术挑战,并且也取得了一定的成果,下面就该方面的技术进行一些梳理,让大家对二进制代码相似度比较技术有一个大致的了解。

源代码到二进制代码的生成过程

pYYBAGNGp_2Ab1jJAAClwC8Ks0Y533.png

从源代码编译生成二进制过程中,有很多有助于理解代码意图的信息会被丢失,比如:函数名称、变量名称、数据结构定义、变量类型定义、注释信息等;因为二进制代码是给CPU运行用的,因此这些信息对计算机来说不是必须的,但这些信息对人类来理解代码是有很大帮助的,这就大大的提升了二进制代码语义理解的难度。其次,为了更好的保护二进制代码的知识产权或最大程度的提升对二进制代码的理解难度,还会对二进制代码进行混淆处理,使得混淆后的二进制代码与编译器编译出来的二进制之间又存在很大的不同。

从历史发表的二进制代码相似度比较技术论文统计来看,有61种二进制代码相似性比较方法,这些在不同研究场所发表的数百篇论文涵盖了计算机安全、软件工程、编程语言和机器学习等计算机科学领域,主要发表在IEEE S&P、ACM CCS、USENIX Security、NDSS、ACSAC、RAID、ESORICS、ASIACCS、DIMVA、ICSE、FSE、ISSTA、ASE、MSR等顶级刊物上。根据上述论文得到如下统计数据:

输入比较:一对一(21种)、一对多(30种)、多对多(10种);

比较方法:大多数方法使用单一类型的比较:相似性(42种)、等效性(5种)和相同(2种);即使方法中仅使用一种类型的比较,它也可能有不同的输入比较不同;

分析粒度:分为输入粒度、方法粒度;有8中不同的比较粒度,分别是指令级、基本快、函数以及相关集合、执行轨迹、程序。最常见的输入粒度是函数(26个),然后是整个程序(25个)和相关的基本块(4)。最常见的方法粒度是函数(30个),然后是基本块(20);

语法相似性:通过语法方法来捕获代码表示的相似性,更具体地说,它们比较指令序列。最常见的是序列中的指令在虚拟地址空间中是连续的,属于同一函数。

语义相似性:语义相似性是指所比较的代码是否具有类似的效果,而语法相似性则是指代码表示中的相似性。其中有26种计算语义相似度的方法。它们中的大多数以基本块粒度捕获语义,因为基本块是没有控制流的直线代码。有三种方法用于捕获语义:指令分类、输入-输出对和符号公式。

结构相似度:结构相似性计算二进制代码的图表示上的相似性。它位于句法和语义相似性之间,因为图可以捕获同一代码的多个句法表示,并可以用语义信息注释。结构相似性可以在不同的图上计算。常见的有控制流图CFG、过程间控制流图ICFG、调用图CG;(子)图同构—大多数结构相似性方法是检查图同构的变化,其中涉及到方法有K子图匹配、路径相似性、图嵌入。

基于特征的相似度:计算相似性的常见方法(28种)是将一段二进制代码表示为向量或一组特征,使得类似的二进制代码具有相似的特征向量或特征集。这里应用最多的是利用机器学习来实现。

Hash匹配相似度:对于多维向量数据相似度快速匹配,通常使用局部敏感hash算法LSH来实现。

跨架构比较方法:对不同CPU架构二进制代码的相似度比较,通常跨体系结构方法通过计算语义相似性来实现。方法之一是通过转换成与架构无关的中间语言IR来处理(7种),另外一种是使用基于特征的相似性方法(9种)。

分析类型:从分析类型来看有:静态分析、动态分析、数据流分析3种类型;

归一化方法:语法相似性方法通常会对指令进行规范化,来尽量减少语法上的差异;有33种方法使用指令规范化。具体的包括操作数移除法、操作数归一化法、助记符归一化法

论文发表的时间、发表刊物、技术方法汇总

poYBAGNGqAWABLO7AARTgKRVwF8195.png

不同二进制代码相似度比较方法的具体应用情况

pYYBAGNGqAmADxvWAADoMUuBQ_s268.png

从上表中可以看出二进制代码相似度比较主要应用于漏洞查找,其次是补丁分析和恶意代码分析;

针对上述不同的技术方法,分别从鲁棒性、准确度评估与比较、性能指标3个维度进行评测,结果如下:

poYBAGNGqA6ARnB9AARbK0K2eBU214.png

总结:二进制代码相似性比较技术随着研究的持续进行,学术界虽然取得的一定的进步和成果,但仍然还有很多挑战在等着攻克,小片段的二进制代码比较,源代码与二进制的相似度比较、数据相似度比较、语义关系、可扩展性、混淆、比较方法等等都是后续需要持续研究的方向。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 二进制
    +关注

    关注

    2

    文章

    709

    浏览量

    41266
  • 代码
    +关注

    关注

    30

    文章

    4557

    浏览量

    66835
收藏 人收藏

    评论

    相关推荐

    如何实现二进制和BCD码数据的相互转变?

    如何实现二进制和BCD码数据的相互转变? 二进制码是将十进制数字表示为二进制数和十进制数的一种表示方法。在计算机系统中,
    的头像 发表于 02-18 14:51 461次阅读

    二进制与逻辑电平的变化范围

    二进制中的两个数字0和1称为位(bit, 是二进制数字binary digit的缩写)。在数字电路中,使用两个不同的电平表示这两个位。一般情况下,1 用高电平表示,0用低电平表示,这种逻辑体制称为正逻辑。
    的头像 发表于 02-04 16:54 539次阅读
    <b class='flag-5'>二进制</b>与逻辑电平的变化范围

    鸿蒙二进制数组创建

    你data是非unsigned char。你里面的数据就会转换错乱,导致二进制的数据无法再转换成正确的字符串 代码实例 错误的代码例子:   //接收
    的头像 发表于 01-31 15:24 860次阅读

    二进制、八进制、十六进制在现实当中有什么意义?

    二进制、八进制、十六进制在现实当中有什么意义? 二进制、八进制和十六进制在现实生活中有着广泛的应
    的头像 发表于 01-16 11:14 611次阅读

    10进制转换为二进制的算法

    进制转换为二进制是计算机科学中非常基础且重要的概念之一。在理解和应用计算机科学的基础知识时,掌握这个算法是至关重要的。 在开始讲解十进制转换为二进制的算法之前,让我们回顾一下十
    的头像 发表于 01-15 10:32 599次阅读

    你知道十进制二进制如何进行转换吗?

    你知道十进制二进制如何进行转换吗? 当我们提到数字系统时,最常见的是十进制系统和二进制系统。十进制是基于10的系统,而
    的头像 发表于 12-20 17:05 678次阅读

    二进制最佳接收原理 二进制最佳接收机的实现形式有哪两种?

    二进制最佳接收原理 二进制最佳接收机的实现形式有哪两种? 二进制最佳接收原理是计算机通信中的重要概念,它是指在二进制通信中通过一定的方法,使接收机在信号传输过程中能够准确、可靠地接收到
    的头像 发表于 11-27 16:19 581次阅读

    请问bcd码和二进制有什么关系?

    这个bcd码和二进制有什么关系? bcd 表示0011001是19(十进制) 二进制表示0011001是25(十进制) 这个怎么确定是哪个???
    发表于 10-07 06:02

    M451如何丢弃函数的二进制代码填入SRAM的二进制代码

    应用程序 : 示例代码演示了如何丢弃函数的二进制代码, 然后填入 SRAM 的二进制代码, 然后调用它 。 BSP版本:M451系列BSP
    发表于 08-30 07:35

    如何读取二进制文件,IAR怎么输出二进制BIN文件

    IAR怎么输出二进制BIN文件?
    发表于 08-28 17:19

    如何丢弃函数的二进制代码填入SRAM的二进制代码

    应用程序 : 示例代码演示了如何丢弃函数的二进制代码, 然后填入 SRAM 的二进制代码, 然后调用它 。 BSP版本:M451系列BSP
    发表于 08-23 06:34

    Arduino二进制骰子

    电子发烧友网站提供《Arduino二进制骰子.zip》资料免费下载
    发表于 07-04 10:13 0次下载
    Arduino<b class='flag-5'>二进制</b>骰子

    二进制数开源分享

    电子发烧友网站提供《二进制数开源分享.zip》资料免费下载
    发表于 06-26 11:40 0次下载
    <b class='flag-5'>二进制</b>数开源分享

    如何将二进制数据(非文本)写入SPIFFS?

    大家好! 最近两天我尝试将二进制数据写入 SPIFFS,但我遇到了一些问题。 1 - 是否没有将二进制文件写入 SPIFFS 的“wb”模式? 2 - 为什么使用 POSIX 样式会导致异常? 我
    发表于 05-15 08:33

    基于AT89C51单片机TIMER0控制LED二进制计数仿真及代码

    基于AT89C51单片机TIMER0控制LED二进制计数仿真及代码
    发表于 05-04 14:36 1次下载