CN117033171B - 触发软件漏洞的输入数据的复现方法、装置、设备及介质 - Google Patents

触发软件漏洞的输入数据的复现方法、装置、设备及介质 Download PDF

Info

Publication number
CN117033171B
CN117033171B CN202310781248.5A CN202310781248A CN117033171B CN 117033171 B CN117033171 B CN 117033171B CN 202310781248 A CN202310781248 A CN 202310781248A CN 117033171 B CN117033171 B CN 117033171B
Authority
CN
China
Prior art keywords
function
version
old
new
test case
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202310781248.5A
Other languages
English (en)
Other versions
CN117033171A (zh
Inventor
张超
杨松涛
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tsinghua University
Original Assignee
Tsinghua University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tsinghua University filed Critical Tsinghua University
Priority to CN202310781248.5A priority Critical patent/CN117033171B/zh
Publication of CN117033171A publication Critical patent/CN117033171A/zh
Application granted granted Critical
Publication of CN117033171B publication Critical patent/CN117033171B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version control; Configuration management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Computer Security & Cryptography (AREA)
  • Stored Programmes (AREA)

Abstract

本申请提供一种触发软件漏洞的输入数据的复现方法、装置、设备及介质。该方法包括:识别目标软件在修补漏洞前后分别对应的旧版和新版二进制程序分别包括多个旧版函数和多个新版函数、分别对应的旧版和新版静态函数调用关系;获取旧版和新版二进制程序运行过程中分别对应的旧版和新版真实函数调用序列;匹配多个旧版函数与多个新版函数为多个匹配函数对;从多个匹配函数对中确定候选补丁函数;根据各候选补丁函数和第二预设测试用例池,对所述旧版二进制程序和所述新版二进制程序进行模糊测试,确定能够触发旧版二进制程序的漏洞的目标输入数据。本申请的方法能够高效的复现出能够触发旧版二进制程序漏洞的目标输入数据。

Description

触发软件漏洞的输入数据的复现方法、装置、设备及介质
技术领域
本申请涉及网络安全技术,尤其涉及一种触发软件漏洞的输入数据的复现方法、装置、设备及介质。
背景技术
软件漏洞是计算机产业中面临的一种严重威胁,会影响到终端用户、行业实体乃至国家安全。因此,发现软件漏洞并及时修复、针对软件漏洞攻击特征进行提前防护具有重要的意义。除了软件中未被发现的漏洞之外,软件厂商已经发布了补丁的漏洞也有可能会存在安全威胁,这是由于攻击者可能通过比较补丁前后的软件差异来分析定位漏洞,而用户可能并不会在补丁发布后立即应用补丁。
现目前,为了保护用户软件免受威胁,可以在承载用户软件的网络系统中部署攻击检测系统,通过检测网络流量中的攻击特征字节序列来识别攻击流量,从而提前截停攻击。而为了有效检测到攻击流量,需要获取到能够触发补丁所针对的漏洞的输入数据。对于通过增量更新方式修补漏洞的软件,可以直接软件厂商发布的补丁进行分析,复现能够触发补丁所针对的漏洞的输入数据。但是对于通过全量更新方式修补漏洞的软件,现目前还无法高效的复现出能够触发被修复的漏洞的输入数据。
前面的叙述在于提供一般的背景信息,并不一定构成现有技术。
发明内容
本申请提供一种触发软件漏洞的输入数据的复现方法、装置、设备及介质,用以解决现有技术中对于通过全量更新方式修补漏洞的软件,无法高效的复现出能触发被修复漏洞的输入数据的问题。
根据本申请的第一方面,提供一种触发软件漏洞的输入数据的复现方法,包括:
获取目标软件在修补漏洞前的旧版二进制程序包括的多个旧版函数和旧版静态函数调用关系,并获取目标软件在修补漏洞后的新版二进制程序包括的多个新版函数和新版静态函数调用关系;
获取所述旧版二进制程序在运行第一测试用例的过程中的旧版真实函数调用序列,并获取所述新版二进制程序在运行第一测试用例的过程中的新版真实函数调用序列;所述第一测试用例属于第一预设测试用例池;
根据所述旧版静态函数调用关系和所述旧版真实函数调用系列,确定旧版当前已恢复函数调用关系,并根据所述新版静态函数调用关系和所述新版真实函数调用序列,确定新版当前已恢复函数调用关系;
根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对;匹配函数对包括相互匹配的旧版函数和新版函数;
根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,从多个已匹配的旧版函数中确定至少一个候选补丁函数;
根据各候选补丁函数和第二预设测试用例池,对所述旧版二进制程序和所述新版二进制程序进行模糊测试,确定能够触发旧版二进制程序的漏洞的目标输入数据。
根据本申请的第二方面,提供一种触发软件漏洞的输入数据的复现装置,包括:
第一获取模块,用于获取目标软件在修补漏洞前的旧版二进制程序包括的多个旧版函数和旧版静态函数调用关系,并获取目标软件在修补漏洞后的新版二进制程序包括的多个新版函数和新版静态函数调用关系;
第二获取模块,用于获取所述旧版二进制程序在运行第一测试用例的过程中的旧版真实函数调用序列,并获取所述新版二进制程序在运行第一测试用例的过程中的新版真实函数调用序列;所述第一测试用例属于第一预设测试用例池;
第一确定模块,用于根据所述旧版静态函数调用关系和所述旧版真实函数调用系列,确定旧版当前已恢复函数调用关系,并根据所述新版静态函数调用关系和所述新版真实函数调用序列,确定新版当前已恢复函数调用关系;
匹配模块,用于根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对;匹配函数对包括相互匹配的旧版函数和新版函数;
第二确定模块,用于根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,从多个已匹配的旧版函数中确定至少一个候选补丁函数;
第三确定模块,根据各候选补丁函数和第二预设测试用例池,对所述旧版二进制程序和所述新版二进制程序进行模糊测试,确定能够触发旧版二进制程序的漏洞的目标输入数据。
根据本申请的第三方面,提供一种电子设备,包括:处理器,以及与所述处理器通信连接的存储器;
所述存储器存储计算机执行指令;
所述处理器执行所述存储器存储的计算机执行指令,以实现如第一方面中所述的方法。
根据本申请的第四方面,提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现如第一方面中所述的方法。
根据本申请的第五方面,提供一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现如第一方面中所述的方法。
本申请提供的触发软件漏洞的输入数据的复现方法、装置、设备及介质,通过获取目标软件在修补漏洞前的旧版二进制程序包括的多个旧版函数和旧版静态函数调用关系,并获取目标软件在修补漏洞后的新版二进制程序包括的多个新版函数和新版静态函数调用关系;获取所述旧版二进制程序在运行第一测试用例的过程中的旧版真实函数调用序列,并获取所述新版二进制程序在运行第一测试用例的过程中的新版真实函数调用序列;所述第一测试用例属于第一预设测试用例池;根据所述旧版静态函数调用关系和所述旧版真实函数调用系列,确定旧版当前已恢复函数调用关系,并根据所述新版静态函数调用关系和所述新版真实函数调用序列,确定新版当前已恢复函数调用关系;根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对;匹配函数对包括相互匹配的旧版函数和新版函数;根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,从多个已匹配的旧版函数中确定至少一个候选补丁函数;根据各候选补丁函数和第二预设测试用例池,对所述旧版二进制程序和所述新版二进制程序进行模糊测试,确定能够触发旧版二进制程序的漏洞的目标输入数据。由于旧版当前已恢复函数调用关系能够反映旧版二进制程序的内部结构和特征,新版当前已恢复函数调用关系能够反映新版二进制程序的内部结构和特征。因此,根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,可以将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对。进而,根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,可以从匹配函数对的已匹配旧版函数中确定有可能导致了旧版二进制程序出现漏洞的候选补丁函数,再根据候选补丁函数和预设的第二测试用例池对所述旧版二进制程序和所述新版二进制程序进行模糊测试,使得模糊测试过程中旧版二进制程序更倾向于执行候选补丁函数,就能够提高在模糊测试中复现出能够触发旧版二进制程序的漏洞的目标输入数据的概率,更高效的复现能够触发被修复的漏洞的输入数据。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。
图1是根据本申请实施例提供的触发软件漏洞的输入数据的复现方法应用场景对应的网络架构图;
图2是根据本申请实施例一提供的触发软件漏洞的输入数据的复现方法的流程示意图;
图3是根据本申请实施例四提供的一种旧版当前已恢复函数调用关系的示意图;
图4是根据本申请实施例六提供的触发软件漏洞的输入数据的复现方法的流程示意图;
图5是根据本申请实施例六提供的触发软件漏洞的输入数据的复现方法中模糊测试的流程示意图;
图6是根据本申请实施例七提供的触发软件漏洞的输入数据的复现装置的结构示意图;
图7是根据本申请实施例八提供的电子设备的结构示意图。
通过上述附图,已示出本申请明确的实施例,后文中将有更详细的描述。这些附图和文字描述并不是为了通过任何方式限制本申请构思的范围,而是通过参考特定实施例为本领域技术人员说明本申请的概念。
具体实施方式
本发明实施例的说明书和权利要求书及附图中的术语“第一”、“第二”、“第三”“第四”“第五”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明实施例如能够以除了在这里图示或描述的那些以外的顺序实施。术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。再者,如同在本文中所使用的,单数形式“一”、“一个”和“该”旨在也包括复数形式。术语“或”、“和/或”、“包括以下至少一个”等可被解释为包括性的,或意味着任一个或任何组合。例如,“包括以下至少一个:A、B、C”意味着“以下任一个:A;B;C;A和B;A和C;B和C;A和B和C”,再如,“A、B或C”或者“A、B和/或C”意味着“以下任一个:A;B;C;A和B;A和C;B和C;A和B和C”。仅当元件、功能、步骤或操作的组合在某些方式下内在地互相排斥时,才会出现该定义的例外。
以下对本申请所涉及的现有技术进行详细说明及分析。
软件漏洞是计算机产业中面临的一种严重威胁,会影响到终端用户、行业实体、网络安全等。因此,发现软件漏洞并及时修复、针对软件漏洞攻击特征进行提前防护具有重要的意义。然而,除了软件中尚未被发现的漏洞之外,软件中已经被发现且已经修补的漏洞也可能会对存在安全威胁。这是由于用户可能并不会在软件厂商发布漏洞补丁之后就立即应用补丁,而攻击者却有可能通过比较补丁前后的软件差异来分析定位漏洞,因此,对于已经修补了漏洞的软件,在用户没有立即安装软件补丁、仍旧使用未修补漏洞的软件的情况下,如果能够复现出能够触发软件漏洞的输入数据,就可以在承载用户软件的网络系统中部署攻击检测系统,通过检测网络流量中的攻击特征字节序列来识别攻击流量,提前截停攻击,保护终端用户的网络安全。
由于软件厂商在修补漏洞之后,并不会公布被修复的漏洞的具体信息,对于通过增量更新方式修补的漏洞,对软件厂商发布的补丁进行分析,就有可能复现能够触发补丁所针对的漏洞的输入数据。但对于通过全量更新方式修补漏洞的软件,由于代码数量庞大,通过比较补丁前后的软件差异来分析漏洞、复现能够触发补丁所针对的漏洞的输入数据的效率低下,无法高效的复现出能够触发被修复的漏洞的输入数据。
软件模糊测试是挖掘软件漏洞的主流方法,模糊测试通过构造大量的随机数据输入被测软件,并监测被测软件在输入随机数据后的运行异常,如崩溃,进而发现软件漏洞。但大多数模糊测试方案并不考虑被测软件的内部结构和特性,只观察被测软件的输出和异常运行状态,挖掘漏洞的效率低下。
综上,现有技术中,对于通过全量更新方式修补漏洞的软件,存在无法高效的复现出能触发被修复漏洞的输入数据的问题。
在面对现有技术中的问题时,发明人通过创造性研究,为了能够高效的复现出能够触发软件漏洞的输入数据,需要考虑软件的内部结构,而二进制程序的函数调用关系能够反应目标软件的内部结构,同时,修补软件漏洞往往会改变二进制程序中的函数调用关系,因此,可以恢复旧版二进制程序和新版二进制程序的函数调用关系,将函数调用关系与模糊测试结合,更加准确和高效的复现出能触发被修复漏洞的输入数据。
所以,发明人提出本申请的技术方案,通过获取目标软件在修补漏洞前的旧版二进制程序包括的多个旧版函数和旧版静态函数调用关系,并获取目标软件在修补漏洞后的新版二进制程序包括的多个新版函数和新版静态函数调用关系;获取旧版二进制程序在运行第一测试用例的过程中的旧版真实函数调用序列,并获取新版二进制程序在运行第一测试用例的过程中的新版真实函数调用序列;第一测试用例属于第一预设测试用例池;根据旧版静态函数调用关系和旧版真实函数调用系列,确定旧版当前已恢复函数调用关系,并根据新版静态函数调用关系和新版真实函数调用序列,确定新版当前已恢复函数调用关系;根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对;匹配函数对包括相互匹配的旧版函数和新版函数;根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,从多个已匹配的旧版函数中确定至少一个候选补丁函数;根据各候选补丁函数和第二预设测试用例池,对旧版二进制程序和新版二进制程序进行模糊测试,确定能够触发旧版二进制程序的漏洞的目标输入数据。由于旧版当前已恢复函数调用关系能够反映旧版二进制程序的内部结构和特征,新版当前已恢复函数调用关系能够反映新版二进制程序的内部结构和特征。因此,根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,可以将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对。进而,根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,可以从匹配函数对的已匹配旧版函数中确定有可能导致了旧版二进制程序出现漏洞的候选补丁函数,再根据候选补丁函数和预设的第二测试用例池对旧版二进制程序和新版二进制程序进行模糊测试,使得模糊测试过程中旧版二进制程序更倾向于执行候选补丁函数,就能够提高在模糊测试中复现出能够触发旧版二进制程序的漏洞的目标输入数据的概率,更高效的复现能够触发被修复的漏洞的输入数据。
本申请提供的触发软件漏洞的输入数据的复现方法、装置、设备及介质,旨在解决现有技术的如上技术问题。下面以具体地实施例对本申请的技术方案以及本申请的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。
下面将对本申请实施例提供的触发软件漏洞的输入数据的复现方法的网络架构和应用场景进行介绍。下面的描述涉及附图时,除非另有表示,不同附图中的相同数据表示相同或相似的要素。
图1是本申请实施例提供的触发软件漏洞的输入数据的复现方法的应用场景对应的网络架构图。如图1所示,本申请实施例提供的一种应用场景对应的网络架构中包括:电子设备10、用户终端11、云服务器12、攻击设备13。
用户终端11与云服务器12通信连接,云服务器12为用户终端11提供计算、存储等服务。用户终端11上安装有修补漏洞前的目标软件。
电子设备10获取目标软件在修补漏洞前的旧版二进制程序包括的多个旧版函数和旧版静态函数调用关系,并获取目标软件在修补漏洞后的新版二进制程序包括的多个新版函数和新版静态函数调用关系。
电子设备10获取旧版二进制程序在运行第一测试用例的过程中的旧版真实函数调用序列,并获取新版二进制程序在运行第一测试用例的过程中的新版真实函数调用序列;第一测试用例属于第一预设测试用例池。
电子设备10根据旧版静态函数调用关系和旧版真实函数调用系列,确定旧版当前已恢复函数调用关系,并根据新版静态函数调用关系和新版真实函数调用序列,确定新版当前已恢复函数调用关系。
电子设备10根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对;匹配函数对包括相互匹配的旧版函数和新版函数。
电子设备10根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,从多个已匹配的旧版函数中确定至少一个候选补丁函数。
电子设备10根据各候选补丁函数和第二预设测试用例池,对旧版二进制程序和新版二进制程序进行模糊测试,确定能够触发旧版二进制程序的漏洞的目标输入数据。
电子设备10将能够触发旧版二进制程序的漏洞的目标输入数据发送给云服务器12,云服务器12在为用户终端11提供服务的过程中,如果攻击设备13通过旧版二进制程序的漏洞对用户终端11进行攻击,攻击数据会与目标输入数据具有相同的特征字节序列,因此,云服务器12根据目标输入数据的特征字节序列检测网络流量,并在检测到与目标输入数据具有相同的特征字节序列的攻击数据时,拦截攻击数据,就能够保障用户终端的网络安全。
下面将结合附图,对本申请的实施例进行描述。以下实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
实施例一
图2是根据本申请实施例一提供的触发软件漏洞的输入数据的复现方法的流程示意图。如图2所示,本申请的执行主体为触发软件漏洞的输入数据的复现装置,该触发软件漏洞的输入数据的复现装置位于电子设备中。本实施例提供的触发软件漏洞的输入数据的复现方法包括步骤201至步骤206。
步骤201,获取目标软件在修补漏洞前的旧版二进制程序包括的多个旧版函数和旧版静态函数调用关系,并获取目标软件在修补漏洞后的新版二进制程序包括的多个新版函数和新版静态函数调用关系。
可选地,步骤201中“获取目标软件在修补漏洞前的旧版二进制程序包括的多个旧版函数和旧版静态函数调用关系”细化包括步骤201a,“获取目标软件在修补漏洞后的新版二进制程序包括的多个新版函数和新版静态函数调用关系”细化包括步骤201b。
步骤201a,采用静态反汇编程序对旧版二进制程序进行识别,获取多个旧版函数和旧版静态函数调用关系;
步骤201b采用静态反汇编程序对新版二进制程序进行识别,获取多个新版函数和新版静态函数调用关系。
本实施例中,电子设备可以通过静态反汇编程序对目标软件在修补漏洞前的旧版二进制程序,以及目标软件在修补漏洞后的新版二进制程序,分别进行反汇编,获取到旧版二进制程序对应的旧版汇编程序,以及新版二进制程序对应的新版汇编程序。静态反汇编程序可以预先配置在电子设备中。
进而,电子设备可以通过静态反汇编程序对旧版汇编程序,以及新版汇编程序进行识别,获取到旧版二进制程序包括的多个旧版函数、旧版二进制程序包括的旧版静态函数调用关系、新版二进制程序包括的多个新版函数、新版二进制程序包括的新版静态函数调用关系。其中,“新版”和“旧版”是为了便于区别和描述目标软件在修补漏洞前后的二进制程序、汇编程序、函数调用关系等,而不能理解为对本申请的技术方案的限定。
本实施例中,静态函数调用关系可以为静态函数调用关系图,或者其它能够体现程序中的函数调用关系的数据形式。静态函数调用关系图中包括节点和有向边,节点之间通过有向边连接,节点用于表示程序中包括的函数,有向边用于表示函数之间的静态调用关系。静态调用关系是能够从汇编程序中直接识别出的函数调用关系,通常包括函数之间的直接调用关系。
步骤202,获取旧版二进制程序在运行第一测试用例的过程中的旧版真实函数调用序列,并获取新版二进制程序在运行第一测试用例的过程中的新版真实函数调用序列;第一测试用例属于第一预设测试用例池。
本实施例中,真实函数调用序列是指二进制程序在运行过程中真实调用的函数,以及真实调用的函数之间的调用顺序。电子设备可以从第一预设测试用例池中任选第一预设测试用例,并将第一预设测试用例分别输入旧版二进制程序和新版二进制程序运行。记录旧版二进制程序在运行第一测试用例的过程中的旧版真实函数调用序列,以及新版二进制程序在运行第一测试用例的过程中的新版真实函数调用序列。
具体地,电子设备可以通过预设的动态插桩工具,获取旧版真实函数调用序列和新版真实函数调用序列。
步骤203,根据旧版静态函数调用关系和旧版真实函数调用系列,确定旧版当前已恢复函数调用关系,并根据新版静态函数调用关系和新版真实函数调用序列,确定新版当前已恢复函数调用关系。
本实施例中,由于静态反汇编程序在将二进制程序转换为汇编程序的过程中可能会出现错误,并且,从汇编语言中无法识别出间接函数调用,因此,静态函数调用关系中包括的函数调用可能会出现错误和疏漏,并不一定能够准确且完整的包括二进制程序中所有的函数调用。而真实函数调用序列能够反映程序运行过程中的函数调用,真实函数调用序列中包括间接函数调用。因此,电子设备可以结合旧版静态函数调用关系和旧版真实函数调用序列确定旧版当前已恢复函数调用关系,结合新版静态函数调用关系和新版真实函数调用序列确定新版当前已恢复函数调用关系。
可选地,步骤203中“根据旧版静态函数调用关系和旧版真实函数调用系列,确定旧版当前已恢复函数调用关系”细化包括步骤203a,“根据新版静态函数调用关系和新版真实函数调用序列,确定新版当前已恢复函数调用关系”细化包括步骤203b。
步骤203a,采用旧版真实函数调用序列中存在的真实函数调用关系对旧版静态函数调用关系进行补充,获得旧版当前已恢复函数调用关系。
步骤203b,采用新版真实函数调用序列中存在的真实函数调用关系对新版静态函数调用关系进行补充,获得新版当前已恢复函数调用关系。
本实施例中,由于静态函数调用关系中包括的函数调用可能会出现错误和疏漏,而真实函数调用序列中包括的函数调用关系一定是在程序运行过程中真实发生的,虽然由于二进制程序在运行一个测试用例的过程中只会执行一条程序路径,真实函数调用序列中包括的函数调用关系也有可能并不完整,但仍然可以根据静态函数调用关系和真实函数调用序列获取到程序相对于静态函数调用关系和真实函数调用序列而言,更完整的当前已恢复函数调用关系。
具体地,对于旧版二进制程序,可以采用旧版真实函数调用序列中存在的真实函数调用关系对旧版静态函数调用关系进行补充,获取到旧版当前已恢复函数调用关系。对于新版二进制程序,可以采用新版真实函数调用序列中存在的真实函数调用关系对新版静态函数调用关系进行补充,获取到新版当前已恢复函数调用关系。
可选地,对于旧版二进制程序,可以采用旧版真实函数调用序列中存在的真实函数调用关系对旧版静态函数调用关系中错误的函数调用关系进行修正,并对旧版静态函数调用关系进行补充,获得旧版当前已恢复函数调用关系。对于新版二进制程序,可以采用新版真实函数调用序列中存在的真实函数调用关系对新版静态函数调用关系中错误的函数调用关系进行修正,并对新版静态函数调用关系进行补充,获得新版当前已恢复函数调用关系。
本实施例提供的触发软件漏洞的输入数据的复现方法,通过采用真实函数调用序列中存在的真实函数调用关系对静态函数调用关系进行补充,因此,能够获得更完整的当前已恢复函数调用关系,有利于后续确定匹配函数对和候选补丁函数。
步骤204,根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对;匹配函数对包括相互匹配的旧版函数和新版函数。
本实施例中,电子设备将多个旧版函数与多个新版函数进行匹配,找到旧版函数在新版二进制程序中对应的新版函数,获得多个匹配函数对。其中,一个匹配函数对包括一个旧版函数和一个新版函数,并且,匹配函数对包括的旧版函数和新版函数相互匹配。
可以理解的是,由于目标软件的程序代码的修改,旧版二进制包括的旧版函数的数量与新版二进制程序包括的新版函数的数量可能会不同,因此,并不是每一个旧版函数都存在相匹配的新版函数,也并不是每一新版函数都存在相匹配的旧版函数。
步骤205,根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,从多个已匹配的旧版函数中确定至少一个候选补丁函数。
本实施例中,静态函数调用关系和真实函数调用序列都可以反映二进制程序中的函数调用,但静态函数调用关系中的函数调用,在程序运行过程中并不一定会发生,而真实函数调用序列中的函数调用,是程序运行过程中真实发生的函数调用。
本实施例中,由于对目标软件进行漏洞修补,会改变目标软件的程序代码,而程序代码的改变会影响目标软件在运行过程中的函数调用,因此,能够使得新版二进制程序和旧版二进制程序在运行过程中的真实函数调用序列不同的输入数据,就有可能是能够触发旧版二进制程序的漏洞的目标输入数据。因此,在确定出匹配函数对之后,可以根据旧版当前已恢复函数调用关系确定各旧版函数的旧版被调用函数序列集合,根据新版当前已恢复函数调用关系确定各新版函数的新版被调用函数序列集合。被调用函数序列集合包括至少一个被调用函数序列,被调用函数序列是函数中的一条程序分支上,函数调用指令序列所调用的函数的序列。
本实施例中,电子设备可以根据匹配函数对中,已匹配的旧版函数的旧版被调用函数序列集合和已匹配的新版函数的新版被调用函数集合,从多个匹配函数对中确定与对应的新版匹配函数的新版被调用函数集合不同的候选补丁函数。进而,在复现触发旧版二进制程序的漏洞的目标输入数据的过程中,只要更倾向于使旧版二进制程序执行候选补丁函数,就可以更加高效地复现目标输入数据,并且,需要理解的是,即便旧版二进制程序在执行过程中触发了漏洞,也不表示被触发的漏洞一定是由于旧版二进制程序执行候选补丁函数而造成的。
步骤206,根据各候选补丁函数和第二预设测试用例池,对旧版二进制程序和新版二进制程序进行模糊测试,确定能够触发旧版二进制程序的漏洞的目标输入数据。
本实施例中,第二预设测试测试用例池中包括多个预设测试用例。电子设备通过第二预设测试用例池中的各预设测试用,以旧版二进制程序在运行过程中更倾向于执行各候选补丁函数为条件,对旧版二进制程序和新版二进制程序进行模糊测试,确定能够触发旧版二进制程序的漏洞的目标输入数据。
本实施例中,在模糊测试的过程中,如果旧版二进制程序和新版二进制程序在运行同一个测试用例时的函数调用序列不同,则可以将这个测试用例确定为目标输入数据。
本实施例提供的触发软件漏洞的输入数据的复现方法,由于根据和新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对,再从已匹配旧版函数中确定有可能导致了旧版二进制程序出现漏洞的候选补丁函数,再根据候选补丁函数和预设的第二测试用例池对旧版二进制程序和新版二进制程序进行模糊测试,使得模糊测试过程中旧版二进制程序更倾向于执行候选补丁函数,就能够提高在模糊测试中复现出能够触发旧版二进制程序的漏洞的目标输入数据的概率,更高效的复现能够触发被修复的漏洞的输入数据。
实施例二
本实施例提供的触发软件漏洞的输入数据的复现方法,在实施例一的基础上,步骤204“根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对”细化包括步骤301至步骤303。
步骤301,根据旧版当前已恢复函数调用关系,确定各旧版函数的匹配信息。
步骤302,根据新版当前已恢复函数调用关系,确定各新版函数的匹配信息。
步骤303,根据各旧版函数的匹配信息和各新版函数的匹配信息,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对。
本实施例中,匹配信息可以包括以下至少一项:被调用次数、发起调用次数、发起调用时各预设调用指令类型的数量、被调用时的主调函数集合、被调用关系是否真实存在。
其中,被调用次数和发起调用次数可以直接从当前已恢复函数调用关系中获取,例如,对于旧版函数,可以从旧版当前已恢复函数调用关系中,获取该旧版函数被其它函数调用的次数作为被调用次数,获取该旧版函数调用其它函数的次数作为发起调用次数。
函数被调用时的主调函数集合,可以通过将当前已恢复函数调用关系中,调用该函数的函数形成集合获得。
当前已恢复函数调用关系中,还可以包括函数发起调用时采用的调用指令类型。进而,函数发起调用时各预设调用指令类型的数量,可以通过对当前已恢复函数调用关系中,函数发起调用时采用的各预设调用指令类型进行计数后获得。其中,函数发起调用时采用的调用指令类型,也可以理解为函数发起调用时目标操作数的类型,或者,函数发起调用时的取地址方式。具体地,在反编译出二进制程序对应的汇编程序后,可以根据函数发起调用时对应在汇编程序中的CALL Opcode确定。
被调用关系是指函数被其主调函数调用,可以从当前已恢复函数调用关系中确定,但由于当前已恢复函数调用关系并不一定准确且完整,因此被调用关系在程序运行时并不一定会真实发生,而真实函数调用关系是真实发生的,因此,可以根据真实函数调用关系中真实发生的函数调用,确定被调用关系是否真实发生。
本实施例提供的触发软件漏洞的输入数据的复现方法,通过多种匹配信息结合,能够更准确的将多个旧版函数与多个新版函数进行匹配。
可选地,步骤303“根据各旧版函数的匹配信息和各新版函数的匹配信息,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对”细化包括步骤401至步骤404。
步骤401,将旧版二进制程序的入口函数与新版二进制程序的入口函数进行匹配,获得一个匹配函数对。
本实施例中,入口函数是指程序的入口,也称主函数,常写作main(),一个程序只能有一个入口函数。由于旧版二进制程序与新版二进制程序是目标软件在修补漏洞前后分别对应的二进制程序,因此将旧版二进制程序的入口函数与新版二进制程序的入口函数确定为匹配函数对。
步骤402,根据各未匹配的旧版函数的匹配信息,以及各未匹配的新版函数的匹配信息,计算各未匹配的旧版函数与各未匹配的新版函数之间的匹配值。
可选地,匹配信息包括:被调用次数、发起调用次数、发起调用时各预设调用指令类型的数量、被调用时的主调函数集合、被调用关系是否真实存在,并且,步骤402“根据各未匹配的旧版函数的匹配信息,以及各未匹配的新版函数的匹配信息,计算各未匹配的旧版函数与各未匹配的新版函数之间的匹配值”细化包括步骤501至步骤507。
可选地,由于后续模糊测试的过程中,可能会将各旧版函数与各新版函数重新匹配,因此,匹配信息还可以包括:旧版函数与新版函数在历史匹配过程中的匹配值。
步骤501,对于任意一对未匹配的旧版函数与未匹配的新版函数执行以下操作:步骤502至步骤507。
本实施例中,主调和被调是函数之间的调用关系,调用其它函数的函数为主调函数,被其它函数调用的函数称为被调函数。示例性地,函数F1调用函数F2,则函数F2为函数F1的被调函数,函数F1为函数F2的主调函数。
步骤502,根据旧版函数和新版函数分别对应的被调用次数,确定第一匹配分数。
本实施例中,第一匹配分数可以为,旧版函数和新版函数分别对应的被调用次数中,最小值与最大值的比值。
步骤503,根据旧版函数和新版函数分别对应的发起调用次数,确定第二匹配分数。
本实施例中,第二匹配分数可以为,旧版函数和新版函数分别对应的发起调用次数中,最小值与最大值的比值。
示例性地,如果未匹配的旧版函数的发起调用次数为1且被调用次数为2,未匹配的新版函数的发起调用次数为4且被调用次数为5。则该未匹配的旧版函数与未匹配的新版函数之间,第一匹配分数为1/4,第二匹配分数为2/5。
步骤504,根据旧版函数和新版函数发起调用时分别对应的各预设调用指令类型的数量,确定第三匹配分数。
本实施例中,第三匹配分数可以为,旧版函数和新版函数发起调用时分别对应的各预设调用指令类型的数量中最小值之和加一与平均数之和加一的比值。
示例性地,预设调用指令类型包括第一调用指令类型、第二调用指令类型和第三调用指令类型。旧版函数发起调用时分别对应的第一、第二和第三调用指令类型的数量分别为0、1、0,新版函数发起调用时分别对应的第一、第二和第三调用指令类型的数量分别为1、2、1。则旧版函数和新版函数发起调用时分别对应的各预设调用指令类型的数量中最小值之和为0+1=1,平均数之和为(0+1+0)/3+(1+2+1)/3=5/3,第三匹配分数为(1/3+1)/(5/3+1)=1/2。其中,最小值之和加一,以及平均数之和加一是为了对最小值和平均数进行类归一化处理,使得计算出的第三匹配分数更加准确。
步骤505,根据旧版函数和新版函数被调用时分别对应的主调函数集合,确定第四匹配分数。
可选地,第四匹配分数为第一预设数值或第二预设数值,第一预设数值大于第二预设数值,并且,步骤505“根据旧版函数和新版函数被调用时分别对应的主调函数集合,确定第四匹配分数”细化包括步骤601至步骤602。
步骤601,响应于旧版函数和新版函数被调用时分别对应的主调函数集合之间,存在匹配函数对,确定第四匹配分数为第一预设数值。
步骤602,响应于旧版函数和新版函数被调用时分别对应的主调函数集合之间,不存在匹配函数对,确定第四匹配分数为第二预设数值。
本实施例中,第一预设数值可以为1,第二预设数值可以为0。由于目标软件中的一个函数,有可能会被多个不同的主调函数调用,因此,旧版函数与新版函数之间存在已匹配的主调函数,则可以将旧版函数和新版函数之间的第四匹配分数确定为第一预设数值。这是由于,在已匹配的函数下被调用的函数之间,更有可能是相互匹配的。
本实施例提供的触发软件漏洞的输入数据的复现方法,由于在旧版函数和新版函数被调用时分别对应的主调函数集合之间存在匹配函数对时,将第四匹配分数为第一预设数值,因此,能够更准确的将多个旧版函数与多个新版函数进行匹配。
步骤506,根据旧版函数和新版函数的被调用关系是否真实存在,确定第五匹配分数。
可选地,第五匹配分数为第三预设数值或第四预设数值,第三预设数值大于第四预设数值,步骤506“根据旧版函数和新版函数的被调用关系是否真实存在,确定第五匹配分数”细化包括步骤701至步骤702。
步骤701,响应于旧版函数的被调用关系存在于旧版真实函数调用序列中,且新版函数的被调用关系存在于新版真实函数调用序列中,确定第五匹配分数为第三预设数值。
步骤702,响应于旧版函数的被调用关系不存在于第一旧版真实函数调用序列中,或者,新版函数的被调用关系不存在于新版真实函数调用序列中,确定第五匹配分数为第四预设数值。
本实施例中,由于被调函数并不一定会在程序运行过程中被调用,而如果被调函数在运行过程中被真实调用,则被调函数会存在真实函数调用序列中。因此,需要确定旧版函数的主调函数在程序运行过程中是否真实调用了该旧版函数,新版函数的主调函数在程序运行过程中是否真实调用了该新版函数。
本实施例中,对于未匹配的旧版函数和未匹配的新版函数之间,如果二者对应的被调用关系均存在于对应的真实函数调用序列中,则可以认为二者相互匹配的可能性会更高。反之,如果二者的对应的被调用关系真实发生的情况不同,或者,二者对应的被调用关系均没有真实发生,则可以认为二者相互匹配的可能性更低。
因此,在旧版函数的被调用关系存在于旧版真实函数调用序列中,且新版函数的被调用关系存在于新版真实函数调用序列中时,确定第五匹配分数为第三预设数值。在旧版函数的被调用关系不存在于第一旧版真实函数调用序列中,或者,新版函数的被调用关系不存在于新版真实函数调用序列中时,确定第五匹配分数为第四预设数值。其中,第三预设数值可以为1,第四预设数值可以为0。
本实施例提供的触发软件漏洞的输入数据的复现方法,由于根据函数调用关系是否存在于真实函数调用序列中来确定第五匹配分数,因此,能够根据旧版二进制程序和新版二进制程序在运行时的真实情况将多个新版函数与多个旧版函数进行匹配,获得更准确的匹配函数对。
步骤507,对第一匹配分数、第二匹配分数、第三匹配分数、第四匹配分数和第五匹配分数按照分别对应的预设权重进行加权求和计算,获得未匹配的旧版函数与未匹配的新版函数之间的匹配值。
本实施例中,第一匹配分数、第二匹配分数、第三匹配分数、第四匹配分数和第五匹配分数可以分别对应的不同的预设权重,以便于在将多个旧版函数与多个新版函数进行匹配的过程中,对各匹配分数对应的预设权重进行调整,更准确的将多个旧版函数与多个新版函数进行匹配。
本实施例提供的触发软件漏洞的输入数据的复现方法,由于多个匹配信息的不同角度计算未匹配的旧版函数与未匹配的新版函数之间的匹配值,并对第一至第五匹配分数按照分别对应的预设权重进行加权求和计算,因此,能够准确计算出旧版函数与新版函数之间的匹配值。
步骤403,将匹配值最高的一对未匹配的旧版函数与未匹配的新版函数确定为一个匹配函数对。
本实施例中,匹配值的高低可以反应旧版函数与新版函数之间的匹配度,因此,将匹配值最高的一对未匹配的旧版函数与未匹配的新版函数确定为一个匹配函数对。可以理解的是,匹配函数对中的旧版函数为已匹配的旧版函数,匹配函数对中的新版函数为已匹配的新版函数。已匹配的旧版函数和已匹配的新版函数均不参与下一轮次的匹配度计算。
步骤404,重复执行计算各未匹配旧版函数与各未匹配新版函数之间的匹配值的步骤和将匹配值最高的一对未匹配的旧版函数与未匹配的新版函数确定为一个匹配函数对的步骤,直至不存在未匹配的旧版函数,或者,直至不存在未匹配的新版函数为止,以获得多个匹配函数对。
本实施例中,由于在每确定出一个匹配函数对之后,未匹配的旧版函数与未匹配的新版函数之间的匹配值有可能会发生变化,因此,在每确定出一个匹配函数对之后,需要重新计算各未匹配旧版函数与各未匹配新版函数之间的匹配值,并将再次匹配值最高的一对未匹配的旧版函数与未匹配的新版函数确定为一个匹配函数对,可以更准确的将多个旧版函数与多个新版函数进行匹配。
本实施例提供的触发软件漏洞的输入数据的复现方法,由于匹配值是根据各未匹配函数的匹配信息计算的,能够反应旧版函数与新版函数之间是否匹配,因此,将匹配值最高的一对未匹配的旧版函数与未匹配的新版函数确定为一个匹配函数对,能够将多个新版函数与多个旧版函数进行准确的匹配。
实施例三
本实施例提供的触发软件漏洞的输入数据的复现方法,在上述任意一个实施例的基础上,步骤205“根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,从多个已匹配的旧版函数中确定至少一个候选补丁函数”细化包括步骤801至步骤803。
步骤801,根据旧版当前已恢复函数调用关系,确定各匹配函数对中旧版函数的旧版被调用函数序列集合;旧版被调用函数序列集合包括至少一个旧版被调用函数序列,旧版被调用函数序列是旧版函数中的一条程序分支上函数调用指令序列所调用的函数的序列。
本实施例中,旧版当前已恢复函数调用关系包括函数调用以及发起函数调用的指令,示例性地,如果旧版当前已恢复函数调用关系为函数调用关系图,函数F1和函数F2通过从函数F1指向函数F2的有向边连接,则有向边上记录了调用函数F2的指令。调用函数的指令可以通过对汇编程序进行分析获得,也可以在程序运行过程中获得。
可以理解的是,一个函数下可以由多条程序分支,因此,一个函数下可以有多个被调用函数序列,进而,一个函数对应一个被调用函数序列集合。
步骤802,根据新版当前已恢复函数调用关系,确定各匹配函数对中新版函数的新版被调用函数序列集合;新版被调用函数序列集合包括至少一个新版被调用函数序列,新版被调用函数序列是新版函数中的一条程序分支上函数调用指令序列所调用的函数的序列。
本实施例中,确定各匹配函数对中新版函数的新版被调用函数序列集合可以参见确定各匹配函数对中旧版函数的旧版被调用函数序列集合的方式,此处不作赘述。
步骤803,响应于匹配函数对中,旧版函数的旧版被调用函数序列集合与新版函数的新版被调用函数序列集合存在不同,将匹配函数对中的旧版函数确定为候选补丁函数。
本实施例中,如果被调用函数序列中存在不同的被调用函数,或者,被调用函数的顺序不同,则被调用函数序列不同。如果旧版被调用函数序列集合与新版被调用函数序列集合中存在不同的旧版被调用函数序列和新版被调用函数序列,则被调用函数序列集合存在不同。
示例性地,旧版被调用函数序列包括函数F1、F2、和F3,且函数F1、F2和F3的被调用顺序为F1、F2和F3时。如果新版被调用函数序列包括函数F1、F2和F3,且函数F1、F2和F3的被调用顺序为F1、F2和F3,则旧版被调用函数序列与新版被调用函数序列相同。如果新版被调用函数序列包括函数F1、F2和F3,且函数F1、F2和F3被调用的顺序为F1、F3和F2,则旧版被调用函数序列与新版被调用函数序列不同。如果新版被调用函数序列包括函数F1、F2和F4,且函数F1、F2和F4被调用的顺序为F1、F2和F4,则旧版被调用函数序列与新版被调用函数序列不同。
本实施例中提供的触发软件漏洞的输入数据的复现方法,通过比较匹配函数对中旧版函数和新版函数的被调用函数序列集合,可以确定可能触发漏洞的候选补丁函数。
实施例四
本实施例提供的触发软件漏洞的输入数据的复现方法,在上述任意一个实施例的基础上,第二预设测试用例池包括多个初始测试用例,初始测试用例能够被新版二进制程序和旧版二进制程序成功运行,并且,步骤206“根据各候选补丁函数和第二预设测试用例池,对旧版二进制程序和新版二进制程序进行模糊测试,确定能够触发旧版二进制程序的漏洞的目标输入数据”细化包括步骤901。
步骤901,对各初始测试用例进行第一遍历,并在第一遍历的过程中,每遍历到一个初始测试用例,执行一次第一操作。
第一操作包括:步骤9011至步骤9018。
步骤9011,按照预设变异时间和预设变异方式对初始测试用例进行变异,获得初始测试用例对应的多个变异后测试用例。
本实施例中,预设变异时间可以是任意合适的时间,预设变异方式可以是任意合适的变异方式。每个初始测试用例可以变异出多个变异后测试用例。
步骤9012,采用旧版二进制程序运行各变异后测试用例,确定各变异后测试用例在旧版二进制程序中是否运行成功。
步骤9013,响应于任意变异后测试用例在旧版二进制程序中运行成功,获得旧版二进制程序运行变异后测试用例过程中的旧版变异后函数调用序列和旧版变异后程序执行路径。
本实施例中,可以将变异后测试用例作为输入数据,输入旧版二进制程序中运行,如果旧版二进制程序出现无响应、报错而无法分析等情况,则运行失败。如果运行成功,则可以获得旧版变异后函数调用序列和旧版变异后程序执行路径。
旧版变异后函数调用序列是指:旧版二进制程序在运行变异后测试用例的过程中所调用的函数、以及所调用的函数的顺序。
旧版变异后程序执行路径包括:旧版二进制程序在运行变异后测试用例的过程中,实际执行的程序分支。这里,由于目标软件中可能会包括多个分支,因此,目标软件的二进制程序在运行过程中,可以根据输入数据、判断条件结果等的不同而选择执行不同的分支。示例性地,如果程序中包括条件判断,如if-else语句,在条件为真和条件为假时,会执行不同的分支,如switch语句,在条件不同时,会执行不同的分支。
本实施例中,电子设备可以通过对旧版二进制程序的运行各预设测试用例的过程进行插桩跟踪、对旧版二进制程序的运行日志进行分析等,获得旧版变异后函数调用序列和旧版变异后程序执行路径。
步骤9014,采用新版二进制程序运行各变异后测试用例,确定各变异后测试用例在新版二进制程序中是否运行成功。
步骤9015,响应于任意变异后测试用例在新版二进制程序中运行成功,获得新版二进制程序运行变异后测试用例过程中的新版变异后函数调用序列和新版变异后程序执行路径。
步骤9014和步骤9015与步骤9012和步骤9013同理,此处不作赘述。
步骤9016,响应于任意变异后测试用例在旧版二进制程序中运行成功,且在新版二进制程序中运行成功,将变异后测试用例确定为候选测试用例。
本实施例中,由于新版二进制程序是更新后的旧版二进制程序,因此,对于同一个变异后测试用例,在旧版二进制程序和新版二进制程序中是否运行成功的情况可能会不同,而只有在旧版二进制程序和新版二进制程序中均运行成功的变异后测试用例,才有可能是触发旧版二进制程序漏洞的输入数据。
步骤9017,根据各候选测试用例对应的旧版变异后程序执行路径和候选补丁函数,确定对各候选测试用例进行第二遍历的顺序。
本实施例中,为了从候选测试用例中确定出目标输入数据,需要遍历各候选测试用例,并在遍历过程中对每一个候选测试用例对应的旧版变异后函数调用序列和新版变异后函数调用序列进行比较。而为了提高复现目标输入数据的效率,根据越容易执行到候选补丁函数则越容易触发漏洞的原理,根据候选测试用例对应的旧版变异后程序执行路径和候选补丁函数,确定对各候选测试用例进行第二遍历的顺序,如果候选测试用例更容易使旧版二进制程序执行到候选补丁函数,则对该候选测试用例越先遍历。
本实施例中,可以根据候选测试用例对应的旧版变异后程序执行路径与各候选补丁函数的总距离,来确定遍历各候选测试用例的顺序。
步骤9018,按照对各候选测试用例进行第二遍历的顺序对各候选测试用例进行第二遍历,并在第二遍历的过程中,每遍历到一个候选测试用例,执行第二操作。
第二操作包括步骤90181。
步骤90181,根据候选测试用例对应的旧版变异后函数调用序列和新版变异后函数调用序列,确定候选测试用例是否为目标输入数据。
本实施例中,由于修补漏洞会改变函数调用关系,因此,如果候选测试用例对应的旧版变异后函数调用序列和新版变异后函数调用序列不同,例如,函数调用序列中包括的函数、函数调用序列中函数调用顺序不同,则可以确定该候选测试用例为目标输入数据。
本实施例提供的触发软件漏洞的输入数据的复现方法,由于候选补丁函数能够影响模糊测试过程中的遍历顺序,因此,可以提高获取到目标输入数据的效率。
可选地,步骤90181“根据候选测试用例对应的旧版变异后函数调用序列和新版变异后函数调用序列,确定候选测试用例是否为目标输入数据”细化包括步骤1001至步骤1002。
步骤1001,确定旧版变异后函数调用序列的旧版末段函数调用序列,并确定新版变异后函数调用序列的新版末段函数调用序列。
本实施例中,末段函数调用序列是指二进制程序在运行过程中最后调用的预设数量的函数。
步骤1002,响应于旧版末段函数调用序列与新版末段函数调用序列不同,确定候选测试用例为目标输入数据。
本实施例中,由于旧版变异后函数调用序列和新版变异后函数调用序列较长,而在程序运行过程中,末段函数调用序列更能够反应程序的函数调用序列的不同,因此,通过比较末端函数调用序列,如果旧版二进制程序与新版二进制程序在输入数据相同的情况下,末段函数调用序列不同,则可以认为这个输入数据触发了旧版二进制程序中的漏洞,更高效的确定出目标输入数据。
可选地,步骤9012中“采用旧版二进制程序运行各变异后测试用例”细化包括步骤9012a,步骤1001中“确定旧版变异后函数调用序列的旧版末段函数调用序列”细化包括步骤1001a,步骤9014中“采用新版二进制程序运行各变异后测试用例”细化包括步骤9014a,步骤1001中“确定新版变异后函数调用序列的新版末段函数调用序列”细化包括步骤1001b。
步骤9012a,采用第一环形数组记录旧版二进制程序运行变异后测试用例过程中的函数调用。
步骤1001a,将第一环形数组中记录的函数调用按照从头至尾的顺序确定为旧版末段函数调用序列。
步骤9014a,采用第二环形数组记录新版二进制程序运行变异后测试用例过程中的函数调用;第二环形数组与第一环形数组的长度相同。
步骤1001b,将第二环形数组中记录的函数调用按照从头至尾的顺序确定为新版末段函数调用序列。
本实施例中,由于环形数组可以记录固定长度的有序数据,因此,通过环形数组记录变异后函数调用序列时,如果函数调用序列的长度超过了环形数组的长度,环形数组可以直接实现末段函数调用序列的更新,在二进制程序运行变异后测试用例时,通过环形数组记录变异后函数调用序列,可以在二进制程序运行结束后,直接根据环形数据中存储的数据,更高效地确定出旧版末段函数调用序列和新版末段函数调用序列。
可选地,步骤9017“根据各候选测试用例对应的旧版变异后程序执行路径和候选补丁函数,确定对各候选测试用例进行第二遍历的顺序”细化包括步骤1101至步骤1102。
步骤1101,计算各候选测试用例对应的旧版变异后程序执行路径与各候选补丁函数之间的执行距离。本实施例中,程序执行路径上包括程序运行过程中真实调用的函数。候选补丁函数在变异后测试用例的运行过程中有可能不会被旧版二进制程序真实调用。在旧版变异后程序执行路径包括候选补丁函时,旧版变异后程序执行路径与候选补丁函数之间的执行距离可以为0。在旧版变异后程序执行路径不包括候选补丁函时,可以根据旧版当前已恢复函数调用关系中,从旧版变异后程序执行路径上的各函数与候选补丁函数间的距离的最小值确定为旧版变异后程序执行路径与候选补丁函数之间的执行距离。
步骤1102,根据各候选测试用例对应的旧版变异后程序执行路径与各候选补丁函数之间的执行距离,确定对各候选测试用例进行第二遍历的顺序。
可选地,步骤1102“根据各候选测试用例对应的旧版变异后程序执行路径与各候选补丁函数之间的执行距离,确定对各候选测试用例进行第二遍历的顺序”细化包括步骤11021至步骤11022。
步骤11021,针对各候选测试用例,将旧版变异后程序执行路径与各候选补丁函数之间的执行距离进行求和计算,获得各候选测试用例对应的候选距离;
步骤11022,将对应的候选距离从小至大的顺序,确定为对各候选测试用例进行第二遍历的顺序。
本实施例中,候选测试用例对应的旧版变异后程序执行路径与各候选补丁函数之间的执行距离求和计算的和值越小,则表示该候选测试用例能够使得旧版二进制程序更容易执行到更多的候选补丁函数,因此,将各候选测试用例对应的旧版变异后程序执行路径与各候选补丁函数之间的执行距离从小至大,或者说从近至远的顺序,确定为各候选测试用例进行第二遍历的顺序,以使得模糊测试过程中更容易执行到候选补丁函数,提高复现目标输入数据的效率。
可选地,步骤1101“计算各候选测试用例对应的旧版变异后程序执行路径与各候选补丁函数之间的执行距离”细化包括步骤1201至步骤1204。
步骤1201,对于一个旧版变异后程序执行路径与一个候选补丁函数,获取候选补丁函数在旧版变异后程序执行路径上的前驱函数;前驱函数存在于旧版变异后程序执行路径上,且为候选补丁函数的主调函数中执行至候选补丁函数的距离最近的。
本实施例中,前驱函数是旧版变异后程序执行路径上,距离候选补丁函数最近的一个候选补丁函数的主调函数。具体地,可以在旧版完整函数关系图中,对候选补丁函数进行溯源,查找到候选补丁函数在旧版变异后程序执行路径上的前驱函数。
示例性地,图3是根据本申请实施例四提供的一种旧版当前已恢复函数调用关系的示意图。如图3所示,旧版二进制程序包括函数A、函数B、函数C1、函数C2函数C3和函数C4,函数A能够调用函数B和函数C1,函数B能够调用函数C2和函数C3,函数C3能够调用函数C4。如果旧版二进制程序在运行变异后测试用例的过程中的旧版变异后程序执行路径上包括函数A、函数B和函数C2,那么函数C3在旧版变异后程序执行路径上的前驱函数为函数B。
步骤1202,计算从旧版二进制程序的入口函数开始,按照旧版变异后程序执行路径执行至前驱函数的第一距离。
本实施例中,第一距离是指,程序运行过程中,从入口函数开始执行至前驱函数的距离。第一距离可以为从入口函数开始执行至前驱函数的路径上所有函数的跳转距离之和,每个函数的跳转距离可以是单位1,还可以是邻接距离。邻接距离即该函数内调用下一函数数量二倍的倒数与一之和。
步骤1203,计算从前驱函数执行至候选补丁函数的第二距离。
本实施例中,第二距离是指,从旧版已恢复当前函数调用关系中确定的,从前驱函数执行至候选补丁函数的距离。第二距离可以为从前驱函数执行至候选补丁函数的路径上所有函数的跳转距离之和。
示例性地,每个函数跳转距离为单位1时,在如图3所示的旧版当前已恢复函数调用关系中,从函数A至执行至函数B的第一距离为函数A的跳转距离,为1;从函数A执行至函数C2的第一距离为函数A和函数B的跳转距离之和,为2。
步骤1204,将第一距离与第二距离的和值,确定为旧版变异后程序执行路径与候选补丁函数之间的执行距离。
本实施例中,执行距离可以为第一距离与第二距离之和。继续根据上面的示例进行说明,如图3所示,如果变异后测试用例对应的旧版变异后程序执行路径为函数A、函数B和函数C2所在的路径,函数C3为候选补丁函数,则函数C3的前驱函数为函数B,旧版变异后程序执行路径与函数C3间的执行距离可以为,函数A至函数B的第一距离与函数B至函数C3的第二距离的和值,若函数A至函数B的第一距离为1,函数B与函数B至函数C3的第二距离为1,则旧版变异后程序执行路径与函数C3间的执行距离为2。
本实施例提供的触发软件漏洞的输入数据的复现方法,通过先获取候选补丁函数在旧版变异后程序执行路径上的前驱函数,再通过入口函数与前驱函数间的第一距离,以及前驱函数与候选补丁函数间的距离来计算旧版变异后程序执行路径与候选补丁函数之间的执行距离,因此,可以准确的计算出旧版变异后程序执行路径与候选补丁函数之间的执行距离,进而便于后续根据旧版变异后程序执行路径与候选补丁函数之间的执行距离确定变异后测试用例是否能够使得旧版二进制程序尽可能的执行到候选补丁函数。
可选地,步骤901“对各初始测试用例进行第一遍历,并在第一遍历的过程中,每遍历到一个初始测试用例,执行一次第一操作”之前,还包括步骤1301至步骤1302,步骤901中“对各初始测试用例进行第一遍历”细化包括步骤901a。
步骤1301,获取各初始测试用例对应的旧版初始程序执行路径。
步骤1302,根据各初始测试用例对应的旧版初始程序执行路径和各候选补丁函数,确定对各初始测试用例进行第一遍历的顺序。
步骤901a,按照对各初始测试用例进行第一遍历的顺序对各初始测试用例进行第一遍历。
本实施例中,由于第二预设测试用例池中包括的各初始测试用例能够被新版二进制程序和旧版二进制程序成功运行,因此,电子设备中可以预先存储有旧版二进制程序运行各初始测试用例过程中的旧版初始程序执行路径。或者,电子设备可以采用旧版二进制程序运行各初始测试用例,获得各初始测试用例对应的旧版初始程序执行路径。
本实施例中,可以根据各初始测试用例对应的旧版初始程序执行路径与各候选补丁函数之间的执行距离,确定对各初始测试用例进行第一遍历的顺序。计算各旧版初始程序执行路径与各候选补丁函数之间的执行距离的方式可以参见计算旧版变异后程序执行路径与各候选补丁函数之间的执行距离的方式,此处不作赘述。
本实施例中,电子设备可以将各旧版初始程序执行路径与各候选补丁函数之间的执行距离从小至大的顺序确定为对各初始测试用例进行第一遍历的顺序,以提高初始测试用例对应的变异后测试用例在旧版二进制程序中运行时执行到候选补丁函数的概率,更高效地确定出目标输入数据。
实施例五
本实施例提供的触发软件漏洞的输入数据的复现方法,在实施例四的基础上,步骤9013“响应于任意变异后测试用例在旧版二进制程序中运行成功,获得旧版二进制程序运行变异后测试用例过程中的旧版变异后函数调用序列和旧版变异后程序执行路径”之后,还包括步骤1401至步骤1403。
步骤1401,对于任意在旧版二进制程序中运行成功的变异后测试用例,执行以下操作:步骤1402至步骤1403。
步骤1402,确定旧版变异后程序执行路径是否触发对旧版二进制程序的新代码覆盖。
步骤1403,响应于旧版变异后程序执行路径触发对旧版二进制程序的新代码覆盖,将变异后测试用例作为初始测试用例添加至第二预设测试用例池。
本实施例中,为了提高模糊测试对旧版二进制程序的代码覆盖率,如果在旧版二进制程序中运行成功的变异后测试用例对应的旧版变异后程序执行路径,触发了旧版二进制程序中的新代码覆盖,则将该变异后测试用例作为初始测试用例添加至第二预设测试用例池,以对第二预设测试用例池进行更新,更新后的第二预设测试用例池可以用于下一轮模糊测试。
可选地,步骤9013“响应于任意变异后测试用例在旧版二进制程序中运行成功,获得旧版二进制程序运行变异后测试用例过程中的旧版变异后函数调用序列和旧版变异后程序执行路径”之后,还包括步骤1501至步骤1503。
步骤1501,对于任意在新版二进制程序中运行成功的变异后测试用例,执行以下操作:步骤1502至步骤1503。
步骤1502,确定旧版变异后函数调用序列中是否存在旧版当前已恢复函数调用关系中的不存在的旧版新函数调用关系。
步骤1503,响应于旧版变异后函数调用序列中存在旧版新函数调用关系,将变异后测试用例作为初始测试用例添加至第二预设测试用例池。
本实施例中,旧版当前已恢复函数调用关系中的不存在的旧版新函数调用关系可以用于对当前已恢复函数调用关系进行更新,进而改变各旧版函数与各新版函数之间的匹配,改变候选补丁函数,因此,如果在新版二进制程序中运行成功的变异后测试用例对应的旧版变异后函数调用序列中存在旧版当前已恢复函数调用关系中的不存在的旧版新函数调用关系,则需要将该变异后测试用例添加至第二预设测试用例池,以对第二预设测试用例池进行更新,更新后的第二预设测试用例池可以用于下一轮模糊测试。
可选地,步骤1502“确定旧版变异后函数调用序列中是否存在旧版当前已恢复函数调用关系中的不存在的旧版新函数调用关系”之后,还包括步骤1601。
步骤1601,响应于旧版变异后函数调用序列中存在旧版新函数调用关系,采用旧版新函数调用关系对旧版当前已恢复函数调用关系进行补充。
本实施例中,由于旧版变异后函数调用序列中存在旧版新函数调用关系,因此,可以采用旧版新函数调用关系对旧版当前已恢复函数调用关系进行补充,以获得更加完整的旧版当前已恢复函数调用关系,进而更准确的匹配各旧版函数和各新版函数。
可选地,步骤9015“响应于任意变异后测试用例在新版二进制程序中运行成功,获得新版二进制程序运行变异后测试用例过程中的新版变异后函数调用序列和新版变异后程序执行路径”之后,还包括步骤1701至步骤1703。
步骤1701,对于任意在新版二进制程序中运行成功的变异后测试用例,执行以下操作:步骤1702至步骤1703。
步骤1702,确定新版变异后程序执行路径是否触发对新版二进制程序的新代码覆盖。
步骤1703响应于新版变异后程序执行路径触发对新版二进制程序的新代码覆盖,将变异后测试用例作为初始测试用例添加至第二预设测试用例池。
本实施例中,为了提高模糊测试对新版二进制程序的代码覆盖率,如果在新版二进制程序中运行成功的变异后测试用例对应的新版变异后程序执行路径,触发了新版二进制程序中的新代码覆盖,则将该变异后测试用例作为初始测试用例添加至第二预设测试用例池,以对第二预设测试用例池进行更新,更新后的第二预设测试用例池可以用于下一轮模糊测试。
可选地,步骤9015“响应于任意变异后测试用例在新版二进制程序中运行成功,获得新版二进制程序运行变异后测试用例过程中的新版变异后函数调用序列和新版变异后程序执行路径”之后,还包括步骤1801至步骤1803。
步骤1801,对于任意在新版二进制程序中运行成功的变异后测试用例,执行以下操作:步骤1802至步骤1803。
步骤1802,确定新版变异后函数调用序列中是否存在新版当前已恢复函数调用关系中的不存在的新版新函数调用关系。
步骤1803,响应于新版变异后函数调用序列中存在新版新函数调用关系,将变异后测试用例作为初始测试用例添加至第二预设测试用例池。
本实施例中,新版当前已恢复函数调用关系中的不存在的新版新函数调用关系可以用于对当前已恢复函数调用关系进行更新,进而改变各新版函数与各新版函数之间的匹配,改变候选补丁函数,因此,如果在新版二进制程序中运行成功的变异后测试用例对应的新版变异后函数调用序列中存在新版当前已恢复函数调用关系中的不存在的新版新函数调用关系,则需要将该变异后测试用例添加至第二预设测试用例池,以对第二预设测试用例池进行更新,更新后的第二预设测试用例池可以用于下一轮模糊测试。
可选地,步骤1802“确定新版变异后函数调用序列中是否存在新版当前已恢复函数调用关系中的不存在的新版新函数调用关系”之后,还包括:步骤1901。
步骤1901,响应于新版变异后函数调用序列中存在新版新函数调用关系,采用新版新函数调用关系对新版当前已恢复函数调用关系进行补充。
本实施例中,由于新版变异后函数调用序列中存在新版新函数调用关系,因此,可以采用新版新函数调用关系对新版当前已恢复函数调用关系进行补充,以获得更加完整的新版当前已恢复函数调用关系,进而更准确的匹配各新版函数和各新版函数。
可选地,步骤901“对各初始测试用例进行第一遍历,并在第一遍历的过程中,每遍历到一个初始测试用例,执行一次第一操作”之后,还包括步骤2001。
步骤2001,重复执行根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对的步骤、根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,从多个已匹配的旧版函数中确定至少一个候选补丁函数的步骤,以及对各初始测试用例进行第一遍历,并在第一遍历的过程中,每遍历到一个初始测试用例,执行一次第一操作的步骤,直至满足模糊测试的结束条件。
本实施例中,模糊测试可以执行多轮次,直至满足模糊测试的结束条件,因此,在每轮次模糊测试过程中,只要变异后测试用例在运行过程中,出现了新代码覆盖就可以对第二测试用例池进行更新,出现了新函数调用就可以对第二测试用例池和候选补丁函数中的至少一项进行更新,以提高下一轮模糊测试确定出目标输入数据的效率。其中,候选补丁函数的更新需要对匹配函数对进行更新。匹配函数对的更新需要对旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系中的至少一项进行更新。因此,可以通过各旧版变异后函数调用序列对旧版当前已恢复函数调用关系进行更新,通过各新版变异后函数调用序列对新版当前已恢复函数调用关系进行更新。
本实施例中,模糊测试的结束条件可以为模糊测试的运行轮次达到预设次数、模糊测试的运行时间达到预设时间、确定出的目标输入数据的数量达到预设数量等,此处不做限定。
实施例六
图4是根据本申请实施例六提供的触发软件漏洞的输入数据的复现方法的流程示意图。如图4所示,本实施例中,触发软件漏洞的输入数据的复现方法包括步骤S2101至步骤S2107。
步骤S2101,电子设备获取目标软件在修补漏洞前的旧版二进制程序包括的多个旧版函数和旧版静态函数调用关系,并获取目标软件在修补漏洞后的新版二进制程序包括的多个新版函数和新版静态函数调用关系。
步骤S2102,电子设备获取旧版二进制程序在运行第一测试用例的过程中的旧版真实函数调用序列,并获取新版二进制程序在运行第一测试用例的过程中的新版真实函数调用序列;第一测试用例属于第一预设测试用例池。
步骤S2103,电子设备根据旧版静态函数调用关系和旧版真实函数调用系列,确定旧版当前已恢复函数调用关系,并根据新版静态函数调用关系和新版真实函数调用序列,确定新版当前已恢复函数调用关系。
步骤S2104,电子设备根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对;匹配函数对包括相互匹配的旧版函数和新版函数。
步骤S2105,电子设备根据旧版当前已恢复函数调用关系,确定各匹配函数对中旧版函数的旧版被调用函数序列集合;根据新版当前已恢复函数调用关系,确定各匹配函数对中新版函数的新版被调用函数序列集合。
步骤S2106,电子设备响应于匹配函数对中,旧版函数的旧版被调用函数序列集合与新版函数的新版被调用函数序列集合存在不同,将匹配函数对中的旧版函数确定为候选补丁函数。
步骤S2107,电子设备根据各候选补丁函数和第二预设测试用例池,对旧版二进制程序和新版二进制程序进行模糊测试,确定能够触发旧版二进制程序的漏洞的目标输入数据。
图5是根据本申请实施例六提供的触发软件漏洞的输入数据的复现方法中模糊测试的流程示意图,如图5所示,模糊测试包括:
步骤S2201,对各初始测试用例进行第一遍历,并在第一遍历的过程中,每遍历到一个初始测试用例,执行一次第一操作。
第一操作包括:步骤S2202至步骤S2208。
步骤S2202,按照预设变异时间和预设变异方式对当前初始测试用例进行变异,获得当前初始测试用例对应的多个变异后测试用例。
步骤S2203,采用旧版二进制程序运行各变异后测试用例,确定各变异后测试用例在旧版二进制程序中是否运行成功。
步骤S2204,响应于任意变异后测试用例在旧版二进制程序中运行成功,获得旧版二进制程序运行变异后测试用例过程中的旧版变异后函数调用序列和旧版变异后程序执行路径。
步骤S2205,采用新版二进制程序运行各变异后测试用例,确定各变异后测试用例在新版二进制程序中是否运行成功。
步骤S2206,响应于任意变异后测试用例在新版二进制程序中运行成功,获得新版二进制程序运行变异后测试用例过程中的新版变异后函数调用序列和新版变异后程序执行路径。
步骤S2207,响应于任意变异后测试用例在旧版二进制程序中运行成功,且在新版二进制程序中运行成功,将变异后测试用例确定为候选测试用例。
步骤S2208,根据各候选测试用例对应的旧版变异后程序执行路径和候选补丁函数,确定对各候选测试用例进行第二遍历的顺序,并按照对各候选测试用例进行第二遍历的顺序对各候选测试用例进行第二遍历,并在第二遍历的过程中,每遍历到一个候选测试用例,执行第二操作。
第二操作包括:步骤S2209。
步骤S2209,根据候选测试用例对应的旧版变异后函数调用序列和新版变异后函数调用序列,确定候选测试用例是否为目标输入数据。
步骤S2204后还包括步骤S2210:对于任意在旧版二进制程序或新版二进制程序中运行成功的变异后测试用例,执行以下操作:
步骤S2211,确定变异后测试用例对应的旧版变异后程序执行路径是否触发对旧版二进制程序的新代码覆盖,对应的新版变异后程序执行路径是否触发对新版二进制程序的新代码覆盖;
步骤S2212,响应于触发对旧版二进制程序的新代码覆盖或触发对新版二进制程序的新代码覆盖,将变异后测试用例作为初始测试用例添加至第二预设测试用例池。
步骤S2204后还包括步骤S2213:对于任意在旧版二进制程序或新版二进制程序中运行成功的变异后测试用例,执行以下操作:
步骤S2214,确定变异后测试用例对应的旧版变异后函数调用序列中是否存在旧版当前已恢复函数调用关系中的不存在的旧版新函数调用关系,对应的新版变异后函数调用序列中是否存在新版当前已恢复函数调用关系中的不存在的新版新函数调用关系;
步骤S2215,响应于存在旧版新函数调用关系或新版新函数调用关系,将变异后测试用例作为初始测试用例添加至第二预设测试用例池。
步骤S2215还包括,采用新版新函数调用关系对旧版当前已恢复函数调用关系进行补充,和/或,采用新版新函数调用关系对新版当前已恢复函数调用关系进行补充。
需要说明的是,在图4和图5中所示的各个步骤,并不构成对本申请的具体限定。在本申请另一些实施例中,触发软件漏洞的输入数据的复现过程可以包括比图4中更多或者更少的步骤,模糊测试的过程可以包括比图5中更多或者更少的步骤,图4和图5中的一些步骤可以由具有相同功能的步骤替换,或者,图4和图5中的一些步骤可以被拆分成多个步骤。实施例七
图6是根据本申请实施例七提供的触发软件漏洞的输入数据的复现装置的结构示意图。如图6所示,本实施例提供的触发软件漏洞的输入数据的复现装置60包括:第一获取模块61、第二获取模块62、第一确定模块63、匹配模块64、第二确定模块65和第三确定模块66。
第一获取模块61,用于获取目标软件在修补漏洞前的旧版二进制程序包括的多个旧版函数和旧版静态函数调用关系,并获取目标软件在修补漏洞后的新版二进制程序包括的多个新版函数和新版静态函数调用关系。
第二获取模块62,用于获取旧版二进制程序在运行第一测试用例的过程中的旧版真实函数调用序列,并获取新版二进制程序在运行第一测试用例的过程中的新版真实函数调用序列;第一测试用例属于第一预设测试用例池。
第一确定模块63,用于根据旧版静态函数调用关系和旧版真实函数调用系列,确定旧版当前已恢复函数调用关系,并根据新版静态函数调用关系和新版真实函数调用序列,确定新版当前已恢复函数调用关系。
匹配模块64,用于根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对;匹配函数对包括相互匹配的旧版函数和新版函数。
第二确定模块65,用于根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,从多个已匹配的旧版函数中确定至少一个候选补丁函数。
第三确定模块66,用于根据各候选补丁函数和第二预设测试用例池,对旧版二进制程序和新版二进制程序进行模糊测试,确定能够触发旧版二进制程序的漏洞的目标输入数据。
可选地,第一获取模块61具体用于:
采用静态反汇编程序对旧版二进制程序进行识别,获取多个旧版函数和旧版静态函数调用关系;
采用静态反汇编程序对新版二进制程序进行识别,获取多个新版函数和新版静态函数调用关系。
可选地,第一确定模块63具体用于:
采用旧版真实函数调用序列中存在的真实函数调用关系对旧版静态函数调用关系进行补充,获得旧版当前已恢复函数调用关系;
采用新版真实函数调用序列中存在的真实函数调用关系对新版静态函数调用关系进行补充,获得新版当前已恢复函数调用关系。
可选地,匹配模块64具体用于:
根据旧版当前已恢复函数调用关系,确定各旧版函数的匹配信息;
根据新版当前已恢复函数调用关系,确定各新版函数的匹配信息;
根据各旧版函数的匹配信息和各新版函数的匹配信息,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对。
可选地,匹配模块64具体还用于:
将旧版二进制程序的入口函数与新版二进制程序的入口函数进行匹配,获得一个匹配函数对;
根据各未匹配的旧版函数的匹配信息,以及各未匹配的新版函数的匹配信息,计算各未匹配的旧版函数与各未匹配的新版函数之间的匹配值;
将匹配值最高的一对未匹配的旧版函数与未匹配的新版函数确定为一个匹配函数对;
重复执行计算各未匹配旧版函数与各未匹配新版函数之间的匹配值的步骤和将匹配值最高的一对未匹配的旧版函数与未匹配的新版函数确定为一个匹配函数对的步骤,直至不存在未匹配的旧版函数,或者,直至不存在未匹配的新版函数为止,以获得多个匹配函数对。
可选地,匹配信息包括:被调用次数、发起调用次数、发起调用时各预设调用指令类型的数量、被调用时的主调函数集合、被调用关系是否真实存在。匹配模块64具体还用于:
对于任意一对未匹配的旧版函数与未匹配的新版函数执行以下操作:
根据旧版函数和新版函数分别对应的被调用次数,确定第一匹配分数;
根据旧版函数和新版函数分别对应的发起调用次数,确定第二匹配分数;
根据旧版函数和新版函数发起调用时分别对应的各预设调用指令类型的数量,确定第三匹配分数;
根据旧版函数和新版函数被调用时分别对应的主调函数集合,确定第四匹配分数;
根据旧版函数和新版函数的被调用关系是否真实存在,确定第五匹配分数;
对第一匹配分数、第二匹配分数、第三匹配分数、第四匹配分数和第五匹配分数按照分别对应的预设权重进行加权求和计算,获得未匹配的旧版函数与未匹配的新版函数之间的匹配值。
可选地,第四匹配分数为第一预设数值或第二预设数值;第一预设数值大于第二预设数值;可选地,匹配模块64具体还用于:
响应于旧版函数和新版函数被调用时分别对应的主调函数集合之间,存在匹配函数对,确定第四匹配分数为第一预设数值;
响应于旧版函数和新版函数被调用时分别对应的主调函数集合之间,不存在匹配函数对,确定第四匹配分数为第二预设数值。
可选地,第五匹配分数为第三预设数值或第四预设数值;第三预设数值大于第四预设数值;可选地,匹配模块64具体还用于:
响应于旧版函数的被调用关系存在于旧版真实函数调用序列中,且新版函数的被调用关系存在于新版真实函数调用序列中,确定第五匹配分数为第三预设数值;
响应于旧版函数的被调用关系不存在于第一旧版真实函数调用序列中,或者,新版函数的被调用关系不存在于新版真实函数调用序列中,确定第五匹配分数为第四预设数值。
可选地,第二确定模块65具体用于:
根据旧版当前已恢复函数调用关系,确定各匹配函数对中旧版函数的旧版被调用函数序列集合;旧版被调用函数序列集合包括至少一个旧版被调用函数序列,旧版被调用函数序列是旧版函数中的一条程序分支上函数调用指令序列所调用的函数的序列;
根据新版当前已恢复函数调用关系,确定各匹配函数对中新版函数的新版被调用函数序列集合;新版被调用函数序列集合包括至少一个新版被调用函数序列,新版被调用函数序列是新版函数中的一条程序分支上函数调用指令序列所调用的函数的序列;
响应于匹配函数对中,旧版函数的旧版被调用函数序列集合与新版函数的新版被调用函数序列集合存在不同,将匹配函数对中的旧版函数确定为候选补丁函数。
可选地,第二预设测试用例池包括多个初始测试用例,初始测试用例能够被新版二进制程序和旧版二进制程序成功运行;第三确定模块66具体用于:
对各初始测试用例进行第一遍历,并在第一遍历的过程中,每遍历到一个初始测试用例,执行一次第一操作;
第一操作包括:
按照预设变异时间和预设变异方式对初始测试用例进行变异,获得初始测试用例对应的多个变异后测试用例;
采用旧版二进制程序运行各变异后测试用例,确定各变异后测试用例在旧版二进制程序中是否运行成功;
响应于任意变异后测试用例在旧版二进制程序中运行成功,获得旧版二进制程序运行变异后测试用例过程中的旧版变异后函数调用序列和旧版变异后程序执行路径;
采用新版二进制程序运行各变异后测试用例,确定各变异后测试用例在新版二进制程序中是否运行成功;
响应于任意变异后测试用例在新版二进制程序中运行成功,获得新版二进制程序运行变异后测试用例过程中的新版变异后函数调用序列和新版变异后程序执行路径;
响应于任意变异后测试用例在旧版二进制程序中运行成功,且在新版二进制程序中运行成功,将变异后测试用例确定为候选测试用例;
根据各候选测试用例对应的旧版变异后程序执行路径和候选补丁函数,确定对各候选测试用例进行第二遍历的顺序;
按照对各候选测试用例进行第二遍历的顺序对各候选测试用例进行第二遍历,并在第二遍历的过程中,每遍历到一个候选测试用例,执行第二操作;
第二操作包括:
根据候选测试用例对应的旧版变异后函数调用序列和新版变异后函数调用序列,确定候选测试用例是否为目标输入数据。
可选地,第三确定模块66具体还用于:
确定旧版变异后函数调用序列的旧版末段函数调用序列,并确定新版变异后函数调用序列的新版末段函数调用序列;
响应于旧版末段函数调用序列与新版末段函数调用序列不同,确定候选测试用例为目标输入数据。
可选地,第三确定模块66具体还用于:
采用第一环形数组记录旧版二进制程序运行变异后测试用例过程中的函数调用;
确定旧版变异后函数调用序列的旧版末段函数调用序列,包括:
将第一环形数组中记录的函数调用按照从头至尾的顺序确定为旧版末段函数调用序列;
采用新版二进制程序运行各变异后测试用例,包括:
采用第二环形数组记录新版二进制程序运行变异后测试用例过程中的函数调用;第二环形数组与第一环形数组的长度相同;
确定新版变异后函数调用序列的新版末段函数调用序列,包括:
将第二环形数组中记录的函数调用按照从头至尾的顺序确定为新版末段函数调用序列。
可选地,第三确定模块66具体还用于:
计算各候选测试用例对应的旧版变异后程序执行路径与各候选补丁函数之间的执行距离;
根据各候选测试用例对应的旧版变异后程序执行路径与各候选补丁函数之间的执行距离,确定对各候选测试用例进行第二遍历的顺序。
可选地,第三确定模块66具体还用于:
对于一个旧版变异后程序执行路径与一个候选补丁函数,获取候选补丁函数在旧版变异后程序执行路径上的前驱函数;前驱函数存在于旧版变异后程序执行路径上,且为候选补丁函数的主调函数中执行至候选补丁函数的距离最近的;
计算从旧版二进制程序的入口函数开始,按照旧版变异后程序执行路径执行至前驱函数的第一距离;
计算从前驱函数执行至候选补丁函数的第二距离;
将第一距离与第二距离的和值,确定为旧版变异后程序执行路径与候选补丁函数之间的执行距离。
可选地,第三确定模块66具体还用于:
针对各候选测试用例,将旧版变异后程序执行路径与各候选补丁函数之间的执行距离进行求和计算,获得各候选测试用例对应的候选距离;
将对应的候选距离从小至大的顺序,确定为对各候选测试用例进行第二遍历的顺序。
可选地,第三确定模块66具体还用于:
获取各初始测试用例对应的旧版初始程序执行路径;
根据各初始测试用例对应的旧版初始程序执行路径和各候选补丁函数,确定对各初始测试用例进行第一遍历的顺序;
对各初始测试用例进行第一遍历,包括:
按照对各初始测试用例进行第一遍历的顺序对各初始测试用例进行第一遍历。
可选地,第三确定模块66具体还用于:
对于任意在旧版二进制程序中运行成功的变异后测试用例,执行以下操作:
确定旧版变异后程序执行路径是否触发对旧版二进制程序的新代码覆盖;
响应于旧版变异后程序执行路径触发对旧版二进制程序的新代码覆盖,将变异后测试用例作为初始测试用例添加至第二预设测试用例池。
可选地,第三确定模块66具体还用于:
对于任意在旧版二进制程序中运行成功的变异后测试用例,执行以下操作:
确定旧版变异后函数调用序列中是否存在旧版当前已恢复函数调用关系中的不存在的旧版新函数调用关系;
响应于旧版变异后函数调用序列中存在旧版新函数调用关系,将变异后测试用例作为初始测试用例添加至第二预设测试用例池。
可选地,第三确定模块66具体还用于:
响应于旧版变异后函数调用序列中存在旧版新函数调用关系,采用旧版新函数调用关系对旧版当前已恢复函数调用关系进行补充。
可选地,第三确定模块66具体还用于:
对于任意在新版二进制程序中运行成功的变异后测试用例,执行以下操作:
确定新版变异后程序执行路径是否触发对新版二进制程序的新代码覆盖;
响应于新版变异后程序执行路径触发对新版二进制程序的新代码覆盖,将变异后测试用例作为初始测试用例添加至第二预设测试用例池。
可选地,第三确定模块66具体还用于:
对于任意在新版二进制程序中运行成功的变异后测试用例,执行以下操作:
确定新版变异后函数调用序列中是否存在新版当前已恢复函数调用关系中的不存在的新版新函数调用关系;
响应于新版变异后函数调用序列中存在新版新函数调用关系,将变异后测试用例作为初始测试用例添加至第二预设测试用例池。
可选地,第三确定模块66具体还用于:
响应于新版变异后函数调用序列中存在新版新函数调用关系,采用新版新函数调用关系对新版当前已恢复函数调用关系进行补充。
可选地,第三确定模块66具体还用于:
重复执行根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对的步骤、根据旧版当前已恢复函数调用关系和新版当前已恢复函数调用关系,从多个已匹配的旧版函数中确定至少一个候选补丁函数的步骤,以及对各初始测试用例进行第一遍历,并在第一遍历的过程中,每遍历到一个初始测试用例,执行一次第一操作的步骤,直至满足模糊测试的结束条件。
本实施例提供的触发软件漏洞的输入数据的复现装置可以执行上述任意一个实施例提供的触发软件漏洞的输入数据的复现方法,具体的实现方式与原理类似,此处不再赘述。
实施例八
图7是根据本申请实施例八提供的电子设备的结构示意图。如图7所示,本实施例提供的电子设备70包括:处理器72以及与处理器72通信连接的存储器71。
存储器71存储计算机执行指令。
处理器72执行存储器71存储的计算机执行指令,实现如上述任意一个实施例提供的触发软件漏洞的输入数据的复现方法,具体的实现方式与原理类似,此处不再赘述。
可选地,电子设备70还包括收发器。收发器用于收发数据。收发器、存储器和处理器之间电路互连。
存储器、处理器和收发器之间可以通过总线实现通信连接和电路互连。总线可以是工业标准体系结构(Industry Standard Architecture,简称为ISA)总线、外部设备互连(Peripheral Component Interconnect,简称为PCI)总线或扩展工业标准体系结构(Extended Industry Standard Architecture,简称为EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图7中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
存储器71可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘等。
在示例性实施例中,电子设备70可以被一个或多个应用专用集成电路(ASIC)、数字信号处理器(DSP)、数字信号处理设备(DSPD)、可编程逻辑器件(PLD)、现场可编程门阵列(FPGA)、控制器、微控制器、微处理器或其他电子元件实现,用于执行上述触发软件漏洞的输入数据的复现方法。
本申请的实施例还提供一种计算机可读存储介质,计算机可读存储介质中存储有计算机执行指令,计算机执行指令被处理器执行时用于实现如上述任意一个实施例提供的触发软件漏洞的输入数据的复现方法,具体的实现方式与原理类似,此处不再赘述。示例性地,计算机可读存储介质可以为只读存储器(ROM)、随机存取存储器(RAM)、磁带、软盘和光数据存储设备等。
本申请的实施例还提供一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现上述任意一个实施例提供的触发软件漏洞的输入数据的复现方法,具体的实现方式与原理类似,此处不再赘述。
应该理解,上述的设备实施例仅是示意性的,本申请的设备还可通过其它的方式实现。例如,上述实施例中模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。例如,多个模块可以结合,或者可以集成到另一个系统,或一些特征可以忽略或不执行。另外,若无特别说明,在本申请各个实施例中的各功能模块可以集成在一个模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一起。上述集成的模块既可以采用硬件的形式实现,也可以采用软件程序模块的形式实现。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于可选实施例,所涉及的动作和模块并不一定是本申请所必须的。虽然流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,流程图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
在本文中,采用了诸如201、202、203a、203b等步骤代号,其目的是为了更清楚简要地表述相应内容,不构成顺序上的实质性限制,本领域技术人员在具体实施时,可能会先执行步骤201后执行步骤202、同时执行步骤203a和步骤203b等,但这些均应在本申请的保护范围之内。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求书指出。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求书来限制。

Claims (26)

1.一种触发软件漏洞的输入数据的复现方法,其特征在于,包括:
获取目标软件在修补漏洞前的旧版二进制程序包括的多个旧版函数和旧版静态函数调用关系,并获取目标软件在修补漏洞后的新版二进制程序包括的多个新版函数和新版静态函数调用关系;
获取所述旧版二进制程序在运行第一测试用例的过程中的旧版真实函数调用序列,并获取所述新版二进制程序在运行第一测试用例的过程中的新版真实函数调用序列;所述第一测试用例属于第一预设测试用例池;
根据所述旧版静态函数调用关系和所述旧版真实函数调用系列,确定旧版当前已恢复函数调用关系,并根据所述新版静态函数调用关系和所述新版真实函数调用序列,确定新版当前已恢复函数调用关系;
根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对;匹配函数对包括相互匹配的旧版函数和新版函数;
根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,从多个已匹配的旧版函数中确定至少一个候选补丁函数;
根据各候选补丁函数和第二预设测试用例池,对所述旧版二进制程序和所述新版二进制程序进行模糊测试,确定能够触发旧版二进制程序的漏洞的目标输入数据。
2.根据权利要求1所述的方法,其特征在于,所述获取目标软件在修补漏洞前的旧版二进制程序包括的多个旧版函数和旧版静态函数调用关系,包括:
采用静态反汇编程序对所述旧版二进制程序进行识别,获取多个所述旧版函数和所述旧版静态函数调用关系;
所述获取目标软件在修补漏洞后的新版二进制程序包括的多个新版函数和新版静态函数调用关系,包括:
采用静态反汇编程序对所述新版二进制程序进行识别,获取多个新版函数和所述新版静态函数调用关系。
3.根据权利要求1所述的方法,其特征在于,所述根据所述旧版静态函数调用关系和所述旧版真实函数调用系列,确定旧版当前已恢复函数调用关系,包括:
采用所述旧版真实函数调用序列中存在的真实函数调用关系对所述旧版静态函数调用关系进行补充,获得所述旧版当前已恢复函数调用关系;
所述根据所述新版静态函数调用关系和所述新版真实函数调用序列,确定新版当前已恢复函数调用关系,包括:
采用所述新版真实函数调用序列中存在的真实函数调用关系对所述新版静态函数调用关系进行补充,获得所述新版当前已恢复函数调用关系。
4.根据权利要求1所述的方法,其特征在于,所述根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对,包括:
根据所述旧版当前已恢复函数调用关系,确定各旧版函数的匹配信息;
根据所述新版当前已恢复函数调用关系,确定各新版函数的匹配信息;
根据各旧版函数的匹配信息和各新版函数的匹配信息,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对。
5.根据权利要求4所述的方法,其特征在于,所述根据各旧版函数的匹配信息和各新版函数的匹配信息,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对,包括:
将所述旧版二进制程序的入口函数与所述新版二进制程序的入口函数进行匹配,获得一个匹配函数对;
根据各未匹配的旧版函数的匹配信息,以及各未匹配的新版函数的匹配信息,计算各未匹配的旧版函数与各未匹配的新版函数之间的匹配值;
将匹配值最高的一对未匹配的旧版函数与未匹配的新版函数确定为一个匹配函数对;
重复执行所述计算各未匹配旧版函数与各未匹配新版函数之间的匹配值的步骤和所述将匹配值最高的一对未匹配的旧版函数与未匹配的新版函数确定为一个匹配函数对的步骤,直至不存在未匹配的旧版函数,或者,直至不存在未匹配的新版函数为止,以获得多个匹配函数对。
6.根据权利要求5所述的方法,其特征在于,所述匹配信息包括:被调用次数、发起调用次数、发起调用时各预设调用指令类型的数量、被调用时的主调函数集合、被调用关系是否真实存在;
所述根据各未匹配的旧版函数的匹配信息,以及各未匹配的新版函数的匹配信息,计算各未匹配的旧版函数与各未匹配的新版函数之间的匹配值,包括:
对于任意一对未匹配的旧版函数与未匹配的新版函数执行以下操作:
根据旧版函数和新版函数分别对应的被调用次数,确定第一匹配分数;
根据旧版函数和新版函数分别对应的发起调用次数,确定第二匹配分数;
根据旧版函数和新版函数发起调用时分别对应的各预设调用指令类型的数量,确定第三匹配分数;
根据旧版函数和新版函数被调用时分别对应的主调函数集合,确定第四匹配分数;
根据旧版函数和新版函数的被调用关系是否真实存在,确定第五匹配分数;
对第一匹配分数、第二匹配分数、第三匹配分数、第四匹配分数和第五匹配分数按照分别对应的预设权重进行加权求和计算,获得未匹配的旧版函数与未匹配的新版函数之间的匹配值。
7.根据权利要求6所述的方法,其特征在于,所述第四匹配分数为第一预设数值或第二预设数值;所述第一预设数值大于所述第二预设数值;
所述根据旧版函数和新版函数被调用时分别对应的主调函数集合,确定第四匹配分数,包括:
响应于旧版函数和新版函数被调用时分别对应的主调函数集合之间,存在匹配函数对,确定所述第四匹配分数为第一预设数值;
响应于旧版函数和新版函数被调用时分别对应的主调函数集合之间,不存在匹配函数对,确定所述第四匹配分数为第二预设数值。
8.根据权利要求6所述的方法,其特征在于,所述第五匹配分数为第三预设数值或第四预设数值;所述第三预设数值大于所述第四预设数值;
所述根据旧版函数和新版函数的被调用关系是否真实存在,确定第五匹配分数,包括:
响应于旧版函数的被调用关系存在于所述旧版真实函数调用序列中,且新版函数的被调用关系存在于所述新版真实函数调用序列中,确定所述第五匹配分数为所述第三预设数值;
响应于旧版函数的被调用关系不存在于所述旧版真实函数调用序列中,或者,新版函数的被调用关系不存在于所述新版真实函数调用序列中,确定所述第五匹配分数为所述第四预设数值。
9.根据权利要求1所述的方法,其特征在于,所述根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,从多个已匹配的旧版函数中确定至少一个候选补丁函数,包括:
根据所述旧版当前已恢复函数调用关系,确定各匹配函数对中旧版函数的旧版被调用函数序列集合;所述旧版被调用函数序列集合包括至少一个旧版被调用函数序列,所述旧版被调用函数序列是旧版函数中的一条程序分支上函数调用指令序列所调用的函数的序列;
根据所述新版当前已恢复函数调用关系,确定各匹配函数对中新版函数的新版被调用函数序列集合;所述新版被调用函数序列集合包括至少一个新版被调用函数序列,所述新版被调用函数序列是新版函数中的一条程序分支上函数调用指令序列所调用的函数的序列;
响应于匹配函数对中,旧版函数的旧版被调用函数序列集合与新版函数的新版被调用函数序列集合存在不同,将匹配函数对中的旧版函数确定为候选补丁函数。
10.根据权利要求1所述的方法,其特征在于,所述第二预设测试用例池包括多个初始测试用例,所述初始测试用例能够被所述新版二进制程序和所述旧版二进制程序成功运行;
所述根据各候选补丁函数和第二预设测试用例池,对所述旧版二进制程序和所述新版二进制程序进行模糊测试,确定能够触发旧版二进制程序的漏洞的目标输入数据,包括:
对各初始测试用例进行第一遍历,并在第一遍历的过程中,每遍历到一个初始测试用例,执行一次第一操作;
所述第一操作包括:
按照预设变异时间和预设变异方式对初始测试用例进行变异,获得初始测试用例对应的多个变异后测试用例;
采用所述旧版二进制程序运行各所述变异后测试用例,确定各所述变异后测试用例在所述旧版二进制程序中是否运行成功;
响应于任意所述变异后测试用例在所述旧版二进制程序中运行成功,获得所述旧版二进制程序运行所述变异后测试用例过程中的旧版变异后函数调用序列和旧版变异后程序执行路径;
采用所述新版二进制程序运行各所述变异后测试用例,确定各所述变异后测试用例在所述新版二进制程序中是否运行成功;
响应于任意所述变异后测试用例在所述新版二进制程序中运行成功,获得所述新版二进制程序运行所述变异后测试用例过程中的新版变异后函数调用序列和新版变异后程序执行路径;
响应于任意所述变异后测试用例在所述旧版二进制程序中运行成功,且在所述新版二进制程序中运行成功,将所述变异后测试用例确定为候选测试用例;
根据各所述候选测试用例对应的所述旧版变异后程序执行路径和所述候选补丁函数,确定对各所述候选测试用例进行第二遍历的顺序;
按照对各所述候选测试用例进行第二遍历的顺序对各所述候选测试用例进行第二遍历,并在第二遍历的过程中,每遍历到一个所述候选测试用例,执行第二操作;
所述第二操作包括:
根据所述候选测试用例对应的旧版变异后函数调用序列和新版变异后函数调用序列,确定所述候选测试用例是否为所述目标输入数据。
11.根据权利要求10所述的方法,其特征在于,所述根据所述候选测试用例对应的旧版变异后函数调用序列和新版变异后函数调用序列,确定所述候选测试用例是否为所述目标输入数据,包括:
确定所述旧版变异后函数调用序列的旧版末段函数调用序列,并确定所述新版变异后函数调用序列的新版末段函数调用序列;
响应于所述旧版末段函数调用序列与所述新版末段函数调用序列不同,确定所述候选测试用例为所述目标输入数据。
12.根据权利要求11所述的方法,其特征在于,所述采用所述旧版二进制程序运行各所述变异后测试用例,包括:
采用第一环形数组记录所述旧版二进制程序运行所述变异后测试用例过程中的函数调用;
所述确定所述旧版变异后函数调用序列的旧版末段函数调用序列,包括:
将所述第一环形数组中记录的函数调用按照从头至尾的顺序确定为所述旧版末段函数调用序列;
所述采用所述新版二进制程序运行各所述变异后测试用例,包括:
采用第二环形数组记录所述新版二进制程序运行所述变异后测试用例过程中的函数调用;所述第二环形数组与所述第一环形数组的长度相同;
所述确定所述新版变异后函数调用序列的新版末段函数调用序列,包括:
将所述第二环形数组中记录的函数调用按照从头至尾的顺序确定为所述新版末段函数调用序列。
13.根据权利要求10所述的方法,其特征在于,所述根据各所述候选测试用例对应的所述旧版变异后程序执行路径和所述候选补丁函数,确定对各所述候选测试用例进行第二遍历的顺序,包括:
计算各候选测试用例对应的旧版变异后程序执行路径与各候选补丁函数之间的执行距离;
根据各候选测试用例对应的旧版变异后程序执行路径与各所述候选补丁函数之间的执行距离,确定对各所述候选测试用例进行第二遍历的顺序。
14.根据权利要求13所述的方法,其特征在于,所述计算各候选测试用例对应的旧版变异后程序执行路径与各候选补丁函数之间的执行距离,包括:
对于一个所述旧版变异后程序执行路径与一个所述候选补丁函数,获取所述候选补丁函数在所述旧版变异后程序执行路径上的前驱函数;所述前驱函数存在于所述旧版变异后程序执行路径上,且为所述候选补丁函数的主调函数中执行至所述候选补丁函数的距离最近的;
计算从所述旧版二进制程序的入口函数开始,按照所述旧版变异后程序执行路径执行至所述前驱函数的第一距离;
计算从所述前驱函数执行至所述候选补丁函数的第二距离;
将所述第一距离与所述第二距离的和值,确定为所述旧版变异后程序执行路径与所述候选补丁函数之间的执行距离。
15.根据权利要求13所述的方法,其特征在于,所述根据各候选测试用例对应的旧版变异后程序执行路径与各所述候选补丁函数之间的执行距离,确定对各所述候选测试用例进行第二遍历的顺序,包括:
针对各候选测试用例,将所述旧版变异后程序执行路径与各所述候选补丁函数之间的执行距离进行求和计算,获得各候选测试用例对应的候选距离;
将对应的候选距离从小至大的顺序,确定为对各所述候选测试用例进行第二遍历的顺序。
16.根据权利要求10所述的方法,其特征在于,所述对各初始测试用例进行第一遍历,并在第一遍历的过程中,每遍历到一个初始测试用例,执行一次第一操作之前,还包括:
获取各所述初始测试用例对应的旧版初始程序执行路径;
根据各所述初始测试用例对应的所述旧版初始程序执行路径和各所述候选补丁函数,确定对各所述初始测试用例进行第一遍历的顺序;
所述对各初始测试用例进行第一遍历,包括:
按照对各所述初始测试用例进行第一遍历的顺序对各初始测试用例进行第一遍历。
17.根据权利要求10所述的方法,其特征在于,所述响应于任意所述变异后测试用例在所述旧版二进制程序中运行成功,获得所述旧版二进制程序运行所述变异后测试用例过程中的旧版变异后函数调用序列和旧版变异后程序执行路径之后,还包括:
对于任意在所述旧版二进制程序中运行成功的变异后测试用例,执行以下操作:
确定所述旧版变异后程序执行路径是否触发对所述旧版二进制程序的新代码覆盖;
响应于所述旧版变异后程序执行路径触发对所述旧版二进制程序的新代码覆盖,将所述变异后测试用例作为初始测试用例添加至所述第二预设测试用例池。
18.根据权利要求10所述的方法,其特征在于,所述响应于任意所述变异后测试用例在所述旧版二进制程序中运行成功,获得所述旧版二进制程序运行所述变异后测试用例过程中的旧版变异后函数调用序列和旧版变异后程序执行路径之后,还包括:
对于任意在所述旧版二进制程序中运行成功的变异后测试用例,执行以下操作:
确定所述旧版变异后函数调用序列中是否存在所述旧版当前已恢复函数调用关系中的不存在的旧版新函数调用关系;
响应于所述旧版变异后函数调用序列中存在所述旧版新函数调用关系,将所述变异后测试用例作为初始测试用例添加至所述第二预设测试用例池。
19.根据权利要求18所述的方法,其特征在于,所述确定所述旧版变异后函数调用序列中是否存在所述旧版当前已恢复函数调用关系中的不存在的旧版新函数调用关系之后,还包括:
响应于所述旧版变异后函数调用序列中存在所述旧版新函数调用关系,采用所述旧版新函数调用关系对所述旧版当前已恢复函数调用关系进行补充。
20.根据权利要求10所述的方法,其特征在于,所述响应于任意所述变异后测试用例在所述新版二进制程序中运行成功,获得所述新版二进制程序运行所述变异后测试用例过程中的新版变异后函数调用序列和新版变异后程序执行路径之后,还包括:
对于任意在所述新版二进制程序中运行成功的变异后测试用例,执行以下操作:
确定所述新版变异后程序执行路径是否触发对所述新版二进制程序的新代码覆盖;
响应于所述新版变异后程序执行路径触发对所述新版二进制程序的新代码覆盖,将所述变异后测试用例作为初始测试用例添加至所述第二预设测试用例池。
21.根据权利要求10所述的方法,其特征在于,所述响应于任意所述变异后测试用例在所述新版二进制程序中运行成功,获得所述新版二进制程序运行所述变异后测试用例过程中的新版变异后函数调用序列和新版变异后程序执行路径之后,还包括:
对于任意在所述新版二进制程序中运行成功的变异后测试用例,执行以下操作:
确定所述新版变异后函数调用序列中是否存在所述新版当前已恢复函数调用关系中的不存在的新版新函数调用关系;
响应于所述新版变异后函数调用序列中存在所述新版新函数调用关系,将所述变异后测试用例作为初始测试用例添加至所述第二预设测试用例池。
22.根据权利要求21所述的方法,其特征在于,所述确定所述新版变异后函数调用序列中是否存在所述新版当前已恢复函数调用关系中的不存在的新版新函数调用关系之后,还包括:
响应于所述新版变异后函数调用序列中存在所述新版新函数调用关系,采用所述新版新函数调用关系对所述新版当前已恢复函数调用关系进行补充。
23.根据权利要求19或22所述的方法,其特征在于,所述对各初始测试用例进行第一遍历,并在第一遍历的过程中,每遍历到一个初始测试用例,执行一次第一操作之后,还包括:
重复执行根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对的步骤、所述根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,从多个已匹配的旧版函数中确定至少一个候选补丁函数的步骤,以及所述对各初始测试用例进行第一遍历,并在第一遍历的过程中,每遍历到一个初始测试用例,执行一次第一操作的步骤,直至满足所述模糊测试的结束条件。
24.一种触发软件漏洞的输入数据的复现装置,包括:
第一获取模块,用于获取目标软件在修补漏洞前的旧版二进制程序包括的多个旧版函数和旧版静态函数调用关系,并获取目标软件在修补漏洞后的新版二进制程序包括的多个新版函数和新版静态函数调用关系;
第二获取模块,用于获取所述旧版二进制程序在运行第一测试用例的过程中的旧版真实函数调用序列,并获取所述新版二进制程序在运行第一测试用例的过程中的新版真实函数调用序列;所述第一测试用例属于第一预设测试用例池;
第一确定模块,用于根据所述旧版静态函数调用关系和所述旧版真实函数调用系列,确定旧版当前已恢复函数调用关系,并根据所述新版静态函数调用关系和所述新版真实函数调用序列,确定新版当前已恢复函数调用关系;
匹配模块,用于根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,将多个旧版函数与多个新版函数进行匹配,获得多个匹配函数对;匹配函数对包括相互匹配的旧版函数和新版函数;
第二确定模块,用于根据所述旧版当前已恢复函数调用关系和所述新版当前已恢复函数调用关系,从多个已匹配的旧版函数中确定至少一个候选补丁函数;
第三确定模块,用于根据各候选补丁函数和第二预设测试用例池,对所述旧版二进制程序和所述新版二进制程序进行模糊测试,确定能够触发旧版二进制程序的漏洞的目标输入数据。
25.一种电子设备,其特征在于,包括:处理器,以及与所述处理器通信连接的存储器;
所述存储器存储计算机执行指令;
所述处理器执行所述存储器存储的计算机执行指令,以实现如权利要求1-23中任一项所述的方法。
26.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现如权利要求1-23中任一项所述的方法。
CN202310781248.5A 2023-06-28 2023-06-28 触发软件漏洞的输入数据的复现方法、装置、设备及介质 Active CN117033171B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310781248.5A CN117033171B (zh) 2023-06-28 2023-06-28 触发软件漏洞的输入数据的复现方法、装置、设备及介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310781248.5A CN117033171B (zh) 2023-06-28 2023-06-28 触发软件漏洞的输入数据的复现方法、装置、设备及介质

Publications (2)

Publication Number Publication Date
CN117033171A CN117033171A (zh) 2023-11-10
CN117033171B true CN117033171B (zh) 2024-03-26

Family

ID=88628711

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310781248.5A Active CN117033171B (zh) 2023-06-28 2023-06-28 触发软件漏洞的输入数据的复现方法、装置、设备及介质

Country Status (1)

Country Link
CN (1) CN117033171B (zh)

Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108268371A (zh) * 2016-12-30 2018-07-10 南京理工大学 面向Android应用的智能模糊测试方法
CN110083368A (zh) * 2019-04-19 2019-08-02 苏州浪潮智能科技有限公司 一种全自动选择并安装Linux系统的方法与装置
CN112800423A (zh) * 2021-01-26 2021-05-14 北京航空航天大学 一种二进制代码授权漏洞检测方法
WO2021248310A1 (zh) * 2020-06-09 2021-12-16 深圳市欢太科技有限公司 服务调用信息的获取方法、装置和服务的漏洞测试方法
CN114328173A (zh) * 2021-10-27 2022-04-12 清华大学 软件模糊测试方法和装置、电子设备及存储介质
CN115129591A (zh) * 2022-06-28 2022-09-30 山东大学 面向二进制代码的复现漏洞检测方法及系统
CN115455435A (zh) * 2022-10-12 2022-12-09 中山大学 一种智能合约模糊测试方法、装置、存储介质及电子设备
US11620129B1 (en) * 2022-05-20 2023-04-04 Cyberark Software Ltd. Agent-based detection of fuzzing activity associated with a target program
JP7290784B1 (ja) * 2022-04-18 2023-06-13 中国長江三峡集団有限公司 コード類似性に基づくファジーテスト方法、装置及び記憶媒体

Patent Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108268371A (zh) * 2016-12-30 2018-07-10 南京理工大学 面向Android应用的智能模糊测试方法
CN110083368A (zh) * 2019-04-19 2019-08-02 苏州浪潮智能科技有限公司 一种全自动选择并安装Linux系统的方法与装置
WO2021248310A1 (zh) * 2020-06-09 2021-12-16 深圳市欢太科技有限公司 服务调用信息的获取方法、装置和服务的漏洞测试方法
CN112800423A (zh) * 2021-01-26 2021-05-14 北京航空航天大学 一种二进制代码授权漏洞检测方法
CN114328173A (zh) * 2021-10-27 2022-04-12 清华大学 软件模糊测试方法和装置、电子设备及存储介质
JP7290784B1 (ja) * 2022-04-18 2023-06-13 中国長江三峡集団有限公司 コード類似性に基づくファジーテスト方法、装置及び記憶媒体
US11620129B1 (en) * 2022-05-20 2023-04-04 Cyberark Software Ltd. Agent-based detection of fuzzing activity associated with a target program
CN115129591A (zh) * 2022-06-28 2022-09-30 山东大学 面向二进制代码的复现漏洞检测方法及系统
CN115455435A (zh) * 2022-10-12 2022-12-09 中山大学 一种智能合约模糊测试方法、装置、存储介质及电子设备

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
基于系统调用依赖的Linux内核模糊测试技术研究;杨鑫等;《网络安全技术与应用》;20191110(第11期);13-16 *
模糊测试技术研究综述;牛胜杰;《计算机工程与科学》;第44卷(第12期);2173-2186 *
针对WebAssembly虚拟机的模糊测试方案;林敏等;《网络安全技术与应用》(第06期);15-18 *

Also Published As

Publication number Publication date
CN117033171A (zh) 2023-11-10

Similar Documents

Publication Publication Date Title
CN107273751B (zh) 基于多模式匹配的安全漏洞在线发现方法
Yoo et al. Fault localization prioritization: Comparing information-theoretic and coverage-based approaches
US10282276B2 (en) Fingerprint-initiated trace extraction
Yao et al. Statsym: vulnerable path discovery through statistics-guided symbolic execution
Shi et al. Evaluating test-suite reduction in real software evolution
Ahmadi et al. Finding bugs using your own code: detecting functionally-similar yet inconsistent code
KR101972825B1 (ko) 하이브리드 분석 기술을 이용한 임베디드 기기 취약점 자동 분석 방법, 장치 및 그 방법을 실행하는 컴퓨터 프로그램
CN112749389B (zh) 一种检测智能合约破坏敏感数据漏洞的检测方法及装置
Murtaza et al. A trace abstraction approach for host-based anomaly detection
Zhang et al. Statically discovering high-order taint style vulnerabilities in os kernels
Hua et al. On the effectiveness of deep vulnerability detectors to simple stupid bug detection
CN117033171B (zh) 触发软件漏洞的输入数据的复现方法、装置、设备及介质
US11003772B2 (en) System and method for adapting patterns of malicious program behavior from groups of computer systems
CN117633808A (zh) 用于漏洞检测的方法、处理器及机器可读存储介质
US20230141948A1 (en) Analysis and Testing of Embedded Code
Chen et al. A replication and reproduction of code clone detection studies
Jahangirova et al. An empirical study on failed error propagation in Java programs with real faults
Bahaa et al. A systematic literature review on software vulnerability detection using machine learning approaches
Harzevili et al. Automatic Static Vulnerability Detection for Machine Learning Libraries: Are We There Yet?
Yuan et al. A method for detecting buffer overflow vulnerabilities
CN114154152A (zh) 基于补丁比对和污点分析的漏洞检测方法、设备及介质
CN113553593A (zh) 基于语义分析的物联网固件内核漏洞挖掘方法及系统
CN111967013A (zh) 一种基于补丁摘要比对的c/c++补丁存在性检测方法
Bagehorn et al. A fault injection platform for learning AIOps models
Wen et al. Vuleval: Towards repository-level evaluation of software vulnerability detection

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant