【问题标题】:What is the difference between a stack overflow and buffer overflow?堆栈溢出和缓冲区溢出有什么区别?
【发布时间】:2010-11-10 08:55:40
【问题描述】:

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

【问题讨论】:

  • 有趣的是,堆栈溢出是缓冲区溢出的一种特殊情况。 :hmm:
  • 嘿嘿 .. Stack Overflow 冷藏到网站,Buffer Overflow 没有...
  • @Spencer Ruport 为什么会出现在 Meta 上?

标签: operating-system stack-overflow buffer-overflow


【解决方案1】:

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

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

【讨论】:

  • 那么说堆栈溢出是一种特定类型的缓冲区溢出是否公平? (我认为堆栈是在运行时分配的内存的一部分)
  • 还不如添加缓冲区溢出的描述,因为它密切相关。
  • 术语“堆栈溢出”通常用于描述堆栈上发生的缓冲区溢出。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    缓冲区溢出:您已超出当前分配的缓冲区的大小,并且尚未调整其大小以适应(或无法进一步调整大小)。

    【讨论】:

      【解决方案4】:

      比你想知道的更多:

      Stack Overflow

      Buffer Overflow

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          关键区别在于知道堆栈和缓冲区之间的区别。

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

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

          【讨论】:

            【解决方案7】:

            你不是想说“堆栈和缓冲区有什么区别吗?” ——这将使您更快地获得更多洞察力。一旦你走到了这一步,你就可以考虑溢出这些东西意味着什么。

            【讨论】:

              【解决方案8】:

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

              【讨论】:

              • 局部变量不是经常在栈上吗?
              【解决方案9】:

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

              2。堆缓冲区溢出

              • 发生在堆数据区。 • 当应用程序将更多数据复制到缓冲区中时,会发生溢出,该缓冲区超出了缓冲区的设计容量。 • 如果它在没有首先验证源是否适合目标的情况下将数据复制到缓冲区,则很容易被利用。 • 基于堆栈和基于堆编程的特点: • “堆”是分配动态对象时的内存空间的“空闲存储”。 • 堆是动态分配的内存空间 new()、malloc() 和 calloc() 函数。 • 动态创建的变量(即声明的变量)在执行前在堆上创建并存储在内存中,直到对象的生命周期完成。 • 执行开发 • 通过破坏数据来覆盖内部结构,例如链表指针。 • 指针交换以覆盖程序功能

              【讨论】:

                【解决方案10】:

                让我用 RAM 的图表来更简单地解释一下。在开始之前,我建议阅读有关 StackFrame、Heap Memory 的内容。

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

                【讨论】:

                  猜你喜欢
                  • 2010-11-11
                  • 1970-01-01
                  • 2011-04-23
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-02-23
                  • 2015-07-03
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多