CN104714885B - 栈溢出位置的检测方法及装置 - Google Patents
栈溢出位置的检测方法及装置 Download PDFInfo
- Publication number
- CN104714885B CN104714885B CN201510080254.3A CN201510080254A CN104714885B CN 104714885 B CN104714885 B CN 104714885B CN 201510080254 A CN201510080254 A CN 201510080254A CN 104714885 B CN104714885 B CN 104714885B
- Authority
- CN
- China
- Prior art keywords
- function
- measured
- initial value
- stack overflow
- numeral
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本公开是关于栈溢出位置的检测方法及装置,用以实现快捷简便地检测栈溢出位置。该方法包括:在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,所述随机初始化数字处于所述程序的数组缓冲区的最后一个元素的前一个字节对齐地址处;执行所述待测函数,并在执行所述待测函数之后,获取所述随机初始化数字的当前值;判断所述当前值与所述初始值是否相同;当所述当前值与所述初始值相同时,确定所述待测函数未发生栈溢出;当所述当前值与所述初始值不相同时,确定所述待测函数发生栈溢出。该方法实现了快捷简便地检测栈溢出位置。
Description
技术领域
本公开涉及终端设备开发技术领域,尤其涉及栈溢出位置的检测方法及装置。
背景技术
随着智能手机的普及,近几年掀起了移动开发的热潮,特别是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(PersonalComputer,个人计算机)机对手机的检测。
利用本公开实施例提供的上述方法检测某一程序的栈溢出位置,可包括如下步骤:
第一步:在程序的数组缓冲区的最后一个元素的前一个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或类似。
本领域技术人员在考虑说明书及实践这里公开的公开后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
Claims (11)
1.一种栈溢出位置的检测方法,其特征在于,包括:
在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,所述随机初始化数字处于所述程序的数组缓冲区的最后一个元素的前一个字节对齐地址处,所述待测函数属于所述程序;
执行所述待测函数,并在执行所述待测函数之后,获取所述随机初始化数字的当前值;
判断所述当前值与所述初始值是否相同;
当所述当前值与所述初始值相同时,确定所述待测函数未发生栈溢出;当所述当前值与所述初始值不相同时,确定所述待测函数发生栈溢出;
所述确定程序中随机初始化数字的初始值之前,所述方法还包括:将所述程序中的当前层代码中的任一函数作为所述待测函数。
2.如权利要求1所述的方法,其特征在于,
所述确定所述待测函数未发生栈溢出之后,所述方法还包括:当当前层代码中的每一个函数均未发生栈溢出时,将下一层代码中的任一函数作为所述待测函数,并利用所述方法对该下一层代码中的待测函数进行栈溢出位置的检测。
3.如权利要求2所述的方法,其特征在于,
所述任一函数包括具有局部变量和/或全局变量的函数。
4.如权利要求1所述的方法,其特征在于,
所述确定程序中随机初始化数字的初始值之前,所述方法还包括:当发生栈溢出的函数中包括子函数时,将该发生栈溢出的函数中的任一子函数作为所述待测函数。
5.如权利要求4所述的方法,其特征在于,
所述任一子函数包括具有局部变量和/或全局变量的子函数。
6.一种栈溢出位置的检测装置,其特征在于,包括:
第一确定模块,用于在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,所述随机初始化数字处于所述程序的数组缓冲区的最后一个元素的前一个字节对齐地址处,所述待测函数属于所述程序;
函数执行模块,用于执行所述待测函数,并在执行所述待测函数之后,获取所述随机初始化数字的当前值;
判断模块,用于判断所述当前值与所述初始值是否相同;
第二确定模块,用于当所述当前值与所述初始值相同时,确定所述待测函数未发生栈溢出;当所述当前值与所述初始值不相同时,确定所述待测函数发生栈溢出;
所述装置还包括:
第一选择模块,用于在所述第一确定模块确定程序中随机初始化数字的初始值之前,将所述程序中的当前层代码中的任一函数作为所述待测函数。
7.如权利要求6所述的装置,其特征在于,所述装置还包括:
第二选择模块,用于在所述第二确定模块确定所述待测函数未发生栈溢出之后,当当前层代码中的每一个函数均未发生栈溢出时,将下一层代码中的任一函数作为所述待测函数,并利用所述装置对该下一层代码中的待测函数进行栈溢出位置的检测。
8.如权利要求7所述的装置,其特征在于,
所述任一函数包括具有局部变量和/或全局变量的函数。
9.如权利要求6所述的装置,其特征在于,所述装置还包括:
第三选择模块,用于在所述第一确定模块确定程序中随机初始化数字的初始值之前,当发生栈溢出的函数中包括子函数时,将该发生栈溢出的函数中的任一子函数作为所述待测函数。
10.如权利要求9所述的装置,其特征在于,
所述任一子函数包括具有局部变量和/或全局变量的子函数。
11.一种计算机可读存储介质,其上存储有计算机指令,其特征在于,该指令被处理器执行时实现以下步骤:
在执行待测函数之前,确定程序中随机初始化数字的初始值,其中,所述随机初始化数字处于所述程序的数组缓冲区的最后一个元素的前一个字节对齐地址处,所述待测函数属于所述程序;
执行所述待测函数,并在执行所述待测函数之后,获取所述随机初始化数字的当前值;
判断所述当前值与所述初始值是否相同;
当所述当前值与所述初始值相同时,确定所述待测函数未发生栈溢出;当所述当前值与所述初始值不相同时,确定所述待测函数发生栈溢出;
所述确定程序中随机初始化数字的初始值之前,还包括:将所述程序中的当前层代码中的任一函数作为所述待测函数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510080254.3A CN104714885B (zh) | 2015-02-13 | 2015-02-13 | 栈溢出位置的检测方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510080254.3A CN104714885B (zh) | 2015-02-13 | 2015-02-13 | 栈溢出位置的检测方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104714885A CN104714885A (zh) | 2015-06-17 |
CN104714885B true CN104714885B (zh) | 2017-12-01 |
Family
ID=53414243
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510080254.3A Active CN104714885B (zh) | 2015-02-13 | 2015-02-13 | 栈溢出位置的检测方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104714885B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106547606B (zh) * | 2016-10-25 | 2019-07-02 | 交控科技股份有限公司 | 堆栈自检方法及装置 |
CN109214169B (zh) * | 2017-06-30 | 2023-12-08 | 芜湖美的厨卫电器制造有限公司 | 堆栈溢出检测方法、装置及家用电器 |
CN107895115B (zh) * | 2017-12-04 | 2021-01-29 | 北京元心科技有限公司 | 防止栈溢出的方法、装置及终端设备 |
CN109189671B (zh) * | 2018-08-10 | 2022-02-11 | 百富计算机技术(深圳)有限公司 | 逐层夹逼式变量定位方法、系统及终端设备 |
CN109558734B (zh) * | 2018-11-28 | 2021-10-15 | 北京梆梆安全科技有限公司 | 一种堆栈安全性的检测方法及装置、移动设备 |
CN109885402B (zh) * | 2019-01-28 | 2021-06-08 | 百富计算机技术(深圳)有限公司 | 测试函数输出数据溢出的方法、终端设备及存储介质 |
CN111611135B (zh) * | 2020-05-25 | 2023-01-06 | 苏州浪潮智能科技有限公司 | 一种cpld或fpga信号处理的方法、装置、设备及可读介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101315655A (zh) * | 2008-07-01 | 2008-12-03 | 华为技术有限公司 | 一种防御缓冲区溢出攻击方法和装置 |
CN101866406A (zh) * | 2010-06-18 | 2010-10-20 | 中国科学院软件研究所 | 一种栈溢出攻击防御方法 |
CN103514405A (zh) * | 2013-07-08 | 2014-01-15 | 北京深思数盾科技有限公司 | 一种缓冲区溢出的检测方法及系统 |
CN103853662A (zh) * | 2014-02-21 | 2014-06-11 | 北京神舟航天软件技术有限公司 | 一种航天软件系统溢出检测和破坏限制机制 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2003022181A (ja) * | 2001-07-09 | 2003-01-24 | Fuji Electric Co Ltd | マイクロコンピュータのソフトウェア実行異常検出方法 |
-
2015
- 2015-02-13 CN CN201510080254.3A patent/CN104714885B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101315655A (zh) * | 2008-07-01 | 2008-12-03 | 华为技术有限公司 | 一种防御缓冲区溢出攻击方法和装置 |
CN101866406A (zh) * | 2010-06-18 | 2010-10-20 | 中国科学院软件研究所 | 一种栈溢出攻击防御方法 |
CN103514405A (zh) * | 2013-07-08 | 2014-01-15 | 北京深思数盾科技有限公司 | 一种缓冲区溢出的检测方法及系统 |
CN103853662A (zh) * | 2014-02-21 | 2014-06-11 | 北京神舟航天软件技术有限公司 | 一种航天软件系统溢出检测和破坏限制机制 |
Non-Patent Citations (1)
Title |
---|
Preventing brute force attacks against stack canary protection on networking servers;Hector Marco-Gisbert等;《2013 IEEE 12th International Symposium on Network Computing and Applications》;20131231;第244页左栏第28-53行,第244页右栏第5-7行 * |
Also Published As
Publication number | Publication date |
---|---|
CN104714885A (zh) | 2015-06-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104714885B (zh) | 栈溢出位置的检测方法及装置 | |
US11687645B2 (en) | Security control method and computer system | |
EP3014461B1 (en) | Systems and methods for procedure return address verification | |
CN101515316B (zh) | 一种可信计算终端及可信计算方法 | |
KR101691719B1 (ko) | 프로시저로부터의 리턴-타겟 제한적 리턴 명령어들, 프로세서들, 방법들 및 시스템들 | |
US7587612B2 (en) | Generating and communicating information on locations of program sections in memory | |
EP2519908B1 (en) | Jcvm bytecode execution protection against fault attacks | |
WO2017112202A1 (en) | Monitoring for zero-day attack | |
CN110325994B (zh) | 增强软件应用的控制流完整性的设备和方法 | |
CN109271789B (zh) | 恶意进程检测方法、装置、电子设备及存储介质 | |
CN109408261B (zh) | 应用程序崩溃处理方法、装置、计算机设备和存储介质 | |
US20190087208A1 (en) | Method and apparatus for loading elf file of linux system in windows system | |
CN113360910A (zh) | 恶意应用的检测方法、装置、服务器和可读存储介质 | |
WO2017112317A1 (en) | Mode-specific endbranch for control flow termination | |
CN113961919A (zh) | 恶意软件检测方法和装置 | |
Parasyris et al. | A framework for evaluating software on reduced margins hardware | |
US20200089883A1 (en) | Detecting malware based on address ranges | |
EP3692456B1 (en) | Binary image stack cookie protection | |
WO2017112315A1 (en) | Non-tracked control transfers within control transfer enforcement | |
US20190102279A1 (en) | Generating an instrumented software package and executing an instance thereof | |
Lackner et al. | Countering type confusion and buffer overflow attacks on Java smart cards by data type sensitive obfuscation | |
CN104680043A (zh) | 一种可执行文件的保护方法及装置 | |
KR20170124752A (ko) | 안티리버싱 코드 검출 방법 및 그 장치 | |
US8474045B2 (en) | Method of detecting program attacks | |
CN113220334B (zh) | 程序故障定位方法、终端设备及计算机可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |