什么是堆栈溢出

堆栈溢出是指,堆栈(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.ZE.Z认证作者
上一篇 2023年4月16日 下午4:48
下一篇 2023年4月16日

相关推荐

  • while和do while的区别是什么

    while和do while的区别在于以下几个方面:1、循环结构的表达式不同;2、执行时判断方式不同;3、执行次数不同;4、执行末尾循环体的顺序不同。循环结构的表达式不同是指,while循环结构的表达式为while(表达式){循环体}。 一、循环结构的表达式不同 while循环结构的表达式为:whi…

    2023年2月21日
    2.4K00
  • 如何管理项目组合成员

    项目组合管理是一个涉及优先排序、资源分配、和绩效监控的复杂过程。确保沟通透明、为成员赋予正确的角色与责任、定期进行绩效评估、提供必要的培训与发展机会,以及监督项目组合的整体进展与健康状况这些策略是至关重要的。讲解其中一个核心观点,如“为成员赋予正确的角色与责任”:要高效地管理项目组合,确保每个成员都…

    2024年4月10日
    4500
  • 函数传递引用 与 直接操纵全局变量 消耗资源的区别

    区别:函引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用。 传递引用 在C++中,函数参数的传递方式有引用传递。所谓引用传递是指在调用函数时将…

    2023年2月20日
    37300
  • 拓展项目如何管理公司

    管理公司在拓展项目时,成功关键包括规划与预算、人员分配、时间管理、风险评估与应对、以及沟通与协调。特别是在规划与预算方面的工作是基石,它确保了项目从一开始就朝着正确的方向发展,并且拥有实现目标的所有必要资源。 详细来说,规划与预算包括明确项目目标、预测所需资源(包括财务和人力资源)、设定时间框架和里…

    2024年4月10日
    4500
  • 工程项目部如何优化管理

    工程项目部优化管理的核心方法包括增强团队协作、提高项目规划质量、实施严格的质量控制、采用先进的项目管理软件、进行风险管理和响应、加强与承包商和供应商的沟通、提升员工技能和专业知识。其中,增强团队协作尤为关键,因为一个高效的团队可以确保项目在多个环节上协调一致、高效运作,这对于项目的成功完成至关重要。…

    2024年4月10日
    5100
  • 办公oa系统有哪些功能

    开启话题,办公OA系统核心功能包括1、文档管理、2、工作流程自动化、3、沟通协作平台、4、任务与项目管理、5、日程管理、6、企业资源规划(ERP)整合、7、移动办公兼容性。这些是确保企业信息化、自动化水平提升的关键要素。详细展开文档管理部分,它允许存储、分类、检索、共享和安全控制文档及信息,从而实现…

    2024年1月11日
    36000
  • 项目如何加强风险管理

    加强项目风险管理的关键在于采取全面的、系统的、持续的方法来识别、评估和应对潜在风险。全面性表现在要覆盖项目的所有方面,包括财务、技术、市场、法律等多个维度的风险。特别值得强调的是,持续性对于项目风险管理至关重要。它意味着风险管理是一个始终伴随整个项目生命周期的过程,不应该是一次性或偶尔的活动,而应该…

    2024年4月10日
    4200
  • 工程单位如何管理工地项目

    工程单位管理工地项目的有效途径主要包括建立健全的项目管理体系、执行精细化成本控制、采纳先进的技术和设备、加强员工培训与安全教育、以及实施高效的沟通与协调机制。这些措施共同构成了工程项目管理的核心框架,旨在确保项目的顺利完成,同时控制成本和提高工作效率。在这些策略中,建立健全的项目管理体系尤为关键,它…

    2024年4月10日
    2900
  • 什么是迁移学习 (Transfer Learning)

    迁移学习是机器学习领域中的一种策略,其主要目标是将已经在某任务上学到的知识,应用到其他相关的任务上。可以从以下几点了解:1、定义与原理;2、应用场景;3、与传统机器学习的区别;4、实现方法;5、主要的挑战;6、前景与意义。 1、定义与原理 在实际的机器学习任务中,经常会遇到数据稀缺的情况。而迁移学习…

    2023年7月23日
    1.1K00
  • App接口设计和Web的接口设计有什么区别

    App接口设计和Web的接口设计区别有:1、使用环境;2、数据传输;3、安全性;4、用户体验。使用环境是指,最明显的区别是App接口设计用于移动应用,而Web的接口设计用于网页应用。移动应用运行在移动设备上,通常需要较小的数据传输和适应不同的屏幕尺寸。 一、使用环境 最明显的区别是App接口设计用于…

    2023年7月30日
    70800

发表回复

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

400-800-1024

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

分享本页
返回顶部