堆栈溢出是什么?
一、堆栈溢出是什么
堆栈溢出是说堆区和栈区的溢出,二者同属于缓冲区溢出。从上面关于堆区和栈区的解释可以看出,一旦程序确定,堆栈内存空间的大小就是固定的,当数据已经把堆栈的空间占满,再往里面存放数据就会超出容量,发生上溢。发生下溢。需要注意的是,栈分为顺序栈和链栈,链栈不会发生溢出,顺序栈会发生溢出。
原因分析
堆栈尺寸设置过小、递归调用过深、函数调用层次过深等程序设计不当之处都可能导致堆栈溢出。
1、 堆栈尺寸设置过小
由堆栈溢出的定义便可知,堆栈尺寸设置过小时,其能储存的内容过小,容易发生溢出。 [6]
2、递归层次太深或函数调用层次过深导致堆栈溢出
调用函数时,系统将为调用者构造一个由参数表返回地址组成的活动记录,并将其押入到由系统提供的运行时刻栈的栈顶,然后将程序的控制权转移到被调函数。若被调函数有局部变量,则在运行时刻,在栈的栈顶也要为其分配相应的空间,因此,活动记录和这些局部变量形成了一个可供被调函数使用的活动结构。被调函数执行完毕时,系统将运行时刻栈的栈顶的活动结构退栈,并根据退栈的活动结构中所保存的返回地址将程序的控制权转移给调用者继续执行。由此可见,当递归层次太深时或者函数调用层次过深时会产生大量的活动记录和局部变量,当超过栈的空间长度时,即发生溢出。 [7]
例如C/C++语言中的无限递归:
1 2 3 4 5 6 7 | int foo() { return foo() //重复无限的自我调用 } (define (foo) (foo)) //这样定义会造成死循环,但不会导致堆栈溢出 (define (foo) (+(foo)1)) //这样的定义会产生堆栈溢出 |
3、动态申请空间使用之后没有释放
如果是C语言,由于没有垃圾资源自动回收机制,因此,需要程序主动释放已经不再使用的动态地址空间,如果不释放,程序结束后该部分空间依然存在,还可以继续访问,也就是说这部分依然占据着堆空间,剩余的堆空间减少,就可能造成堆区溢出。而如果是Java语言则因为有专门的垃圾回收器回收则不会有此问题。
延伸阅读:
二、堆栈溢出安全威胁
堆栈溢出常见的攻击类型有:修改函数的返回地址,使其指向攻击代码,当函数调用结束时程序跳转到攻击者设定的地址而不是原先的地址,修改函数指针,长跳转缓冲区来找到一个可供溢出的缓冲区。攻击者通过缓冲区溢出来重写存储在返回地址内的值从而达到控制程序的执行流程的目的。程序函数就像是一个大程序中的小程序。它是相对独立的,对传给它的数据做相应的处理然后将处理的结果返回给主函数。因为数据在一个函数内进行处理,因此它用栈作为数据的临时存储区域。当一个程序调用函数时,它将所有的数据压栈,包括返回地址,如图所示。当函数被调用时,指令指针指向的就是函数的返回地址。这一点很重要,因为当被调用函数执行结束以后,主程序要回到被调用函数的返回地址处,接着执行下一条指令。返回地址存储在RET中,当被调用函数执行结束,该返回地址传递给指令指针,以便主函数能够回到函数调用之前的地址继续执行。如果攻击者能够使缓冲区溢出并且重写存储在RET中的值,将恶意代码的地址赋值给RET,那么指令指针将指向恶意代码,从而执行恶意代码。
猜你喜欢LIKE
相关推荐HOT
更多>>分析型数据库是什么,和关系型数据库有什么区别?
一、分析型数据库分析型是从数据库的作用来划分的,其重点用来做数据分析(OLAP),大量都是select语句。还有一种是专门用来做事务处理的,一般...详情>>
2023-10-17 23:26:16python self是什么意思,怎么使用?
一、python self介绍首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的。self在定义类的方法时是必须有的,虽然在调...详情>>
2023-10-17 21:24:11创建Project提交到Github需要做什么?
一、创建Project提交到Github需要做什么1、在Github新建一个repository。2、打开编译器,编辑最外面的.gitignore,如果没有就新建一个这样的文件...详情>>
2023-10-17 20:23:50C/S和B/S架构的工作原理及优缺点?
一、C/S架构的工作原理C/S 架构中客户端和服务器之间通过网络连接进行通信,客户端发送请求后会等待服务器返回响应,直到收到响应后才能显示给...详情>>
2023-10-17 19:43:01热门推荐
Web前端开发是什么技术?
沸分析型数据库是什么,和关系型数据库有什么区别?
热对数量庞大的照片进行分类管理,较好的方便检索的方法是什么?
热web前端会用到哪些软件工具?
新Flash动画制作的原理是什么?
java/Python这么火,c++这么难,为什么我们还要选择用C++?
app开发的制作为什么报价和开发周期都不一样?
python self是什么意思,怎么使用?
什么是SEO?
PHP中的interface有什么用处?
创建Project提交到Github需要做什么?
为什么SwiftUI用struct来表示view?
C/S和B/S架构的工作原理及优缺点?
Flash为什么被淘汰了?