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

编程中堆栈溢出和缓冲区溢出有什么不同?

堆栈溢出特指当执行堆栈增长超出为其保留的内存时的情况。 例如,如果你调用一个recursion调用自己而不终止的函数,当每个函数调用创build一个新的栈帧时,你将会导致一个堆栈溢出,堆栈最终会消耗比为它保留的内存。

缓冲区溢出是指任何情况下,程序写入的内存超出了分配给任何缓冲区的内存(包括在堆上,而不是在堆栈上)。 例如,如果您从堆中分配的数组的末尾写入,则会导致缓冲区溢出。

关键的区别是知道堆栈和缓冲区之间的差异。

堆栈是执行程序执行的空间。当你调用一个函数时,它的参数和返回信息被放置在堆栈上。

缓冲区是用于单一目的的通用内存块。 例如,一个string是一个缓冲区。 可以通过向string写入比分配的更多的数据来运行。

堆栈溢出:你分配给当前线程的内存堆栈太多了

缓冲区溢出:你已经超过了你当前分配的缓冲区的大小,并没有调整它的大小以适应(或者不能再调整它)。

比你可能想知道的更多:

堆栈溢出

缓冲区溢出

一个stackoverflow是当一个线程的堆栈大小超过该线程的最大允许堆栈大小。

当一个值被写入当前没有被程序分配的内存中时,缓冲区溢出。

缓冲区溢出通常代表一个内存缓冲区在任何时候被访问,而不pipe是堆栈还是堆栈。 堆栈溢出意味着堆栈超出了分配的限制,并且大多数机器/操作系统正在堆栈上运行。

你不是想说“栈和缓冲区有什么区别吗?” – 这会使你更快速地获得更多的见解。 一旦你得到了这么多,那么你可以想一想这些东西溢出意味着什么。

1.基于堆栈的缓冲区溢出 •当程序在预期的数据结构 – 定长缓冲区外写入​​程序调用栈上的内存地址时发生。 •基于堆栈的编程特性1.“堆栈”是分配自动variables的内存空间。 2.函数参数被分配在堆栈上,不会被系统自动初始化,所以在初始化之前它们会有垃圾。 3.一个函数完成循环后,栈中的variables被引用。 (即,如果多次调用函数,则每次调用和退出函数时都会重新创build和删除局部variables和参数。)
•攻击者利用基于堆栈的缓冲区溢出来通过覆盖以各种方式操纵程序
1.靠近栈中内存缓冲区的局部variables来改变可能有利于攻击者的程序的行为。
2.在栈帧中返回地址。 一旦函数返回,执行将在攻击者指定的返回地址恢复,通常是用户input填充的缓冲区。 3.函数指针或exception处理程序,随后执行。 •克服利用的因素是
1.地址中的空字节2. shell代码的位置变化3.环境之间的差异Shell代码是用于利用软件漏洞的一小段代码。

2.堆缓冲区溢出

发生在堆数据区域。 •当应用程序将更多数据复制到缓冲区中时,会发生溢出,而不是缓冲区devise为包含的数据。 •如果将数据复制到缓冲区而没有首先validation该源是否适合目的地,则容易被利用。 •基于堆栈和基于堆的编程的特性:•当分配dynamic对象时,“堆”是一个“自由存储”,即内存空间。 •堆是内存空间dynamic分配的new(),malloc()和calloc()函数。 •dynamic创build的variables(即声明的variables)在执行前在堆上创build并存储在内存中,直到对象的生命周期完成。 •执行开发•通过破坏数据来覆盖内部结构,例如链接列表指针。 指针交换覆盖程序function

大多数提到缓冲区溢出的人都意味着栈溢出。 但是,溢出可能发生在任何区域,而不仅限于堆栈。 比如堆或者bss。 堆栈溢出仅限于覆盖堆栈中的返回地址,但是不会覆盖返回地址的正常溢出可能会覆盖其他本地variables。