栈溢出和缓冲区溢出有什么区别?

81

在编程中,堆栈溢出和缓冲区溢出有什么区别?


15
有趣的是,栈溢出是缓冲区溢出的一种特殊情况。:hmm: - Sam Harwell
12
"he he .. Stack Overflow指的是一个网站,Buffer Overflow不是..." - Xinus
1
@Spencer Ruport 这个为什么会在元数据上呢? - orokusaki
11个回答

149

栈溢出指执行栈增长超出其所保留的内存空间的情况。例如,如果您调用一个递归调用自身且没有终止条件的函数,就会引起栈溢出,因为每次函数调用都会创建一个新的栈帧,而栈最终将消耗超过为其保留的内存。

缓冲区溢出是指程序在任何缓冲区(包括堆上的缓冲区,不仅仅是栈上的缓冲区)分配的内存结束后写入数据的情况。例如,如果您在从堆上分配的数组末尾之后继续写入,则会导致缓冲区溢出。


5
可以这样说,堆栈溢出是缓冲区溢出的一种特定类型吗?(我认为堆栈是运行时分配的一部分内存。) - Assad Ebrahim
既然相关性很大,不妨也加上缓冲区溢出的描述。 - arkon
4
“堆栈溢出”一词通常用来描述发生在堆栈上的缓冲区溢出。 - Oktalist

25

关键差别在于了解堆栈和缓冲区的区别。

堆栈是为执行程序保留的空间。当您调用函数时,它的参数和返回信息会被放置在堆栈上。

缓冲区是用于单一目的的通用内存块。例如,字符串是一个缓冲区。如果向字符串中写入超过分配的数据,则可能会导致缓冲区溢出。


11

11

堆栈溢出: 你在当前线程的内存分配中放置了太多的内容,导致堆栈溢出。

缓冲区溢出: 你已经超出了当前分配的缓冲区大小,并且没有调整大小来适应(或者无法进一步调整大小)。


5

当线程的堆栈大小超过该线程允许的最大堆栈大小时,就会发生stackoverflow。

缓冲区溢出是指将一个值写入程序当前未分配的内存中。


4

你的意思不是应该问“栈和缓冲区之间的区别是什么吗?”-- 这会更快地帮助你获得更多的见解。一旦你理解了这一点,那么你就可以考虑溢出每个东西的含义。


3

1. 基于堆栈的缓冲区溢出 • 当程序将数据写入计划外的内存地址时发生,这个地址是在程序调用堆栈上的固定长度缓冲区之外。 • 基于堆栈的编程特点: 1. “堆栈”是一个内存空间,用于分配自动变量。 2. 函数参数分配在堆栈上,并且不会被系统自动初始化,因此它们包含垃圾值,直到被初始化。 3. 当函数完成周期后,对堆栈中变量的引用会被移除。(即如果函数被多次调用,则每次调用和退出函数时,本地变量和参数都会被重新创建和销毁。)
• 攻击者利用基于堆栈的缓冲区溢出以各种方式操纵程序,通过覆盖
1. 靠近堆栈上缓冲区的本地变量,从而改变可能有利于攻击者的程序行为。
2. 栈框架中的返回地址。一旦函数返回,执行将在返回地址处恢复,由攻击者指定,通常是用户输入填充的缓冲区。 3. 随后执行的函数指针或异常处理程序。 • 克服攻击的因素是
1. 地址中的空字节 2. shell代码位置的可变性 3. 环境之间的差异。Shell代码是用于利用软件漏洞的小型代码

2. 堆缓冲区溢出

• 发生在堆数据区。 • 当应用程序将更多数据复制到缓冲区中时,如果缓冲区的容量不足,则会发生溢出。 • 如果拷贝数据到缓冲区时没有先验证源是否适合目的地,则容易受到攻击。 • 基于堆栈和基于堆的编程的特点: • “堆”是一个“自由存储区”,即动态对象分配的内存空间。 • 堆是动态分配 new()、malloc() 和 calloc() 函数的内存空间。 • 在执行之前,动态创建的变量(如声明的变量)会在堆上创建并存储在内存中,直到对象的生命周期结束。 • 攻击是通过以下方式进行的: • 通过破坏数据来覆盖内部结构,例如链表指针。 • 指针交换以覆盖程序功能。


3

缓冲区溢出通常指的是当堆栈或堆内存访问超出它们的边界时。堆栈溢出意味着堆栈超过其分配的限制,在大多数计算机/操作系统上堆栈会运行过头。


1

缓冲区是一块连续的内存。

程序堆栈用于跟踪函数调用和返回,也是连续的,并且在技术上是一个缓冲区。

当您尝试将大量数据写入小型缓冲区时,会发生缓冲区溢出,因为缓冲区无法容纳这么多数据,所以它溢出

当您进行过多的未返回调用(通常与递归相关)以填满堆栈时,会发生堆栈溢出,因此它还会溢出


0
让我用RAM的图解释得更简单一些。在深入了解之前,我建议先阅读有关StackFrame、Heap Memory的内容。
如您所见,栈向下增长(由箭头表示),假设它是栈。内核代码、文本、数据都是静态数据,因此它们是固定的。堆部分是动态的,向上增长(由箭头表示)。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接