一种栈溢出位置的检测方法

文档序号:9396798阅读:597来源:国知局
一种栈溢出位置的检测方法
【技术领域】
[0001] 本发明属于软件分析技术领域,是一种用于软件分析的栈溢出自动化检测方法, 不需要被测软件的源码便可处理商用软件,能够检测所有函数类型。
【背景技术】
[0002] 栈溢出就是缓冲区溢出的一种。程序在运行过程中,为了临时存取数据的需要,一 般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长 度的数据,以致于缓冲区无法容纳,造成缓冲区的溢出,造成程序崩溃或使程序转而执行其 它指令。
[0003] 缓冲区溢出漏洞存在普遍,且其攻击易于实现。每当一个函数调用发生时,调用者 会在栈中留下一个活动纪录,它包含了函数结束时返回的地址。而栈溢出主要指栈的关键 内容被外界所改变,如果局部缓冲区发生溢出(超过了缓冲区的上边界),即往栈生长方向 的相反方向生长,那么就有可能覆盖一些关键指针,比如函数返回地址等。此时,程序的运 行就会发生异常,比如返回地址的修改将使程序运行跳转不可预料的地址,例如跳转到恶 意程序等。
[0004] 程序插粧,最早是由J.C. Huang教授提出的,它是在保证被测程序原有逻辑完整 性的基础上在程序中插入一些探针,通过探针的执行并抛出程序运行的特征数据,通过对 这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从 而实现测试目的的方法。
[0005] 根据检测发生的阶段,栈溢出的检测可以分为静态检测技术和动态检测技术。静 态检测技术指的是不依赖于程序的运行就能检测出栈溢出的错误,静态检测一般发生在编 译前和编译后。动态检测技术指的是检测过程必须依赖于程序的运行,一般需要在程序中 插入或者修改一些指令来检测栈的溢出。根据插入方式的不同,动态检测技术可以进一步 划分为静态插装和动态插装。静态插装技术主要是指对程序的修改发生在程序运行之前。 目前静态插装技术主要有两类:基于源码的静态插装技术和基于二进制代码的静态插装技 术。而动态插装指的是在程序运行过程中对二进制代码进行修改,在函数的入口和出口插 入一些指令来完成对栈使用情况的监控。
[0006] 现在的技术对栈溢出位置的检测都是基于源码重新编译的,不能针对已经编译好 的软件。

【发明内容】

[0007] 本发明的目的在于提供一种针对分析软件栈溢出位置的检测方法,该方法只判断 函数返回地址在其入口地址集合中,并不要求其一定为本函数入口地址,能够适应所有函 数调用方式。该方法不需要软件源码,在运行软件过程中,通过插粧方式在指定位置插入代 码,就能够进行检测,因而能方便地测试商用嵌入式软件。且判断方式简单,能够快速检测 出是否发生栈溢出现象,并通过具体分析,能够定位到发生栈溢出的具体位置。
[0008] 为了达到上述目的,本发明采用如下技术方案: 一种用于软件分析的栈溢出自动化检测方法及装置,其特征在于,包括以下器件: 插粧工具:负责编译监测程序,从监测程序接收检测命令并启动被测软件,获取被测软 件运行时信息再发送给监测程序; 监测程序:负责实际执行部分的主要功能,包括:设置监测具体位置,以及监测测试软 件运行时的具体信息,获取指定寄存器和内存的值,建立集合A并判断,当执行call指令 时,获取到其入栈地址并将其存入集合A ;在执行ret指令时,判断其返回地址是否在集合A 中,如果不在,则判定该函数存在栈溢出。
[0009] 测试软件:被测软件启动之后的运行部分; 在本发明中,定义了一个集合,利用程序插粧执行测试软件;当执行call指令时,获取 到其入栈地址并将其存入集合A ;在执行ret指令时,判断其返回地址是否在集合A中,如 果不在,则判定该函数存在栈溢出。该方法主要包括以下步骤: 51 :建立集合A,启动测试软件开始运行; 52 :通过程序插粧进行指令解析,根据监测程序的设置获取测试软件执行的指令与运 行信息,判定是否是转移类指令或程序结束指令,是程序结束指令则检测结束; 53 :判定程序转移类指令,如果为call指令,则获取其入口地址,如果为ret指令,则转 到步骤S5 ; 54 :将入口地址存入集合A中,转到步骤S2 ;判断其返回地址是否存在集合A中,如果 是,则转到步骤Sl,如果不是,则发生栈溢出,检测结束。
[0010] S5 :获取返回地址及其详细信息; S6 :与集合A中的地址进行比较,判断返回地址是否存在集合A中,如果是,则转到步骤 S2,如果不是,则发生栈溢出,检测结束; 在本发明中,检测call指令从插粧返回的运行信息中提取到的入口地址都保存到集 合中,检测ret指令获得返回地址后,直接判定返回地址是否在集合中,命中则正常,没命 中则表示发生了栈溢出现象。
[0011] 在本发明中,不要求返回地址必须与入栈地址一一对应,能够对各种复杂函数进 行检测,具有更好的适应性。
[0012] 本发明同现有技术相比,其有益效果表现在: 一、 判定逻辑简单,探测获取入口位置添加到集合中,探测获取返回位置,然后判定是 否在集合中,来判定是否发生了栈溢出,执行效率高; 二、 插粧技术是二进制分析框架,通过插粧技术在目标代码中进行代码插入,由于目标 代码的格式主要和操作系统相关,和具体的编程语言及版本无关,因此我们的分析方法即 使在无源码的各类商用软件上也能得到应用; 三、 本发明不强制要求函数出口与入口一一对应,能够适应几乎所有函数调用方式。例 如,在大多数时候,外部函数的调用是嵌套的,本发明也能够处理嵌套的外部函数。
【附图说明】
[0013] 图1是本发明的总体架构图; 图2为本发明的溢出检测流程图。
【具体实施方式】
[0014] 下面将结合附图及【具体实施方式】对本发明作进一步的描述。 实施例
[0015] 在本发明中,使用intel公司开发的用于程序测试的一款工具软件Pin,它是一款 动态二进制分析框架,可以用于构建强大的动态程序分析工具,支持32位、64位的Linux和 Windows的可执行程序,可以检测程序运行过程中的
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1