栈溢出位置的检测方法及装置.pdf

上传人:a3 文档编号:1665216 上传时间:2018-07-03 格式:PDF 页数:22 大小:1.08MB
返回 下载 相关 举报
摘要
申请专利号:

CN201510080254.3

申请日:

2015.02.13

公开号:

CN104714885A

公开日:

2015.06.17

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 11/36申请日:20150213|||公开

IPC分类号:

G06F11/36; G06F21/52(2013.01)I

主分类号:

G06F11/36

申请人:

小米科技有限责任公司

发明人:

李明浩; 甘晓霖; 王舒捷

地址:

100085北京市海淀区清河中街68号华润五彩城购物中心二期13层

优先权:

专利代理机构:

北京尚伦律师事务所11477

代理人:

代治国

PDF下载: PDF下载
内容摘要

本公开是关于栈溢出位置的检测方法及装置,用以实现快捷简便地检测栈溢出位置。该方法包括:在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,所述随机初始化数字处于所述程序的数组缓冲区的最后一个元素的前一个字节对齐地址处;执行所述待测函数,并在执行所述待测函数之后,获取所述随机初始化数字的当前值;判断所述当前值与所述初始值是否相同;当所述当前值与所述初始值相同时,确定所述待测函数未发生栈溢出;当所述当前值与所述初始值不相同时,确定所述待测函数发生栈溢出。该方法实现了快捷简便地检测栈溢出位置。

权利要求书

权利要求书
1.  一种栈溢出位置的检测方法,其特征在于,包括:
在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,所述随机初始化数字处于所述程序的数组缓冲区的最后一个元素的前一个字节对齐地址处,所述待测函数属于所述程序;
执行所述待测函数,并在执行所述待测函数之后,获取所述随机初始化数字的当前值;
判断所述当前值与所述初始值是否相同;
当所述当前值与所述初始值相同时,确定所述待测函数未发生栈溢出;当所述当前值与所述初始值不相同时,确定所述待测函数发生栈溢出。

2.  如权利要求1所述的方法,其特征在于,
所述确定程序中随机初始化数字的初始值之前,所述方法还包括:将所述程序中的当前层代码中的任一函数作为所述待测函数;
所述确定所述待测函数未发生栈溢出之后,所述方法还包括:当当前层代码中的每一个函数均未发生栈溢出时,将下一层代码中的任一函数作为所述待测函数,并利用所述方法对该下一层代码中的待测函数进行栈溢出位置的检测。

3.  如权利要求2所述的方法,其特征在于,
所述任一函数包括具有局部变量和/或全局变量的函数。

4.  如权利要求1所述的方法,其特征在于,
所述确定程序中随机初始化数字的初始值之前,所述方法还包括:当发生栈溢出的函数中包括子函数时,将该发生栈溢出的函数中的任一子函数作为所述待测函数。

5.  如权利要求4所述的方法,其特征在于,
所述任一子函数包括具有局部变量和/或全局变量的子函数。

6.  一种栈溢出位置的检测装置,其特征在于,包括:
第一确定模块,用于在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,所述随机初始化数字处于所述程序的数组缓冲区的最后一个元素的前一个字节对齐地址处,所述待测函数属于所述程序;
函数执行模块,用于执行所述待测函数,并在执行所述待测函数之后,获取所述随机初始化数字的当前值;
判断模块,用于判断所述当前值与所述初始值是否相同;
第二确定模块,用于当所述当前值与所述初始值相同时,确定所述待测函数未发生栈溢出;当所述当前值与所述初始值不相同时,确定所述待测函数发生栈溢出。

7.  如权利要求6所述的装置,其特征在于,所述装置还包括:
第一选择模块,用于在所述第一确定模块确定程序中随机初始化数字的初始值之前,将所述程序中的当前层代码中的任一函数作为所述待测函数;
第二选择模块,用于在所述第二确定模块确定所述待测函数未发生栈溢出之后,当当前层代码中的每一个函数均未发生栈溢出时,将下一层代码中的任一函数作为所述待测函数,并利用所述方法对该下一层代码中的待测函数进行栈溢出位置的检测。

8.  如权利要求7所述的装置,其特征在于,
所述任一函数包括具有局部变量和/或全局变量的函数。

9.  如权利要求6所述的装置,其特征在于,所述装置还包括:
第三选择模块,用于在所述第一确定模块确定程序中随机初始化数字的初始值之前,当发生栈溢出的函数中包括子函数时,将该发生栈溢出的函数中的任一子函数作为所述待测函数。

10.  如权利要求9所述的装置,其特征在于,
所述任一子函数包括具有局部变量和/或全局变量的子函数。

11.  一种栈溢出位置的检测装置,其特征在于,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为:
在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,所述随机初始化数字处于所述程序的数组缓冲区的最后一个元素的前一个字节对齐地址处,所述待测函数属于所述程序;
执行所述待测函数,并在执行所述待测函数之后,获取所述随机初始化数字的当前值;
判断所述当前值与所述初始值是否相同;
当所述当前值与所述初始值相同时,确定所述待测函数未发生栈溢出;当所述当前值与所述初始值不相同时,确定所述待测函数发生栈溢出。

说明书

说明书栈溢出位置的检测方法及装置
技术领域
本公开涉及终端设备开发技术领域,尤其涉及栈溢出位置的检测方法及装置。
背景技术
随着智能手机的普及,近几年掀起了移动开发的热潮,特别是android系统的开源,使得各个厂商的开发手机系统的成本变得很低,同时也引来的越来越多的开发人员进入到这一嵌入式领域开发平台,嵌入式领域主要是基于arm架构的嵌入式开发。arm编程以及调试技术已经越来越成为当今移动开发领域的核心竞争力。快速地开发以及调试程序是每个移动开发者迫切想要掌握的技能。
栈溢出问题在程序开发中十分常见,然而,编程人员一直都没有很好的解决该问题的方法,在arm架构编程这个当下最为热门的领域更是如此。
发明内容
为克服相关技术中存在的问题,本公开实施例提供栈溢出位置的检测方法及装置,用以实现快捷简便地检测栈溢出位置。
根据本公开实施例的第一方面,提供一种栈溢出位置的检测方法,包括:
在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,所述随机初始化数字处于所述程序的数组缓冲区的最后一个元素的前一个字节对齐地址处,所述待测函数属于所述程序;
执行所述待测函数,并在执行所述待测函数之后,获取所述随机初始化数字的当前值;
判断所述当前值与所述初始值是否相同;
当所述当前值与所述初始值相同时,确定所述待测函数未发生栈溢出;当所述当前值与所述初始值不相同时,确定所述待测函数发生栈溢出。
在一个实施例中,所述确定程序中随机初始化数字的初始值之前,所述方法还包括:将所述程序中的当前层代码中的任一函数作为所述待测函数;
所述确定所述待测函数未发生栈溢出之后,所述方法还包括:当当前层代码中的每一个函数均未发生栈溢出时,将下一层代码中的任一函数作为所述待测函数,并利用所述方法对该下一层代码中的待测函数进行栈溢出位置的检测。
在一个实施例中,所述任一函数包括具有局部变量和/或全局变量的函数。
在一个实施例中,所述确定程序中随机初始化数字的初始值之前,所述方法还包括:当发生栈溢出的函数中包括子函数时,将该发生栈溢出的函数中的任一子函数作为所述待测函数。
在一个实施例中,所述任一子函数包括具有局部变量和/或全局变量的子函数。
根据本公开实施例的第二方面,提供一种栈溢出位置的检测装置,包括:
第一确定模块,用于在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,所述随机初始化数字处于所述程序的数组缓冲区的最后一个元素的前一个字节对齐地址处,所述待测函数属于所述程序;
函数执行模块,用于执行所述待测函数,并在执行所述待测函数之后,获取所述随机初始化数字的当前值;
判断模块,用于判断所述当前值与所述初始值是否相同;
第二确定模块,用于当所述当前值与所述初始值相同时,确定所述待测函数未发生栈溢出;当所述当前值与所述初始值不相同时,确定所述待测函数发生栈溢出。
在一个实施例中,所述装置还包括:
第一选择模块,用于在所述第一确定模块确定程序中随机初始化数字的初始值之前,将所述程序中的当前层代码中的任一函数作为所述待测函数;
第二选择模块,用于在所述第二确定模块确定所述待测函数未发生栈溢出之后,当当前层代码中的每一个函数均未发生栈溢出时,将下一层代码中的任一函数作为所述待测函数,并利用所述方法对该下一层代码中的待测函数进行栈溢出位置的检测。
在一个实施例中,所述任一函数包括具有局部变量和/或全局变量的函数。
在一个实施例中,所述装置还包括:
第三选择模块,用于在所述第一确定模块确定程序中随机初始化数字的初始值之前,当发生栈溢出的函数中包括子函数时,将该发生栈溢出的函数中的任一子函数作为所述待测函数。
在一个实施例中,所述任一子函数包括具有局部变量和/或全局变量的子函数。
根据本公开实施例的第三方面,提供一种栈溢出位置的检测装置,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为:
在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,所述随机初始化数字处于所述程序的数组缓冲区的最后一个元素的前一个字节对齐地址处,所述待测函数属于所述程序;
执行所述待测函数,并在执行所述待测函数之后,获取所述随机初始化数字的当前值;
判断所述当前值与所述初始值是否相同;
当所述当前值与所述初始值相同时,确定所述待测函数未发生栈溢出;当所述当前值与所述初始值不相同时,确定所述待测函数发生栈溢出。
本公开的实施例提供的技术方案可以包括以下有益效果:
上述技术方案,通过比对函数执行前后保存于预设位置处的随机初始化数字的值,就能确定出栈溢出位置,实现了快捷简便地检测栈溢出的位置,方便程序开发人员进行进程调试。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
图1是根据一示例性实施例示出的一种栈溢出位置的检测方法的流程图。
图2是根据一示例性实施例示出的另一种栈溢出位置的检测方法的流程图。
图3是根据一示例性实施例示出的一种栈溢出位置的检测装置的框图。
图4是根据一示例性实施例示出的另一种栈溢出位置的检测装置的框图。
图5是根据一示例性实施例示出的再一种栈溢出位置的检测装置的框图。
图6是根据一示例性实施例示出的适用于栈溢出位置的检测装置的框图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些 方面相一致的装置和方法的例子。
在说明本公开实施例提供的技术方案之前,首先说明一下本公开实施例技术方案依据的原理。本公开实施例基于arm编译器原理,是一种行之有效的栈溢出位置检测技术。
以下面一段程序代码为例:


若在程序的编译选项中添加-fstack-protector(栈溢出检查)选项,就可以根据反编译得到的汇编代码,得到此时程序代码的数据在内存中的结构,如下所示:


由上述内存结构可以看到,上述程序代码中声明的buffer占据了一块连续 的缓冲区,并且在最后一块缓冲区域buffer[13]之后的第一块以4为整数的位置,本公开实施例中的编译器放置了用于防止栈溢出的一个随机初始化数字__stack_chk_guard。
__stack_chk_guard就是本公开实施例中arm编译器防止栈溢出的关键所在,在每次执行函数返回的时候,编译器可检验__stack_chk_guard是否发生了改变,如果改变了,就说明在函数的执行过程中对__stack_chk_guard进行了修改,而__stack_chk_guard的位置是放置于程序的数组尾部的,当且仅当函数对数组尾部超出边界部分的内存进行了修改,这样就可以检测出栈溢出的发生了。
此处需要说明的是,函数function的局部变量buffer由14个数组组成,其大小按说应为14字节,但是在堆栈帧中却为其分配了16个字节。这是时间效率和空间效率之间的一种折衷,因为arm架构(32位)的处理器,其每次内存访问都必须是4字节对齐的,而高30位地址相同的4个字节就构成了一个机器字。因此,如果为了填补buffer留下的两个字节,编译器将__stack_chk_guard分配在下一个机器字取出数据的起始位置中,而不是紧接在数组最后一个单元的背后,这样便于最快取出__stack_chk_guard进行校验。
根据这种规律,我们取出找到对任何长度的数组缓冲区对应的__stack_chk_guard值,只需要按照如下算法即可知道__stack_chk_guard所存放的地址:
对于需要校验的char buffer(即数组缓冲区),__stack_chk_guard值在堆栈中的地址为:size%n=0?div(size,n):(floor(size/n)+1)。其中,size表示程序的数组缓冲区的大小,用字节数表示;%表示取余的符号;n表示字节对齐大小,如4字节对齐时,n的值等于4。上述算法的意思为:首先判断size%4是否等于0;如果等于0,则__stack_chk_guard值在堆栈中的地址为div(size,n)位置处;如果不等于0,则__stack_chk_guard值在堆栈中的地址为(floor(size/n)+1。
另外还要注意的是,在gcc编译器添加对应的编译选项-fstack-protector的时候,对于局部变量中含有char数组的函数,char数组前一个对齐的字是__stack_chk_guard值,但是针对这种情况有多个char数组的,不会对所有的char数组都设置一个__stack_chk_guard,保护的仅仅是靠近fp(frame pointer,指向栈中一个函数的local变量的首地址)寄存器的那个char数组,而在frame pointer和被保护的char数组之间就是__stack_chk_guard值。
基于上述原理,本公开实施例提供了一种栈溢出位置的检测方法,该方法可用于程序开发检测系统,可用于arm架构的linux进程调试,如图1所示,该方法包括步骤S101-S103:
在步骤S101中,在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,随机初始化数字处于程序的数组缓冲区的最后一个元素的前一个字节对齐地址处,待测函数属于该程序,即待测函数是该程序代码中所包含的程序。
其中,数组缓冲区的最后一个元素是指缓冲最后一个数组的缓冲区域。
例如,常见的有4字节对齐,则随机初始化数字处于程序的数组缓冲区的最后一个元素的前一个4字节对齐地址处。
由前面的分析可见,当待测函数越界访问数组缓冲区的时候,会覆盖随机初始化数字的初始值,而导致在执行待测函数之后,从堆栈中读取出来的随机初始化函数的当前值与初始值不一致,从而就可检测出待测函数发生栈溢出。
在步骤S102中,执行待测函数,并在执行待测函数之后,获取随机初始化数字的当前值。
在步骤S103中,判断随机初始化数字的当前值与初始值是否相同,如果是则执行步骤S104;否则执行步骤S105。
在步骤S104中,当随机初始化数字的当前值与初始值相同时,确定待测函数未发生栈溢出。
在步骤S105中,当随机初始化数字的当前值与初始值不相同时,确定待测函数发生栈溢出。
在一个实施例中,如图2所示,在执行步骤S101之前,上述方法还可包括步骤S100:将程序中的当前层代码中的任一函数作为待测函数;具体实施时,可在当前层代码中选择可能会发生栈溢出的函数作为待测函数,例如选择具有局部变量、全局变量中任一种变量的函数作为待测函数,这样可以简化检测过程,缩短检测时间。此时,执行步骤S104之后,上述方法还可包括:当当前层代码中的每一个函数均未发生栈溢出时,将下一层代码中的任一函数作为待测函数,并返回步骤S101继续利用上述方法对该下一层代码中的待测函数进行栈溢出位置的检测。即利用上述方法逐个检测当前层代码中的函数,如果当前层代码中的所有待测函数均未发生栈溢出时,再利用上述方法逐个检测下一层代码中的函数,直到检测到发生栈溢出的函数。其中,在程序代码中选择可作为待测函数的函数时,可优先选择具有局部变量、全局变量中任一变量的函数作为待测函数。因为执行具有变量的函数后,发生栈溢出的概率比不具有变量的函数的概率高,从而可以简化检测过程,缩短检测时间。
在一个实施例中,如果利用上述方法检测出了发生栈溢出的函数,为了进一步确定是该函数发生栈溢出的具体代码位置,如果该函数中还包括子函数,即下一级函数,如图2所示,则还可以执行步骤S111:判断该函数中是否包括子函数,如果该函数中不包括子函数,则可执行步骤S112:根据该函数的基本语句确定具体发生栈溢出的代码位置;如果包括子函数,则可执行步骤113:在该函数中选择任一子函数作为待测函数,继续利用前述步骤S101-S105对该新的待测函数进行检测;如果该新的待测函数未发生栈溢出,再从该函数中选择其它子函数作为待测函数继续检测,以此类推,直到确定出发生栈溢出的代码位置。其中,在函数中选择可作为待测函数的子函数时,可优先选择具有局部变量、全局变量中任一变量的子函数作为待测函数。。
本公开实施例提供的上述方法,通过比对函数执行前后保存于预设位置处的随机初始化数字的值,就能确定出栈溢出位置,实现了快捷简便地检测栈溢出的位置,方便程序开发人员进行进程调试。
本公开实施例提供的上述方法,可应用于很多领域的检测,例如PC(Personal Computer,个人计算机)机对手机的检测。
利用本公开实施例提供的上述方法检测某一程序的栈溢出位置,可包括如下步骤:
第一步:在程序的数组缓冲区的最后一个元素的前一个4字节对齐地址处,设置__stack_chk_guard,并在程序的编译选项中添加-fstack-protector(栈溢出检查)选项。
随机初始化数字__stack_chk_guard这个变量可在bionic/libc/bionic/libc_init_common.cpp中定义,并在运行程序时进行随机初始化。
第二步:从程序中选择一函数作为待测函数,在执行待测函数前,获取__stack_chk_guard的初始值。
第三步:执行待测函数。
在执行该待测函数之后,会将__stack_chk_guard的值保存在紧挨着数组缓冲区的最后一个元素的前一个4字节对齐的字中。根据前面的原理可以知道,如果待测函数越界访问的数组缓冲区,会覆盖__stack_chk_guard的值,从而导致在待测函数返回时,从堆栈中读取出来的__stack_chk_guard的当前值与初始值不一致,最终可能会导致待测函数执行失败。
以下是一段代码示例:


第四步:执行待测函数之后,查找__stack_chk_guard保存在堆栈中的地址,并且获取__stack_chk_guard的当前值,查看当前值与初始值是否一致。
查找保存在堆栈中的__stack_chk_guard值的地址的方法如下所述:根据arm的堆栈是从高地址向低地址增长的原则,默认采用小端存储数据;读取按照4字节对齐;-fstack-protector选项是针对char数组缓冲区进行check的。那么__stack_chk_guard值存储的位置只有一个地方,那就是对应char数组缓冲区最后一个元素所保存的地址字节前一个4字节对齐的地址处。分别实验了两次,找到最终保存在了procBuf缓冲区的最后一个元素的前一个4字节对齐地址处,可使用如下代码取出地址值:



在每执行一个待测函数之前都获取保存在堆栈中的__stack_chk_guard的初始值,在执行待测函数之后都获取__stack_chk_guard的当前值,查看_stack_chk_guard的值是在什么时候改变的,不断类似的缩小查找范围。
如果有函数越界访问数组缓冲区,那么就有可能覆盖堆栈中的标志变量__stack_chk_guard的值,以下以processDeflatedEntry函数为例进行说明,如下代码所示,其中并没有把所添加的所有log加上,此处只是为了示例说明:



逐个执行待测函数,并在每执行一个待测函数之前都记录堆栈中__stack_chk_guard的初始值、并在执行后记录__stack_chk_guard的当前值,通过比较初始值和当前值,可确定出是在执行哪个函数时__stack_chk_guard的值发生了改变。
例如下面的log:
minzip:__stack_chk_guard=5ffbedfa
minzip:enter guardptr=5ffbedfa
...
//这里显示的是在执行inflate函数后stack_chk_guard的值发生了变化:
minzip:check ib guardptr=5f fb ed fa
minzip:check ei guardptr=5f fb ed d4
...
minzip:exit guardptr=5ffbedd4
后续,不断缩小查找的范围,最后在external/zlib库中的inflate函数,该函数会调用一个汇编函数inflate_fast_copy_neon执行拷贝动作,此函数根据不同情况会对拷贝的大小进行每次4、8、16字节这样的拷贝方式。当缓冲区拷贝剩余只有3个字节的时候,由于4字节进行拷贝,后边的一个字节 就会被覆盖(也就是如上log中的fa变成了d4),就这样造成了缓冲区溢出。
对应前述方法,本公开实施例还提供一种栈溢出位置的检测装置,如图3所示,该装置包括:
第一确定模块31被配置为在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,所述随机初始化数字处于所述程序的数组缓冲区的最后一个元素的前一个字节对齐地址处,所述待测函数属于所述程序;
函数执行模块32被配置为执行待测函数,并在执行待测函数之后,获取随机初始化数字的当前值;
判断模块33被配置为判断当前值与初始值是否相同;
第二确定模块34被配置为当当前值与初始值相同时,确定待测函数未发生栈溢出;当当前值与初始值不相同时,确定待测函数发生栈溢出。
在一个实施例中,如图4所示,上述装置还可包括:
第一选择模块41被配置为在第一确定模块31确定程序中随机初始化数字的初始值之前,将所述程序中的当前层代码中的任一函数作为所述待测函数;
第二选择模块42被配置为在第二确定模块34确定待测函数未发生栈溢出之后,当当前层代码中的每一个函数均未发生栈溢出时,将下一层代码中的任一函数作为所述待测函数,并利用所述方法对该下一层代码中的待测函数进行栈溢出位置的检测。
在一个实施例中,任一函数包括具有局部变量和/或全局变量的函数。
在一个实施例中,如图5所示,上述装置还可包括:
第三选择模块51被配置为在第一确定模块程序中随机初始化数字的初始值之前,当发生栈溢出的函数中包括子函数时,将该发生栈溢出的函数中的任一子函数作为待测函数。
在一个实施例中,任一子函数包括具有局部变量和/或全局变量的子函数。
根据本公开实施例的第三方面,提供一种栈溢出位置的检测装置,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,处理器被配置为:
在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,所述随机初始化数字处于所述程序的数组缓冲区的最后一个元素的前一个字节对齐地址处,所述待测函数属于所述程序;
执行所述待测函数,并在执行所述待测函数之后,获取所述随机初始化数字的当前值;
判断所述当前值与所述初始值是否相同;
当所述当前值与所述初始值相同时,确定所述待测函数未发生栈溢出;当所述当前值与所述初始值不相同时,确定所述待测函数发生栈溢出。
上述处理器还可被配置为:
所述确定程序中随机初始化数字的初始值之前,所述方法还包括:将所述程序中的当前层代码中的任一函数作为所述待测函数;
所述确定所述待测函数未发生栈溢出之后,所述方法还包括:当当前层代码中的每一个函数均未发生栈溢出时,将下一层代码中的任一函数作为所述待测函数,并利用所述方法对该下一层代码中的待测函数进行栈溢出位置的检测。
上述处理器还可被配置为:
所述任一函数包括具有局部变量和/或全局变量的函数。
上述处理器还可被配置为:
所述确定程序中随机初始化数字的初始值之前,所述方法还包括:当发生栈溢出的函数中包括子函数时,将该发生栈溢出的函数中的任一子函数作为所述待测函数。
上述处理器还可被配置为:
所述任一子函数包括具有局部变量和/或全局变量的子函数。
一种非临时性计算机可读存储介质,当所述存储介质中的指令由移动终端的处理器执行时,使得移动终端能够执行一种栈溢出位置的检测方法,所述方法包括:
在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,所述随机初始化数字处于所述程序的数组缓冲区的最后一个元素的前一个字节对齐地址处,所述待测函数属于所述程序;
执行所述待测函数,并在执行所述待测函数之后,获取所述随机初始化数字的当前值;
判断所述当前值与所述初始值是否相同;
当所述当前值与所述初始值相同时,确定所述待测函数未发生栈溢出;当所述当前值与所述初始值不相同时,确定所述待测函数发生栈溢出。
在一个实施例中,所述确定程序中随机初始化数字的初始值之前,所述方法还包括:将所述程序中的当前层代码中的任一函数作为所述待测函数;
所述确定所述待测函数未发生栈溢出之后,所述方法还包括:当当前层代码中的每一个函数均未发生栈溢出时,将下一层代码中的任一函数作为所述待测函数,并利用所述方法对该下一层代码中的待测函数进行栈溢出位置的检测。
在一个实施例中,所述任一函数包括具有局部变量和/或全局变量的函数。
在一个实施例中,所述确定程序中随机初始化数字的初始值之前,所述方法还包括:当发生栈溢出的函数中包括子函数时,将该发生栈溢出的函数中的任一子函数作为所述待测函数。
在一个实施例中,所述任一子函数包括具有局部变量和/或全局变量的子函数。
图6是根据一示例性实施例示出的一种适用于栈溢出位置的检测装置 600的框图。例如,装置600可以被提供为一计算机。参照图6,装置600包括处理组件622,其进一步包括一个或多个处理器,以及由存储器632所代表的存储器资源,用于存储可由处理组件622的执行的指令,例如应用程序。存储器632中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件622被配置为执行指令,以执行上述数据分类方法。
装置1900还可以包括一个电源组件626被配置为执行装置600的电源管理,一个有线或无线网络接口650被配置为将装置600连接到网络,和一个输入输出(I/O)接口658。装置600可以操作基于存储在存储器632的操作系统,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM或类似。
本领域技术人员在考虑说明书及实践这里公开的公开后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。

栈溢出位置的检测方法及装置.pdf_第1页
第1页 / 共22页
栈溢出位置的检测方法及装置.pdf_第2页
第2页 / 共22页
栈溢出位置的检测方法及装置.pdf_第3页
第3页 / 共22页
点击查看更多>>
资源描述

《栈溢出位置的检测方法及装置.pdf》由会员分享,可在线阅读,更多相关《栈溢出位置的检测方法及装置.pdf(22页珍藏版)》请在专利查询网上搜索。

本公开是关于栈溢出位置的检测方法及装置,用以实现快捷简便地检测栈溢出位置。该方法包括:在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,所述随机初始化数字处于所述程序的数组缓冲区的最后一个元素的前一个字节对齐地址处;执行所述待测函数,并在执行所述待测函数之后,获取所述随机初始化数字的当前值;判断所述当前值与所述初始值是否相同;当所述当前值与所述初始值相同时,确定所述待测函数未发生栈溢出;。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1