堆/栈溢出错误的可利用性分析方法及装置与流程

文档序号:21407885发布日期:2020-07-07 14:42阅读:236来源:国知局
堆/栈溢出错误的可利用性分析方法及装置与流程

本发明涉及网络安全技术领域,特别是涉及一种堆/栈溢出错误的可利用性分析方法及装置。



背景技术:

堆/栈溢出是指不顾堆/栈中分配的数据块大小,向该数据块写入了过多的数据,而导致数据越界,结果覆盖了别的数据。可以理解为在长字符串中嵌入一段代码,并将过程的返回地址覆盖为这段代码的地址,这样当过程返回时,程序就转而开始执行这段自编的代码。由此可知,堆/栈溢出错误是影响程序稳定运行的重要威胁之一,堆/栈溢出错误往往会导致程序发生异常崩溃,并且严重的堆/栈溢出错误能够给敌方攻击者提供一种有效的我方系统渗透途径。然而,目前都是在程序发生问题后,才能得知他人通过触发堆/栈溢出的方式来利用溢出数据达到想要的目的,而无法及时有效地分析出堆/栈溢出错误是否有被利用的可能性。



技术实现要素:

有鉴于此,本发明提供的一种堆/栈溢出错误的可利用性分析方法及装置,其目的在于解决现有技术无法及时有效地分析出堆/栈溢出错误的可利用性问题。

本发明的目的是采用以下技术方案来实现的:

第一方面,本发明提供了一种堆/栈溢出错误的可利用性分析方法,所述方法包括:

在监控平台上运行目标程序的过程中,监控并记录堆/栈内存信息;

当监控到待写入堆/栈的写入指令时,根据所述写入指令要访问的目标地址与当前的堆/栈内存信息,判断所述目标程序是否存在堆/栈溢出错误;

若存在堆/栈溢出错误,则将所述待溢出数据作为污点源进行污点传播,并判断是否存在用于判断程序可利用性的指令被执行;

若存在用于判断程序可利用性的指令被执行,则确定所述待溢出数据所对应的堆/栈溢出错误可利用。

可选的,当确定存在堆/栈溢出错误时,所述方法还包括:

将待溢出数据进行保存;

在所述待溢出数据溢出后,将被溢出数据进行恢复操作。

可选的,监控并记录堆内存信息包括:

通过将可触发堆溢出错误发生的输入数据输入到所述目标程序中,来监控并记录堆内存分配信息和堆内存释放信息。

可选的,所述输入数据是通过模糊测试技术得到的。

可选的,监控并记录栈内存信息包括:

通过监控栈内存管理指令来监控并记录栈内存分配信息和栈内存释放信息。

第二方面,本发明提供了一种堆/栈溢出错误的可利用性分析装置,所述装置包括:

监控记录单元,用于在监控平台上运行目标程序的过程中,监控并记录堆/栈内存信息;

第一判断单元,用于当监控到待写入堆/栈的写入指令时,根据所述写入指令要访问的目标地址与当前的堆/栈内存信息,判断所述目标程序是否存在堆/栈溢出错误;

传播单元,用于当存在堆/栈溢出错误时,将所述待溢出数据作为污点源进行污点传播;

第二判断单元,用于判断是否存在用于判断程序可利用性的指令被执行;

确定单元,用于当存在用于判断程序可利用性的指令被执行时,确定所述待溢出数据所对应的堆/栈溢出错误可利用。

可选的,所述装置还包括:

保存单元,用于当确定存在堆/栈溢出错误时,将待溢出数据进行保存;

恢复单元,用于在所述待溢出数据溢出后,将被溢出数据进行恢复操作。

可选的,所述监控记录单元,用于通过将可触发堆溢出错误发生的输入数据输入到所述目标程序中,来监控并记录堆内存分配信息和堆内存释放信息。

可选的,所述监控记录单元21所使用的所述输入数据是通过模糊测试技术得到的。

可选的,所述监控记录单元,用于通过监控栈内存管理指令来监控并记录栈内存分配信息和栈内存释放信息。

第三方面,本发明提供了一种存储介质,所述存储介质存储有多条指令,所述指令适用于由处理器加载并执行如第一方面所述的堆/栈溢出错误的可利用性分析方法。

第四方面,本发明提供了一种电子设备,所述电子设备包括存储介质和处理器;

所述处理器,适于实现各指令;

所述存储介质,适于存储多条指令;

所述指令适于由所述处理器加载并执行如第一方面所述的堆/栈溢出错误的可利用性分析方法。

借由上述技术方案,本发明提供的堆/栈溢出错误的可利用性分析方法及装置,与现有技术中无法及时有效分析出堆栈溢出错误的可利用性相比,能够监控并记录堆/栈内存信息,并当监控到待写入堆/栈的写入指令时,根据该写入指令要访问的目标地址与当前的堆/栈内存信息,及时判断目标程序是否存在堆/栈溢出错误,若确定存在堆/栈溢出错误,则及时将确定的待溢出数据作为污点源进行污点传播,并通过判断是否存在用于判断程序可利用性的指令被执行来确定该待溢出数据所对应的堆/栈溢出错误的可利用性。

上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。

附图说明

通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:

图1示出了本发明实施例提供的一种堆/栈溢出错误的可利用性分析方法的流程图;

图2示出了本发明实施例提供的一种堆/栈溢出错误的可利用性分析装置的组成框图;

图3示出了本发明实施例提供的另一种堆/栈溢出错误的可利用性分析装置的组成框图。

具体实施方式

下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。

本发明实施例提供了一种堆/栈溢出错误的可利用性分析方法,如图1所示,所述方法主要包括:

101、在监控平台上运行目标程序的过程中,监控并记录堆/栈内存信息。

其中,本发明实施例所使用的监控平台可以是系统级仿真监控平台。为了确定目标程序是否存在堆/栈溢出错误,以及时对错误进行可利用性分析,可以将目标程序部署到监控平台上运行,然后实时对目标程序对堆/栈的操作行为进行记录。

102、当监控到待写入堆/栈的写入指令时,根据所述写入指令要访问的目标地址与当前的堆/栈内存信息,判断所述目标程序是否存在堆/栈溢出错误。

监控平台一般是指指令插装系统,插装是在指令运行前实施的,因此可以得到将要执行指令的内容,包括指令类型、操作数以及要操作对应的内存位置。

当监控到目标程序将要执行的指令时,可以通过指令中包括的指令类型判断该指令是否是写入堆/栈的写入指令;若是写入堆/栈的写入指令,则再获取写入指令将要写入的目标地址,并判断该目标地址是否与堆/栈的基地址相关,若相关,则继续根据基地址和内存大小,判断目标地址是否超出堆/栈所包含的内存地址范围,若超出,则确定存在溢出错误。

103、若存在堆/栈溢出错误,则将所述待溢出数据作为污点源进行污点传播,并判断是否存在用于判断程序可利用性的指令被执行。

在实际应用中,当确定存在堆/栈溢出错误时,可以立刻将待溢出数据作为污点源进行传播,也可以待发生溢出错误后,才进行污点传播。

其中,用于判断程序可利用性的指令包括函数调用(call)或者函数反汇(ret)等。如果通过污点分析跟踪到待溢出数据被用于函数调用(call)或者函数反汇(ret)等指令中,则说明溢出破坏的数据可以被用于控制流劫持。在实际应用中,若溢出错误存在可利用性,则污点传播一段时间就可以检测出来,而若溢出错误不存在可利用性,则污点传播多长时间也不会有结果。因此,需要设置一个合理的传播时长(如可以是经验值),当到达传播时长时,若存在用于判断程序可利用性的指令被执行,则确定溢出错误可利用,若不存在用于判断程序可利用性的指令被执行,则确定溢出错误不可利用。

示例性的,污点源可以用taintcrash=(taintcrashaddress,taintsize)来表示,其中,taintcrashaddress表示溢出数据的内存地址,taintsize表示当前指令将要溢出破坏的字节数,其中taintsize根据指令的不同类型可以取值为1、2、4、8等。

104、若存在用于判断程序可利用性的指令被执行,则确定所述待溢出数据所对应的堆/栈溢出错误可利用。

若不存在用于判断程序可利用性的指令被执行,则确定所述待溢出数据所对应的堆/栈溢出错误不可利用。

本发明实施例提供的堆/栈溢出错误的可利用性分析方法,与现有技术中无法及时有效分析出堆栈溢出错误的可利用性相比,能够监控并记录堆/栈内存信息,并当监控到待写入堆/栈的写入指令时,根据该写入指令要访问的目标地址与当前的堆/栈内存信息,及时判断目标程序是否存在堆/栈溢出错误,若确定存在堆/栈溢出错误,则及时将确定的待溢出数据作为污点源进行污点传播,并通过判断是否存在用于判断程序可利用性的指令被执行来确定该待溢出数据所对应的堆/栈溢出错误的可利用性。

进一步的,由于如果发生堆/栈溢出错误,就有可能导致程序发生异常崩溃,并且严重的堆/栈溢出错误能够给敌方攻击者提供一种有效的我方系统渗透途径。为了及时解决该技术问题,本发明的另一个实施例提供了一种方法,该方法包括:当确定存在堆/栈溢出错误时,将待溢出数据进行保存;在所述待溢出数据溢出后,将被溢出数据进行恢复操作。也就是说,在提前确定数据会溢出时,就尽快将待溢出数据进行保存,等替换原有数据(即待溢出数据)导致发生溢出时,就立刻进行恢复操作,将替换后的数据恢复为原有数据,从而确保目标程序执行完后没有异常发生。

可选的,在实际应用中,由于堆和栈存在一定差异,所以针对他们的监控方法也存在一定差异。下面分别对监控堆、栈的实现方法进行阐述:

(1)监控并记录堆内存信息的具体实现方式可以为:通过将可触发堆溢出错误发生的输入数据输入到所述目标程序中,来监控并记录堆内存分配信息和堆内存释放信息。

其中,所述输入数据是通过模糊测试技术得到的,即可以先通过模糊测试技术生成生成一个输入数据集合,然后再让目标应用程序运行每一个输入数据,以便触发目标程序潜藏的溢出错误。输入数据可以是跟“堆分配”、“堆释放”等函数有关的数据。堆内存分配信息包括堆内存分配所对应的线程标识、堆内存分配大小和基地址;堆内存释放信息包括堆内存释放所对应的线程标识、堆内存释放大小。内存操作数可以由[基地址+变址*比例因子+偏移]的方式表示,其中变址、比例因子、偏移可以根据实际指令中是否涉及到进行取舍,但堆/栈内存访问过程中基地址不可省略。

示例性的,本发明实施例可以使用heapinfo=(threadid、heapbase、heapsize)来描述相关的内存分配。其中,threadid用于表示线程标识;heapbase用于表示本次内存分配的起始地址,也称为内存地址指针,后续将通过跟踪该指针来监控程序对于该内存数据的访问和写入等操作过程;heapsize用于记录该次内存分配的大小。

(2)监控并记录栈内存信息的具体实现方式可以为:通过监控栈内存管理指令来监控并记录栈内存分配信息和栈内存释放信息。

其中,栈内存管理指令包括subesp,n等。栈内存分配信息包括栈内存分配所对应的线程标识、栈内存分配大小和基地址;栈内存释放信息包括栈内存释放所对应的线程标识、栈内存释放大小。

进一步的,依据上述方法实施例,本发明的另一个实施例还提供了一种堆/栈溢出错误的可利用性分析装置,如图2所示,所述装置包括:

监控记录单元21,用于在监控平台上运行目标程序的过程中,监控并记录堆/栈内存信息;

第一判断单元22,用于当监控到待写入堆/栈的写入指令时,根据所述写入指令要访问的目标地址与当前的堆/栈内存信息,判断所述目标程序是否存在堆/栈溢出错误;

传播单元23,用于当存在堆/栈溢出错误时,将所述待溢出数据作为污点源进行污点传播;

第二判断单元24,用于判断是否存在用于判断程序可利用性的指令被执行;

确定单元25,用于当存在用于判断程序可利用性的指令被执行时,确定所述待溢出数据所对应的堆/栈溢出错误可利用。

可选的,如图3所示,所述装置还包括:

保存单元26,用于当确定存在堆/栈溢出错误时,将待溢出数据进行保存;

恢复单元27,用于在所述待溢出数据溢出后,将被溢出数据进行恢复操作。

可选的,所述监控记录单元21,用于通过将可触发堆溢出错误发生的输入数据输入到所述目标程序中,来监控并记录堆内存分配信息和堆内存释放信息。

可选的,所述监控记录单元21所使用的所述输入数据是通过模糊测试技术得到的。

可选的,所述监控记录单元21,用于通过监控栈内存管理指令来监控并记录栈内存分配信息和栈内存释放信息。

本发明实施例提供的堆/栈溢出错误的可利用性分析装置,与现有技术中无法及时有效分析出堆栈溢出错误的可利用性相比,能够监控并记录堆/栈内存信息,并当监控到待写入堆/栈的写入指令时,根据该写入指令要访问的目标地址与当前的堆/栈内存信息,及时判断目标程序是否存在堆/栈溢出错误,若确定存在堆/栈溢出错误,则及时将确定的待溢出数据作为污点源进行污点传播,并通过判断是否存在用于判断程序可利用性的指令被执行来确定该待溢出数据所对应的堆/栈溢出错误的可利用性。

进一步的,依据上述方法实施例,本发明的另一个实施例还提供了一种存储介质,所述存储介质存储有多条指令,所述指令适用于由处理器加载并执行如上所述的堆/栈溢出错误的可利用性分析方法。

存储介质可能包括计算机可读介质中的非永久性存储介质,随机存取存储介质(ram)和/或非易失性内存等形式,如只读存储介质(rom)或闪存(flashram),存储介质包括至少一个存储芯片。

本发明实施例提供的存储介质中存储的指令,与现有技术中无法及时有效分析出堆栈溢出错误的可利用性相比,能够监控并记录堆/栈内存信息,并当监控到待写入堆/栈的写入指令时,根据该写入指令要访问的目标地址与当前的堆/栈内存信息,及时判断目标程序是否存在堆/栈溢出错误,若确定存在堆/栈溢出错误,则及时将确定的待溢出数据作为污点源进行污点传播,并通过判断是否存在用于判断程序可利用性的指令被执行来确定该待溢出数据所对应的堆/栈溢出错误的可利用性。

进一步的,依据上述方法实施例,本发明的另一个实施例还提供了一种电子设备,所述电子设备包括存储介质和处理器;

所述处理器,适于实现各指令;

所述存储介质,适于存储多条指令;

所述指令适于由所述处理器加载并执行如上所述的堆/栈溢出错误的可利用性分析方法。

处理器中包含内核,由内核去存储器中调取相应的程序单元。内核可以设置一个或以上,通过调整内核参数来及时有效地分析堆/栈溢出错误可利用性。

本发明实施例提供的电子设备,与现有技术中无法及时有效分析出堆栈溢出错误的可利用性相比,能够监控并记录堆/栈内存信息,并当监控到待写入堆/栈的写入指令时,根据该写入指令要访问的目标地址与当前的堆/栈内存信息,及时判断目标程序是否存在堆/栈溢出错误,若确定存在堆/栈溢出错误,则及时将确定的待溢出数据作为污点源进行污点传播,并通过判断是否存在用于判断程序可利用性的指令被执行来确定该待溢出数据所对应的堆/栈溢出错误的可利用性。

本申请还提供了一种计算机程序产品,当在监控平台上执行时,适于执行初始化有如下方法步骤的程序代码:

在监控平台上运行目标程序的过程中,监控并记录堆/栈内存信息;

当监控到待写入堆/栈的写入指令时,根据所述写入指令要访问的目标地址与当前的堆/栈内存信息,判断所述目标程序是否存在堆/栈溢出错误;

若存在堆/栈溢出错误,则将所述待溢出数据作为污点源进行污点传播,并判断是否存在用于判断程序可利用性的指令被执行;

若存在用于判断程序可利用性的指令被执行,则确定所述待溢出数据所对应的堆/栈溢出错误可利用。

本发明实施例还公开了:

a1、一种堆/栈溢出错误的可利用性分析方法,所述方法包括:

在监控平台上运行目标程序的过程中,监控并记录堆/栈内存信息;

当监控到待写入堆/栈的写入指令时,根据所述写入指令要访问的目标地址与当前的堆/栈内存信息,判断所述目标程序是否存在堆/栈溢出错误;

若存在堆/栈溢出错误,则将所述待溢出数据作为污点源进行污点传播,并判断是否存在用于判断程序可利用性的指令被执行;

若存在用于判断程序可利用性的指令被执行,则确定所述待溢出数据所对应的堆/栈溢出错误可利用。

a2、根据a1所述的方法,当确定存在堆/栈溢出错误时,所述方法还包括:

将待溢出数据进行保存;

在所述待溢出数据溢出后,将被溢出数据进行恢复操作。

a3、根据a1或a2所述的方法,监控并记录堆内存信息包括:

通过将可触发堆溢出错误发生的输入数据输入到所述目标程序中,来监控并记录堆内存分配信息和堆内存释放信息。

a4、根据a3所述的方法,所述输入数据是通过模糊测试技术得到的。

a5、根据a1或a2所述的方法,监控并记录栈内存信息包括:

通过监控栈内存管理指令来监控并记录栈内存分配信息和栈内存释放信息。

b6、一种堆/栈溢出错误的可利用性分析装置,所述装置包括:

监控记录单元,用于在监控平台上运行目标程序的过程中,监控并记录堆/栈内存信息;

第一判断单元,用于当监控到待写入堆/栈的写入指令时,根据所述写入指令要访问的目标地址与当前的堆/栈内存信息,判断所述目标程序是否存在堆/栈溢出错误;

传播单元,用于当存在堆/栈溢出错误时,将所述待溢出数据作为污点源进行污点传播;

第二判断单元,用于判断是否存在用于判断程序可利用性的指令被执行;

确定单元,用于当存在用于判断程序可利用性的指令被执行时,确定所述待溢出数据所对应的堆/栈溢出错误可利用。

b7、根据b6所述的装置,所述装置还包括:

保存单元,用于当确定存在堆/栈溢出错误时,将待溢出数据进行保存;

恢复单元,用于在所述待溢出数据溢出后,将被溢出数据进行恢复操作。

b8、根据b6或b7所述的装置,所述监控记录单元,用于通过将可触发堆溢出错误发生的输入数据输入到所述目标程序中,来监控并记录堆内存分配信息和堆内存释放信息。

b9、根据b8所述的装置,所述监控记录单元21所使用的所述输入数据是通过模糊测试技术得到的。

b10、根据b6或b7所述的装置,所述监控记录单元,用于通过监控栈内存管理指令来监控并记录栈内存分配信息和栈内存释放信息。

c11、一种存储介质,所述存储介质存储有多条指令,所述指令适用于由处理器加载并执行如a1-a5中任一项所述的堆/栈溢出错误的可利用性分析方法。

d12、一种电子设备,所述电子设备包括存储介质和处理器;

所述处理器,适于实现各指令;

所述存储介质,适于存储多条指令;

所述指令适于由所述处理器加载并执行如a1-a5中任一项所述的堆/栈溢出错误的可利用性分析方法。

在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

可以理解的是,上述方法及装置中的相关特征可以相互参考。另外,上述实施例中的“第一”、“第二”等是用于区分各实施例,而并不代表各实施例的优劣。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。

在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。

类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求防护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。

本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。

此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求防护的实施例的任意之一都可以以任意的组合方式来使用。

本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(dsp)来实现根据本发明实施例的堆/栈溢出错误的可利用性分析方法及装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。

应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1