什么是堆栈溢出

堆栈溢出是指,堆栈(Stack)是一种抽象数据结构,是一组相同数据类型的组合,所有的操作均在堆栈顶端进行,具有“后进先出”的特性,即最后一个放入堆栈中的物体总是被最先拿出来。水满则溢,堆栈是有一定容量限制的,当超出了该容量限制,就会发生溢出。

一、什么是堆栈溢出

堆栈(Stack)是一种抽象数据结构,是一组相同数据类型的组合,所有的操作均在堆栈顶端进行,具有“后进先出”的特性,即最后一个放入堆栈中的物体总是被最先拿出来。堆栈中两个最重要的是PUSH(进栈)和POP(出栈), PUSH操作在堆栈的顶部加入一 个元素,POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。水满则溢,堆栈是有一定容量限制的,当超出了该容量限制,就会发生溢出。

二、溢出危害

从小处看,堆栈溢出会改变临近堆栈的空间中的内容,从而导致程序运行异常,发生故障;从大处看,堆栈溢出和计算机网络安全密切相关。堆栈溢出攻击是计算机被攻击的最为常见的一种形式,远程网络的攻击绝大多数是针对堆栈溢出的漏洞,这种攻击可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部控制权。

1、一般后果

堆栈溢出时会访问不存在的RAM空间,造成代码跑飞,这时无法得到溢出时的上下文数据,也无法对后续的程序修改提供有用信息。

2、安全威胁

堆栈溢出常见的攻击类型有:修改函数的返回地址,使其指向攻击代码,当函数调用结束时程序跳转到攻击者设定的地址而不是原先的地址,修改函数指针,长跳转缓冲区来找到一个可供溢出的缓冲区。

攻击者通过缓冲区溢出来重写存储在返回地址内的值从而达到控制程序的执行流程的目的。程序函数就像是一个大程序中的小程序。它是相对独立的,对传给它的数据做相应的处理然后将处理的结果返回给主函数。因为数据在一个函数内进行处理,因此它用栈作为数据的临时存储区域。当一个程序调用函数时,它将所有的数据压栈,包括返回地址,如图所示。当函数被调用时,指令指针指向的就是函数的返回地址。这一点很重要,因为当被调用函数执行结束以后,主程序要回到被调用函数的返回地址处,接着执行下一条指令。返回地址存储在RET中,当被调用函数执行结束,该返回地址传递给指令指针,以便主函数能够回到函数调用之前的地址继续执行。如果攻击者能够使缓冲区溢出并且重写存储在RET中的值,将恶意代码的地址赋值给RET,那么指令指针将指向恶意代码,从而执行恶意代码。

堆是程序中动态分配的内存空间,因为程序在执行前所需要的内存数量是未知的,因此堆内存在程序需要时进行动态分配,不需要时进行动态释放。堆和栈的主要区别在于,堆没有像栈那样的返回地址,这使得在栈溢出中用于控制程序执行流程的相关技术不可用。堆溢出可能导致重写数据或者指向其他函数的指针。这样,攻击者可以重写这些指针使其指向恶意代码,而不是指向原来的内存区域。

利用堆栈溢出攻击计算机的最典型的例子是1988年利用fingerd漏洞进行攻击的蠕虫病毒。

延伸阅读

防范措施

通常的代码要设置堆栈缓冲区,较好能检测堆栈运行形况,设置堆栈溢出检测算法。对于递归引起的堆栈溢出,可以采用循环处理。

针对堆栈溢出可能造成的计算机安全问题,通常有以下这些防范措施:

(1) 强制按照正确的规则写代码

(2) 通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码。但由于攻击者并不一定要通过植入代码来实现攻击,同时linux在信号传递和GCC的在线重用都使用了可执行堆栈的属性,因此该方法依然有一定弱点。

(3) 利用编译器的边界检查来实现缓冲区的保护。该方法使得缓冲区溢出不可能出现,完全消除了缓冲区溢出的威胁,但代价较大,如性能速度变慢。

(4) 程序指针完整性检查,该方法能阻止绝大多数缓冲区溢出攻击。该方法就是说在程序使用指针之前,检查指针的内容是否发生了变化。

文章标题:什么是堆栈溢出,发布者:E.Z,转载请注明出处:https://worktile.com/kb/p/49450

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
E.Z的头像E.Z
上一篇 2023年4月16日 下午4:48
下一篇 2023年4月16日

相关推荐

  • 项目的什么不包含管理储备

    项目的成本计划、风险应对策略、进度计划以及范围描述是不包含管理储备的。在项目管理中,管理储备是为了应对项目中无法预见的风险而设立的一种预算,它不包含在项目的初步预算中,也不包含在项目的成本基准中。这是因为管理储备的使用需要得到高层管理人员的批准,因此,它并不属于项目经理可以自由支配的资源。在具体实施…

    2024年8月7日
    600
  • 项目管理目标 ci目标是什么

    在项目管理中,CI目标是指持续集成目标,这是一种软件开发实践,它要求团队频繁地将代码集成到一个共享的主线中。CI目标主要包括:减少集成问题、提高软件质量、加速软件发布。 持续集成通过自动化的构建和测试,可以发现并修复集成问题,从而避免了“集成地狱”的情况。这有利于提高团队的效率,减少重复的工作,帮助…

    2024年8月7日
    400
  • 文化项目运行管理是什么

    文化项目运行管理包括:项目规划、资源配置、进度控制、成本管理、风险管理。项目规划是文化项目运行管理中最为关键的一环。它不仅涉及到项目的总体目标、阶段性目标和具体任务的明确,还包括对项目时间表、资源分配及预算的详细安排。一个科学的项目规划可以有效地指导项目的实施,确保项目按计划进行,避免资源浪费和时间…

    2024年8月7日
    300
  • 新加坡项目管理模式是什么

    新加坡的项目管理模式是一种以结果为导向,注重团队协作的管理方式。这种模式的主要特点包括:以项目为中心,明确项目目标和预期成果;强调团队之间的沟通和协作,确保项目的顺利进行;关注风险管理,提前预防和解决可能出现的问题;重视质量管理,保证项目成果的质量和效益。其中,以项目为中心,明确项目目标和预期成果是…

    2024年8月7日
    400
  • 项目管理师需要学什么

    项目管理师需要掌握的知识和技能主要包括:项目管理理论、项目质量管理、项目风险管理、项目时间管理、项目成本管理、项目沟通管理、项目人力资源管理、项目采购管理、项目整合管理等。此外,还需要具备一定的领导力、沟通能力、决策能力、协调能力、解决问题的能力以及时间管理能力等。 接下来,我将详细介绍这些知识和技…

    2024年8月7日
    200

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部