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

Operating system 堆栈溢出和缓冲区溢出有什么区别?,operating-system,stack-overflow,buffer-overflow,Operating System,Stack Overflow,Buffer Overflow,编程中堆栈溢出和缓冲区溢出的区别是什么?堆栈溢出特别指执行堆栈超出为其保留的内存时的情况。例如,如果调用一个递归地调用自身而不终止的函数,则会导致堆栈溢出,因为每次函数调用都会创建一个新的堆栈帧,堆栈最终将消耗比为其保留的内存更多的内存 缓冲区溢出是指程序写入超出为任何缓冲区(包括堆,而不仅仅是堆栈)分配的内存末尾的任何情况。例如,如果写入超过从堆中分配的数组的结尾,则导致缓冲区溢出。堆栈溢出是指线程的堆栈大小超过该线程允许的最大堆栈大小 缓冲区溢出是指将值写入程序当前未分配的内存中 堆栈溢出:

编程中堆栈溢出和缓冲区溢出的区别是什么?

堆栈溢出特别指执行堆栈超出为其保留的内存时的情况。例如,如果调用一个递归地调用自身而不终止的函数,则会导致堆栈溢出,因为每次函数调用都会创建一个新的堆栈帧,堆栈最终将消耗比为其保留的内存更多的内存


缓冲区溢出是指程序写入超出为任何缓冲区(包括堆,而不仅仅是堆栈)分配的内存末尾的任何情况。例如,如果写入超过从堆中分配的数组的结尾,则导致缓冲区溢出。

堆栈溢出是指线程的堆栈大小超过该线程允许的最大堆栈大小


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

堆栈溢出:对于分配给当前线程的内存,您在堆栈上放置了太多内容


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

您可能想知道的更多:


缓冲区溢出通常表示内存缓冲区的访问超出其边界,无论是堆栈还是堆。堆栈溢出意味着堆栈已超过其分配的限制,并且在大多数计算机/操作系统上正在堆上运行

关键区别在于了解堆栈和缓冲区之间的区别

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


缓冲区是用于单一目的的通用内存块。例如,字符串是缓冲区。通过向字符串中写入比分配的数据更多的数据,它可能会被过度运行。

您的意思是说“堆栈和缓冲区之间的区别是什么?”——这将使您更快地了解更多信息。一旦你做到这一点,你就可以考虑溢出这些东西意味着什么。

大多数提到缓冲区溢出的人都是指堆栈流。但是,溢出可能发生在任何区域,而不仅仅限于堆栈。例如堆或bss。堆栈溢出仅限于覆盖堆栈上的返回地址,但不覆盖返回地址的正常溢出可能只会覆盖其他局部变量。

1。基于堆栈的缓冲区溢出 •当程序写入预期数据结构(固定长度缓冲区)之外的程序调用堆栈上的内存地址时发生。 •基于堆栈编程的特点 1.“堆栈”是分配自动变量的内存空间。 2.函数参数是在堆栈上分配的,不会由系统自动初始化,因此在初始化之前它们都是垃圾。 3.函数完成其循环后,将删除对堆栈中变量的引用。(即,如果函数被多次调用,则每次调用和退出该函数时都会重新创建和销毁其局部变量和参数。)
•攻击者利用基于堆栈的缓冲区溢出,通过覆盖
1.位于堆栈内存缓冲区附近的一个局部变量,用于更改程序的行为,从而可能使攻击者受益。
2.堆栈帧中的返回地址。函数返回后,将在攻击者指定的返回地址(通常是用户输入填充的缓冲区)继续执行。 3.随后执行的函数指针或异常处理程序。 •克服漏洞的因素有
1.地址中的空字节 2.shell代码位置的可变性 3.环境外壳代码之间的差异是用于利用软件漏洞的一小段代码

2。堆缓冲区溢出

•发生在堆数据区域中。 •当应用程序向缓冲区复制的数据超过缓冲区的设计容量时,会发生溢出。 •如果在未验证源是否适合目标的情况下将数据复制到缓冲区,则易受攻击。 •基于堆栈和基于堆编程的特点: •“堆”是一种“空闲存储”,即分配动态对象时的内存空间。 •heap是动态分配给new()、malloc()和calloc()函数的内存空间。 •动态创建的变量(即声明的变量)在执行前在堆上创建,并存储在内存中,直到对象的生命周期结束。 •执行开发 •通过破坏数据来覆盖内部结构,如链表指针。
•重写程序功能的指针交换

让我用RAM图以更简单的方式解释一下。在开始之前,我建议先阅读一下StackFrame,Heap Memory

如您所见,堆栈向下增长(箭头所示),假设它是堆栈。内核代码、文本和数据都是静态数据,因此它们是固定的。动态的堆部分向上增长(箭头所示)


有趣的是,堆栈溢出是缓冲区溢出的一种特殊情况:嗯:他。。堆栈溢出会影响网站,缓冲区溢出不会…@Spencer Ruport为什么会出现在Meta上?局部变量不是也通常存在于堆栈上吗?那么,公平地说,堆栈溢出是一种特定类型的缓冲区溢出吗?(我认为堆栈是在运行时分配的内存的一部分)也可以添加缓冲区溢出的描述,因为它密切相关