基于二进制程序的漏洞挖掘方法及装置制造方法
【专利摘要】本申请公开了基于二进制程序的漏洞挖掘方法及装置,其中,所述方法包括:在目标程序执行过程中,确定需要进行镜像的目标点;暂停所述目标程序的执行,并对所述目标点对应时刻的进程状态进行镜像;镜像创建完成后,恢复所述目标程序的执行,并通过符号执行求解新的污点数据;得到新的污点数据后,先利用镜像过程保存的信息对进程空间进行恢复,再利用求解得到的新的污点数据替换原有污点数据后输入到所述目标程序中,以便从所述目标点开始继续迭代执行。通过本申请,能够减少执行轨迹中重复出现的部分,提高漏洞挖掘的效率。
【专利说明】基于二进制程序的漏洞挖掘方法及装置
【技术领域】
[0001]本申请涉及应用程序漏洞挖掘【技术领域】,特别涉及基于二进制程序的漏洞挖掘方法及装置。
【背景技术】
[0002]随着计算机在国民经济和国防建设各个领域的广泛应用,作为信息系统只能载体的计算机软件的安全性变得尤为重要。软件安全漏洞已经成为信息安全风险的主要根源之一。由于软件安全漏洞的危害性、多样性和广泛性,在当前网络空间的各种博弈行为中,漏洞被各方所积极关注。如何有效的发现漏洞、消除或减少漏洞对社会生活、国家信息安全等的负面影响,即漏洞挖掘和防护工作已经成为信息安全领域的研究重点。
[0003]面向源程序的漏洞挖掘研究历史已经比较悠久,并取得显著进步。然而处于商业利益、知识产权保护等原因,大部分软件厂商不对外提供源程序;有些厂商虽然提供了源程序,但源程序和实际系统之间的对应关系无从验证。另外,源程序级的漏洞分析也无法发现编译、链接过程引入的漏洞。因此,直接面向二进制程序的安全漏洞挖掘研究具有重要的意义。
[0004]针对面向二进制程序的漏洞挖掘,业界主要有静态挖掘和动态挖掘两个大类。然而,面向二进制程序的安全漏洞挖掘面临更多的挑战。一方面,静态挖掘以漏洞模型为指导,运用程序静态分析技术发现程序中安全问题,但是,对于复杂机理的安全漏洞,基于静态程序分析的漏洞挖掘误报率高,往往需要大量人工分析来验证挖掘结果的正确性,这严重制约了静态挖掘技术的应用范围。
[0005]基于动态分析的二进制漏洞挖掘方法,利用程序运行时的信息进行漏洞挖掘,其本质是通过真实遍历程序状态空间,检测程序执行过程中是否会违背特定安全属性。由于利用运行时的信息,因此,得到的分析结果均为真实、有效、可重现的。然而,基于动态分析的二进制漏洞挖掘方法依赖于两大技术问题:污点分析和路径遍历。早期的动态漏洞挖掘方法使用大量随机产生的畸形样本来对目标程序进行模糊测试。模糊测试不仅效率低下,而且效果不明显。其原因有两个,其一就是,这些畸形样本的产生完全依靠的是既有的规贝U,没有对目标程序进行深入的学习分析,导致其中相当大比例的处理流程都一样;其二是,模糊测试仅仅侧重于样本的产生,对于样本中的数据(称为污点数据)在目标程序处理的流程及污点数据之间的关系是不关心的。
[0006]路径遍历是通过符号执行的方法来实现的。程序运行过程就是函数调用的过程,每个函数都是由很多条指令组成的,这些指令中有一些特殊的指令:跳转指令。X86汇编中就是类似JMP、JZ、JNZ等的跳转指令。这些指令在执行过程中由于受外部输入的污点数据的影响会跳转到不同的目的地址继续执行。而多次的跳转就可以形成一条跳转路径,程序中会有很多条这种跳转路径。任意一条的执行路径下都有可能有潜在的安全漏洞,如果应用程序在某条路径上运行时,出现了崩溃、信息泄漏等现象,则该路径下就可能存在安全漏洞。因此,为了最大限度的发掘程序中的安全漏洞,就需要对程序的执行路径进行最大限度的遍历。
[0007]在输入的污点数据已经确定的情况下,程序的执行路径也就已经唯一确定,但是,唯一的一条执行路径确定的情况下,其输入的污点数据却有可能有很多种。符号执行的目的就是,通过一次执行完毕后,使用根据程序的执行路径的符号表达,求解出代表另外一条新的执行路径的污点数据集。
[0008]如上所述,符号执行的目的是求解得出新的污点数据集,然后回到程序的污点数据的引入指令处继续迭代执行,直到没有新的路径产生为止。也就是说,在初始状态下,应用程序根据原始输入数据在某条路径下运行,此时,就可以对程序运行过程中的每个指令进行符号执行,得到一条新的路径,并构造出新的污点数据,接下来就可以将新的污点数据输入到程序中,该程序就会在该新的路径下运行,然后监控该路径下是否存在安全漏洞,同时也进行新一轮的符号执行,求解新的污点数据,直到没有新的路径产生。利用符号执行,能够在复杂的数据依赖关系中发现数据本质的约束关系,而且符号执行精确记录了路径的约束条件,有利于实现对应用程序执行过程中各种可能的路径的遍历。
[0009]但是,这种实现方式仍然至少存在以下问题:每次符号执行的过程中存在相当大的重复操作的情况(例如,每次都需要重新打开某文件等等),漏洞挖掘的效果受到影响。
【发明内容】
[0010]本申请提供了基于二进制程序的漏洞挖掘方法及装置,能够减少执行轨迹中重复出现的部分,提高漏洞挖掘的效率。
[0011]本申请提供了如下方案:
[0012]一种基于二进制程序的漏洞挖掘方法,包括:
[0013]在目标程序执行过程中,确定需要进行镜像的目标点;
[0014]暂停所述目标程序的执行,并对所述目标点对应时刻的进程状态进行镜像;
[0015]镜像创建完成后,恢复所述目标程序的执行,并通过符号执行求解新的污点数据;
[0016]得到新的污点数据后,先利用镜像过程保存的信息对进程空间进行恢复,再利用求解得到的新的污点数据替换原有污点数据后输入到所述目标程序中,以便从所述目标点开始继续迭代执行。
[0017]一种基于二进制程序的漏洞挖掘装置,包括:
[0018]目标点确定单元,用于在目标程序执行过程中,确定需要进行镜像的目标点;
[0019]镜像创建单元,用于暂停所述目标程序的执行,并对所述目标点对应时刻的进程状态进行镜像;
[0020]符号执行单元,用于镜像创建完成后,恢复所述目标程序的执行,并通过符号执行求解新的污点数据;
[0021]进程恢复单元,用于得到新的污点数据后,先利用镜像过程保存的信息对进程空间进行恢复,再利用求解得到的新的污点数据替换原有污点数据后输入到所述目标程序中,以便从所述目标点开始继续迭代执行。
[0022]根据本申请提供的具体实施例,本申请公开了以下技术效果:
[0023]通过本申请实施例,可以在目标程序执行过程中的某个目标点处创建镜像,之后在每次迭代过程获取到新的污点数据之后,并不是直接将新的污点数据输入到目标程序中,而是首先利用镜像过程保存的信息对进程空间进行恢复,也即,相当于直接使得进程达到之前进行镜像的目标点处,而不用重新从入口处开始执行。完成进行空间的恢复之后,再用新的污点数据替换原污点数据,并输入到目标程序中,接下来就可以触发下一次的符号执行迭代,这使得新的符号执行迭代过程可以从该目标点开始,而不是目标程序的入口处,从而可以减少执行轨迹中重复出现的部分,提高漏洞挖掘的效率。
[0024]另外,如果存在需要人工干预的情况,可以将进行镜像的目标点设置在人工干预之后,这样可以使得后续的符号执行过程复用之前的人工干预结果,不需要在每次符号执行时都进行人工干预,提高自动化程度。
[0025]对于类似网络收包之后才进行污点数据引入的情况,可以通过进程状态镜像的方法,在收到特定数据包后,建立镜像,随后符号执行并求得污点数据之后,先将进程恢复到接收到特定数据包之后的状态,然后再将新的污点数据输入到目标程序,这样就可以回到开始收包的指令地址开始处理。
[0026]当然,实施本申请的任一产品并不一定需要同时达到以上所述的所有优点。
【专利附图】
【附图说明】
[0027]为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0028]图1是本申请实施例提供的方法的流程图;
[0029]图2是本申请实施例提供的装置的示意图。
【具体实施方式】
[0030]下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本申请保护的范围。
[0031 ] 为了便于理解本申请实施例,下面首先对几个概念进行简单地介绍。
[0032]基于路径遍历的动态漏洞挖掘实际采用的是污点数据传播分析的思想,主要在于监控所谓的“不可信数据”,也即污点数据的传播轨迹。污点数据通常来源于用户输入,包括命令行参数、图形界面交互数据、文件数据、网络通信数据以及系统环境变量等几种类型。
[0033]污点数据:也称半有效的数据或文件,基于路径的遍历就是以半有效的数据或文件作为应用程序的输入。所谓的半有效的数据或文件是指对于某应用程序来说,数据的大部分数据段或者文件的大部分标识段是有效的,这样程序就会认为这是一个有效的数据或文件,但是数据或文件的其他部分是无效的,它是依据安全漏洞挖掘方案进行构造的,应用程序在处理这种畸形数据或文件的时候,就可能触发某种安全漏洞,常常表现为应用程序发生崩溃或者造成信息的泄漏或者发生延迟等。
[0034]符号执行:采用抽象符号代替程序遍历,根据程序的定义,在每条路径上通过符号计算引擎对抽象符号做等语义操作,模拟程序执行。采用符号执行的好处在于,能够发现变量之间代数运算关系,便于理解程序的内在逻辑,在漏洞挖掘时,有利于在复杂的数据依赖关系中发现数据本质的约束关系,而且符号执行精确记录了路径的约束条件,可以进一步用于判断路径可行性和路径约束的完备性。动态符号执行是从传统符号执行衍生的分析方法,输入具体值并模拟程序的执行,同时从分支语句中搜集符号约束。一次分析结束后,用约束求解器求解上次执行获得的符号约束,得到新的输入值。动态符号执行以具体输入值来驱动下一轮分析。
[0035]也就是说,在基于路径遍历的动态漏洞挖掘方案中,需要多次向目标程序输入污点数据,使得目标程序在各种可能的路径下运行,以便分别判断各条路径上是否存在安全漏洞。其中,对于每次输入的污点数据,可以通过符号执行来进行求解构造。符号执行就是根据程序当前运行过程中执行的指令,获得程序执行过程中的路径约束关系,求解出一条新的路径,进而根据路径约束条件反向求解出新的路径下的污点数据,这样,在将该新求解出的污点数据输入到目标程序时,目标程序就会在该新的路径下执行,进而就可以监测在该新的路径上是否存在安全漏洞。
[0036]本申请的发明人发现,现有技术中在符号执行的迭代过程中,每次迭代都需要从目标程序的程序入口处开始执行。这也就导致每次的执行轨迹中有相当大的部分是重复的。不仅如此,在遇到某些需要人工干预(比如点击按钮等)才能继续往下执行的情况下,每次符号执行都需要人工干预一次,漏洞挖掘的自动化程度比较低。另外,有些情况下需要在类似网络收包后才能进行符号执行的污点数据引入,这样,如果按照该现有技术,由于每次都需要回到程序入口处开始执行,因此即便根据符号执行求得了污点数据,也无法准确返回到开始的处理流程起始点,因为网络发收包是无序的。
[0037]另外,发明人还发现,对于一个目标程序而言,在运行过程中,一般都会存在一个点,在各个不同的路径下,从程序入口开始到这个点,执行的轨迹都是相同的。因此,如果使得符号执行每次都从这个点开始迭代,则可以避免执行轨迹中大量重复部分的出现,提高漏洞挖掘的效率。并且,如果到这个点之前已经进行了人工干预,则可以直接将之前人工干预的结果带入到后续的迭代过程中,从而避免每次符号执行过程都需要进人工干预,提高自动化程度。再者,如果这个点恰好在收到某数据包时,则如果以后的迭代过程需要从收到该数据包时开始,则可以直接将新构造出的污点数据从该点导入到目标程序中。本申请实施例就是基于上述考虑,提供了一种新的漏洞挖掘方法,以便对现有的基于路径遍历的动态漏洞挖掘方法进行改进,下面进行详细地介绍。
[0038]参见图1,本申请实施例提供的基于二进制程序的漏洞挖掘方法具体可以包括以下步骤:
[0039]SlOl:在目标程序执行过程中,确定需要进行镜像的目标点;
[0040]在本申请实施例中,可以在目标程序运行的过程中,在一些关键的目标点上对进程状态进行镜像,这样后续在获取到新的污点数据时,就可以根据镜像的数据恢复进程空间,然后再将新的污点数据输入到目标程序,这样就可以从该目标点开始进行符号执行,而不需要从程序的入口处开始执行。其中,可以通过snapshot的方式进行镜像。所谓snapshot是指以进程某一个运行时刻(CONTEXT)为点,对当前时刻进程的状态,包括内存状态、文件操作、内核对象等进行镜像,并且,后续进程运行不会影响这个镜像,即为进程的一个 snapshot ο
[0041]需要说明的是,由于后续的符号执行都需要从进行镜像的点开始执行,因此,在选择需要进行镜像的点时,可满足以下条件:目标程序在各种不同路径下运行时,从程序入口点到需要进行镜像的目标点的运行轨迹相同。具体实现时,还可以结合目标程序的实际情况,选择需要进行镜像的目标点。例如,可以在目标程序执行过程中,监控是否存在需关注的污点数据类型被引入,如果是,则将污点数据被引入的时刻确定为需要进行镜像的目标点。这样,后续每次获取到新的污点数据之后,就可以都从这个目标点开始进行符号执行,而不需要再重复执行从程序入口到该目标点的过程。其中,具体实现时,可以根据既有的策略文件判断那些污点数据需要被符号执行,判断的依据可以是根据污点数据类型可能引起安全漏洞的可能性确定。在确定策略后,根据执行过程中的指令判断是否符合策略文件的定义,如果符合则认为污点数据已经被引入,然后就可以对进程状态进行镜像。
[0042]另外,如果某目标程序在执行过程中需要人工干预,则可以将进行了人工干预之后的时刻确定为需要进行镜像的目标点。这样,就可以将人工干预的结果记录在镜像文件中,后续每次进行符号执行时,就都可以使用已经得到的人工干预的结果,而不需要重复执行人工干预。
[0043]再者,如果当前进程中,需要在进行类似网络收包之后才进行污点数据引入,则可以在目标程序执行过程中,监控是否收到特定数据包,如果是,则将收到特定数据包的时候确定为需要进行镜像的目标点,以便将新的污点数据从该目标点导入到目标程序中,从而实现以后每次进行符号执行时,都从该目标点也即接收到该特定数据包之后的状态导入到目标程序。
[0044]S102:暂停所述目标程序的执行,并对所述目标点对应时刻的进程状态进行镜像;
[0045]在选定了需要进行镜像的目标点之后,可以首先将目标程序暂停执行,然后对目标点对应时刻的进程状态进行镜像。具体的,可以将当前进程的内存状态镜像到指定文件并进行保存。
[0046]S103:镜像创建完成后,恢复所述目标程序的执行,并通过符号执行求解新的污点数据;
[0047]镜像创建完成之后,就可以恢复目标程序的执行,并进行符号执行,根据污点数据的依赖情况结束本次符号执行,然后使用线性求解器求得新的污点数据,本地迭代过程完成。具体的,可以通过在目标程序执行过程中的指令解析获取程序执行过程中的路径约束条件,然后由求解引擎根据路径约束条件反向求解得到新的路径条件下的污点数据。
[0048]需要说明的是,在实际应用中,为了兼容各个平台以及方便求解,还可以将各种平台的汇编语言(X86、ARM、MIPS等等)统一翻译至通用的中间语言,方便后续进行求解。这样,在进行符号执行时,在得到路径约束条件后,可以用中间语言进行表述,求解引擎可以根据使用中间语言描述的路径约束条件反向求解得到新的路径条件下的污点数据。
[0049]另外需要说明的是,关于符号执行以及求解引擎的具体实现过程,可以参见已有技术中的实现,这里不进行详述。
[0050]S104:得到新的污点数据后,先利用镜像过程保存的信息对进程空间进行恢复,再利用求解得到的新的污点数据替换原有污点数据后输入到所述目标程序中,以便从所述目标点开始继续迭代执行。
[0051]在结束一次迭代过程后,就可以得到新的污点输入数据。此时,在本申请实施例中,并不是直接将新的污点数据输入到目标程序中,而是首先利用镜像过程保存的信息对进程空间进行恢复,也即相当于直接使得进程达到之前进行镜像的目标点处,而不用重新从入口处开始执行。完成进行空间的恢复之后,再用新的污点数据替换原污点数据,并输入到目标程序中,接下来就可以触发下一次的符号执行迭代,这使得新的符号执行迭代过程可以从该目标点开始,而不是目标程序的入口处。这样可以减少执行轨迹中重复出现的部分,提高漏洞挖掘的效率。另外,如果存在需要人工干预的情况,可以将进行镜像的目标点设置在人工干预之后,这样可以使得后续的符号执行过程复用之前的人工干预结果,不需要在每次符号执行时都进行人工干预,提高自动化程度。对于类似网络收包之后才进行污点数据引入的情况,可以通过进程状态镜像的方法,在收到特定数据包后,建立镜像,随后符号执行并求得污点数据之后,先将进程恢复到接收到特定数据包之后的状态,然后再将新的污点数据输入到目标程序,这样就可以回到开始收包的指令地址开始处理。
[0052]需要说明的是,在本申请实施例中,需要在选定的目标点处对进程状态进行镜像,后续在每次迭代结束获得新的污点数据之后,首先根据镜像数据进行进程状态的恢复,然后再进行污点数据的输入,在这个过程中,需要保持之前创建的镜像不被破坏,否则将无法将进程恢复到指定的状态。但是,在实际应用中,在创建了镜像之后,目标程序还需要继续执行,而如果在执行过程中会执行一些可能会破坏镜像的操作,例如,文件操作函数、系统操作函数及其他会改变系统变量的操作,则可能会破坏镜像。为了避免镜像被破坏,在本申请实施例中,可以预先对进程中会使镜像被破坏的操作函数进行钩挂(Η00Κ),镜像完成并程序恢复执行后,可以在HOOK函数中过滤那些对系统、文件有改变的操作,并重定向到某预先指定的地方,按照特定的格式保存。这样,相当于对系统、文件的改变实际上并未生效,只是按照程序执行的操作将改变情况记录在另一个地方。当然,目标程序在执行了修改操作之后,还可能需要读取修改后的值,为了保证目标程序的正常执行,还可以对读取操作对应的函数也进行Η00Κ,这样在监控到目标程序的读取操作时,可以按照读取的偏移等信息判断是否属于重定向的数据范围,如果是,则可以从重定向数据返回读取结果,否则放行。
[0053]与本申请实施例提供的基于二进制程序的漏洞挖掘方法相对应,本申请实施例还提供了一种基于二进制程序的漏洞挖掘装置,参见图2,该装置可以包括:
[0054]目标点确定单元201,用于在目标程序执行过程中,确定需要进行镜像的目标点;
[0055]镜像创建单元202,用于暂停所述目标程序的执行,并对所述目标点对应时刻的进程状态进行镜像;
[0056]符号执行单元203,用于镜像创建完成后,恢复所述目标程序的执行,并通过符号执行求解新的污点数据;
[0057]进程恢复单元204,用于得到新的污点数据后,先利用镜像过程保存的信息对进程空间进行恢复,再利用求解得到的新的污点数据替换原有污点数据后输入到所述目标程序中,以便从所述目标点开始继续迭代执行。
[0058]其中,所述目标程序在各种不同路径下运行时,从程序入口点到所述需要进行镜像的目标点的运行轨迹相同。
[0059]具体在确定需要进行镜像的目标点时,可以根据实际的需求进行设定。其中,在一种实现方式下,目标点确定单元201可以包括:
[0060]第一目标点确定子单元,用于在目标程序执行过程中,监控是否存在需关注的污点数据类型被引入,如果是,则将污点数据被引入的时刻确定为需要进行镜像的目标点。
[0061]或者,如果进程运行过程中需要人工干预,则目标点确定单元201可以包括:
[0062]第二目标点确定子单元,用于在目标程序执行过程中,监控是否需要人工干预,如果是,则将人工干预完成后的时刻确定为需要镜像的目标点,以便将人工干预的结果保存到镜像数据中。
[0063]再者,如果需要在类似网络收包后才能进行污点数据输入,则目标点确定单元201可以包括:
[0064]第三目标点确定子单元,用于在目标程序执行过程中,监控是否收到特定数据包,如果是,则将收到特定数据包的时候确定为需要进行镜像的目标点,以便将新的污点数据从该目标点导入到所述目标程序中。
[0065]具体实现时,镜像创建单元202具体可以用于:
[0066]将当前进程的内存状态镜像到指定文件并进行保存。
[0067]为了避免在目标程序运行过程中镜像被破坏,该装置还可以包括:
[0068]第一函数钩挂单元,用于对进程中会使镜像被破坏的操作函数进行钩挂;
[0069]第一监控单元,用于所述目标程序恢复执行后,根据所钩挂的函数监控是否发生相应的操作;
[0070]重定向单元,用于如果所述第一监控单元的监控结果为是,则将所述操作重定向到指定位置,并按照预置的格式进行保存。
[0071]另外,如果目标程序中还存在对数据进行读取的操作,则为了保证目标程序的正常运行,该装置还可以包括:
[0072]第二函数钩挂单元,用于对进程中执行读取操作的函数进行钩挂;
[0073]第二监控单元,用于监控到所述目标程序执行读取操作时,按照读取的偏移信息判断是否属于重定向的数据范围;
[0074]数据返回单元,用于如果第二监控单元的监控结果为是,则根据重定向的数据返回读取结果。
[0075]另外,为了兼容各个平台以及方便求解,该装置还可以包括:
[0076]指令翻译单元,用于将各种平台的汇编语言翻译至通用的中间语言,以便将符号执行得到的路径约束条件用所述中间语言进行描述。
[0077]总之,通过本申请实施例提供的上述装置,可以在目标程序执行过程中的某个目标点处创建镜像,之后在每次迭代过程获取到新的污点数据之后,并不是直接将新的污点数据输入到目标程序中,而是首先利用镜像过程保存的信息对进程空间进行恢复,也即相当于直接使得进程达到之前进行镜像的目标点处,而不用重新从入口处开始执行。完成进行空间的恢复之后,再用新的污点数据替换原污点数据,并输入到目标程序中,接下来就可以触发下一次的符号执行迭代,这样使得新的符号执行迭代过程可以从该目标点开始,而不是目标程序的入口处,从而可以减少执行轨迹中重复出现的部分,提高漏洞挖掘的效率。
[0078]通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
[0079]本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的系统及系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
[0080]以上对本申请所提供的基于二进制程序的漏洞挖掘方法及装置,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在【具体实施方式】及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本申请的限制。
【权利要求】
1.一种基于二进制程序的漏洞挖掘方法,其特征在于,包括: 在目标程序执行过程中,确定需要进行镜像的目标点; 暂停所述目标程序的执行,并对所述目标点对应时刻的进程状态进行镜像; 镜像创建完成后,恢复所述目标程序的执行,并通过符号执行求解新的污点数据; 得到新的污点数据后,先利用镜像过程保存的信息对进程空间进行恢复,再利用求解得到的新的污点数据替换原有污点数据后输入到所述目标程序中,以便从所述目标点开始继续迭代执行。
2.根据权利要求1所述的方法,其特征在于,所述目标程序在各种不同路径下运行时,从程序入口点到所述需要进行镜像的目标点的运行轨迹相同。
3.根据权利要求1所述的方法,其特征在于,所述在目标程序执行过程中,确定需要进行镜像的目标点,包括: 在目标程序执行过程中,监控是否存在需关注的污点数据类型被引入,如果是,则将污点数据被弓I入的时刻确定为需要进行镜像的目标点。
4.根据权利要求1所述的方法,其特征在于,所述在目标程序执行过程中,确定需要进行镜像的目标点,包括: 在目标程序执行过程中,监控是否需要人工干预,如果是,则将人工干预完成后的时刻确定为需要镜像的目标点,以便将人工干预的结果保存到镜像数据中。
5.根据权利要求1所述的方法,其特征在于,所述在目标程序执行过程中,确定需要进行镜像的目标点,包括: 在目标程序执行过程中,监控是否收到特定数据包,如果是,则将收到特定数据包的时候确定为需要进行镜像的目标点,以便将新的污点数据从该目标点导入到所述目标程序中。
6.根据权利要求1至5任一项所述的方法,其特征在于,所述对所述目标点对应时刻的进程状态进行镜像包括: 将当前进程的内存状态镜像到指定文件并进行保存。
7.根据权利要求1至5任一项所述的方法,其特征在于,还包括: 对进程中会使镜像被破坏的操作函数进行钩挂; 所述目标程序恢复执行后,根据所钩挂的函数监控是否发生相应的操作; 如果是,则将所述操作重定向到指定位置,并按照预置的格式进行保存。
8.根据权利要求7所述的方法,其特征在于,还包括: 对进程中执行读取操作的函数进行钩挂; 监控到所述目标程序执行读取操作时,按照读取的偏移信息判断是否属于重定向的数据范围; 如果是,则根据重定向的数据返回读取结果。
9.根据权利要求1至5任一项所述的方法,其特征在于,还包括: 将各种平台的汇编语言翻译至通用的中间语言,以便将符号执行得到的路径约束条件用所述中间语言进行描述。
10.一种基于二进制程序的漏洞挖掘装置,其特征在于,包括: 目标点确定单元,用于在目标程序执行过程中,确定需要进行镜像的目标点; 镜像创建单元,用于暂停所述目标程序的执行,并对所述目标点对应时刻的进程状态进行镜像; 符号执行单元,用于镜像创建完成后,恢复所述目标程序的执行,并通过符号执行求解新的污点数据; 进程恢复单元,用于得到新的污点数据后,先利用镜像过程保存的信息对进程空间进行恢复,再利用求解得到的新的污点数据替换原有污点数据后输入到所述目标程序中,以便从所述目标点开始继续迭代执行。
【文档编号】G06F21/12GK104346542SQ201310314639
【公开日】2015年2月11日 申请日期:2013年7月24日 优先权日:2013年7月24日
【发明者】樊兴华 申请人:阿里巴巴集团控股有限公司