软件栈缓冲区溢出的容错方法

文档序号:6440003阅读:232来源:国知局
专利名称:软件栈缓冲区溢出的容错方法
技术领域
本发明属于计算机安全领域,具体涉及一种软件栈缓冲区溢出的容错方法。
背景技术
当前对栈缓冲区溢出问题,存在一些解决方案来防止利用栈缓冲区溢出执行来未经授权的代码,主要分为静态检测和动态保护两类方法。静态检测方法主要有基于源代码的静态检测和基于目标代码的检测。ITS、Splint和MOPS是静态分析方法的3种代表性工具。这一类方法能识别出与漏洞库函数相关的部分缓冲区溢出、格式化串溢出和文件系统中的竞争条件漏洞。动态保护是指在程序运行过程中进行动态的防范,阻止攻击者在栈缓冲区溢出后将函数返回地址修改成恶意代码并加以运行。StackGuard、MackShield、和随机地址空间分配是这一类方法的代表。MackGuard通过修改编译器,在函数返回地址前面添加一个检测标记值。当函数返回时,如果发现检测标记值发生变化,则推断堆栈正被人试图攻击,程序进程将会中断。StackSiield通过修改编译器,创建一个特别的表来储存函数的返回地址的一份拷贝。它在受保护的函数的开头和结尾分别添加一段代码,开头处的代码被用来将函数返回地址拷贝到这个特殊的表中,而结尾的代码被用来将返回地址从表中拷贝回堆栈。随机地址空间分配方法是通过修改操作系统内核,在程序装载时,对栈段、共享库段映射等线性区的基址进行随机化,防止攻击者定位攻击代码位置,达到阻止溢出攻击的目的。然而,上述方法在解决栈缓冲区溢出时还有较大不足。静态检测方法有高误报率和高漏报率的问题。而动态保护方案只能防止利用栈缓冲区溢出来执行未经授权的代码, 只保证安全性,而不能对栈缓冲区溢出进行容错,不能保证程序执行的正确性及可靠性。另外在实现上,上述方法要求的条件强,需要得到程序的源代码,并用修改过的编译器对程序的源代码进行重新编译。

发明内容
本发明的目的在于提供一种软件栈缓冲区溢出的容错方法,其在软件运行时,利用动态插桩技术将栈缓冲区映射为堆缓冲区,实现对栈缓冲区溢出进行容错,同时使得发生栈缓冲区溢出错误的软件能够正确的继续运行下去,且不需要得到程序源代码,也不需要修改编译器。本发明是通过以下技术方案实现的一种软件栈缓冲区溢出的容错方法,包括如下步骤获取容错保护的目标程序,对目标程序的二进制可执行文件进行解析,以识别出目标程序中的函数和函数中栈缓冲区的信息,将动态插桩工具附加到目标程序的所有线程之上,用动态插桩工具拦截目标程序的函数调用和函数返回,判断拦截结果是否为目标程序的函数调用,若拦截结果是目标程序的函数调用,则用动态插桩工具拦截对栈缓冲区的初始化操作,在目标程序的堆空间中分配堆缓冲区,使其与栈缓冲区映射,将栈缓冲区与堆缓冲区的映射关系保存到映射表中,映射关系包括栈缓冲区的信息和堆缓冲区的信息,用动态插桩工具拦截所有内存访问操作, 以获得内存访问操作的虚拟有效地址,将虚拟有效地址与映射表中栈缓冲区的信息进行比较,以判断虚拟有效地址是否处于被映射到堆缓冲区的栈缓冲区中,若虚拟有效地址处于被映射到堆缓冲区的栈缓冲区中,则通过动态插装工具将虚拟有效地址重定向到堆缓冲区中,并返回用动态插桩工具拦截所有内存访问操作,以获得内存访问操作的虚拟有效地址的步骤。本发明还包括步骤若拦截结果是目标程序的函数调用,则在函数返回前,对函数映射的堆缓冲区进行回收,判断函数返回是否为目标程序的主函数返回,若函数返回为目标程序的主函数返回,则流程结束,否则返回用动态插桩工具拦截目标程序的函数调用和函数返回的步骤。本发明还包括步骤若虚拟有效地址不处于被映射到堆缓冲区的栈缓冲区中,则不修改虚拟有效地址,然后返回用动态插桩工具拦截目标程序的函数调用和函数返回的步
马聚ο分配堆缓冲区时,以堆缓冲区为粒度进行随机化排布。堆缓冲区的大小为栈缓冲区的大小的Q倍,Q为大于1的正整数。本发明具有以下优点(1)本发明能够对栈缓冲区溢出提供容错保护。不仅能够在栈缓冲区溢出发生时保护函数返回地址不被修改,还使得溢出不会造成栈缓冲区之间互相覆盖,既保证了安全性又能保证程序行为的正确性。(2)本方法只要求得到程序的二进制可执行文件,不需要对程序的源代码进行重新编译。(3)本方法能够动态的附加到程序的线程上,对其提供栈缓冲区溢出的容错保护, 不需要时可以动态的撤销保护,灵活性较高。


图1是本发明软件栈缓冲区溢出的容错方法的流程图。
具体实施例方式下面结合附图和具体实施方式
对本发明做进一步说明。如图1所示,本发明方法包括以下几个步骤(1)获取容错保护的目标程序;(2)对容错保护的目标程序二进制可执行文件进行目标代码解析或调试信息解析,识别出目标程序中的函数的集合F和函数中栈缓冲区的信息的集合I。F= {fi;f2,..., fn},其中η为目标程序所包含函数的个数,A代表一个函数。定义A中所包含的缓冲区的信息集合为Bi = Ib1, b2, ..., bj,bj代表一个栈缓冲区的信息。bj是一个二元组Ibj. ο, bj. 1},bj. ο是栈缓冲区的起始偏移地址,bj. 1是栈缓冲区的长度,栈缓冲区的信息的集合
权利要求
1.一种软件栈缓冲区溢出的容错方法,包括如下步骤 获取容错保护的目标程序;对所述目标程序的二进制可执行文件进行解析,以识别出所述目标程序中的函数和所述函数中栈缓冲区的信息;将动态插桩工具附加到所述目标程序的所有线程之上; 用所述动态插桩工具拦截所述目标程序的函数调用和函数返回; 判断所述拦截结果是否为所述目标程序的函数调用;若所述拦截结果是所述目标程序的函数调用,则用所述动态插桩工具拦截对所述栈缓冲区的初始化操作,在所述目标程序的堆空间中分配堆缓冲区,使其与所述栈缓冲区映射;将所述栈缓冲区与所述堆缓冲区的映射关系保存到映射表中,所述映射关系包括所述栈缓冲区的信息和所述堆缓冲区的信息;用所述动态插桩工具拦截所有内存访问操作,以获得所述内存访问操作的虚拟有效地址;将所述虚拟有效地址与所述映射表中所述栈缓冲区的信息进行比较,以判断所述虚拟有效地址是否处于被映射到所述堆缓冲区的栈缓冲区中;若所述虚拟有效地址处于被映射到所述堆缓冲区的栈缓冲区中,则通过所述动态插装工具将所述虚拟有效地址重定向到所述堆缓冲区中,并返回所述用所述动态插桩工具拦截所有内存访问操作,以获得所述内存访问操作的虚拟有效地址的步骤。
2.根据权利要求1所述的容错方法,其特征在于,还包括步骤若所述拦截结果是所述目标程序的函数调用,则在所述函数返回前,对所述函数映射的堆缓冲区进行回收;判断所述函数返回是否为所述目标程序的主函数返回;若所述函数返回为所述目标程序的主函数返回,则流程结束,否则返回所述用所述动态插桩工具拦截所述目标程序的函数调用和函数返回的步骤。
3.根据权利要求1所述的容错方法,其特征在于,还包括步骤若所述虚拟有效地址不处于被映射到所述堆缓冲区的栈缓冲区中,则不修改所述虚拟有效地址,然后返回所述用所述动态插桩工具拦截所述目标程序的函数调用和函数返回的步骤。
4.根据权利要求1所述的容错方法,其特征在于,分配所述堆缓冲区时,以所述堆缓冲区为粒度进行随机化排布。
5.根据权利要求1所述的容错方法,其特征在于,所述堆缓冲区的大小为所述栈缓冲区的大小的Q倍,Q为大于1的正整数。
全文摘要
本发明提供了一种软件栈缓冲区溢出的容错方法,包括以下步骤获取容错保护的目标程序,对目标程序的二进制可执行文件进行解析,以识别出目标程序中的函数和函数中栈缓冲区的信息,将动态插桩工具附加到目标程序的所有线程之上,用动态插桩工具拦截目标程序的函数调用和函数返回,判断拦截结果是否为目标程序的函数调用,若是,则用动态插桩工具拦截对栈缓冲区的初始化操作,在目标程序的堆空间中分配堆缓冲区,使其与栈缓冲区映射,将栈缓冲区与堆缓冲区的映射关系保存到映射表中,映射关系包括栈缓冲区的信息和堆缓冲区的信息,用动态插桩工具拦截所有内存访问操作,以获得内存访问操作的虚拟有效地址,本发明实现了对栈缓冲区溢出进行容错。
文档编号G06F9/45GK102521079SQ20111039647
公开日2012年6月27日 申请日期2011年12月2日 优先权日2011年12月2日
发明者羌卫中, 邹德清, 郑伟德, 金海 , 陈刚 申请人:华中科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1