缓冲区溢出(vs)缓冲区溢出(vs)堆栈溢出[重复]

Posted

技术标签:

【中文标题】缓冲区溢出(vs)缓冲区溢出(vs)堆栈溢出[重复]【英文标题】:Buffer Overflow (vs) Buffer OverRun (vs) Stack Overflow [duplicate] 【发布时间】:2010-11-11 18:14:17 【问题描述】:

可能重复:What is the difference between a stack overflow and buffer overflow ?

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

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

请包含代码示例。我查看了 Wikipedia 中的术语,但无法与 C、C++ 或 Java 编程相匹配。

【问题讨论】:

***明确指出缓冲区溢出和缓冲区溢出是同义词。因此,您的问题是您在***.com/questions/1120575 提出的问题 这个问题可能是可以解决的,因为缓冲区溢出和缓冲区溢出之间的区别是什么(A:它们是同一概念的同义词)。没有理由让***而不是 SO 成为来源。 缓冲区溢出是最常见的安全风险来源之一。缓冲区溢出本质上是由于将未经检查的外部输入视为可信数据而引起的 msdn.microsoft.com/en-us/library/ms717795(VS.85).aspx @Kirsh,这也是缓冲区溢出。 【参考方案1】:

将缓冲区视为一个数组。每当您尝试引用超出数组末尾的索引时,人们经常交替使用“溢出”和“溢出”,这很好。就个人而言,我做了区分:

缓冲区溢出是指您尝试在数组中放入比数组可以容纳更多的项目。它们从缓冲区的末端流出。换句话说,它来自写作

缓冲区溢出是指您遍历缓冲区并继续读取数组末尾之后的内容。您的迭代器正在缓冲区中运行并继续运行。换句话说,它来自阅读

堆栈溢出有很大不同。大多数现代编程环境都是基于堆栈的,它们使用堆栈数据结构来控制程序流。每次调用函数时,都会在程序的调用堆栈中放置一个新项。当函数返回时,该项从堆栈中弹出。当堆栈为空时,程序停止。问题是,这个堆栈的大小是有限的。 一次调用太多函数并填满堆栈是可能的。此时你有一个堆栈溢出。最常见的方法是函数调用自身(递归)。

【讨论】:

“缓冲区溢出 [...] 来自读取”- 来源? 想查看该来源以获取与@Paul 相同的引用 @underthevoid 这个很老了,不过回头再仔细阅读我的第二、三句吧。 你的意思是这是你的主观个人特征? @underthevoid 是的,但似乎有人同意。【参考方案2】:

在 C/C++ 中,缓冲区溢出和缓冲区溢出之间存在差异:

我们可以在索引/指向超出原始缓冲区大小时定义溢出(例如读取 3 元素数组的第 6 个元素) 我们可以定义溢出,当你有多个相邻的缓冲区,并且你索引到第二个(例如,读取第一个 3 元素数组的第 6 个元素但你得到第二个 3 元素数组的第 3 个元素)。

当您填充整个堆栈“内存缓冲区”时,堆栈溢出有点像缓冲区溢出。

【讨论】:

【参考方案3】:

缓冲区溢出和缓冲区溢出有什么区别? 我会说缓冲区溢出是当您尝试写入超出缓冲区的末尾时,但是您有一个阻止它的检查。缓冲区溢出是指您实际写入超出缓冲区的末尾。第一个是快速失败,第二个更难检测。

你不能在java中溢出缓冲区,因为它总是有边界检查,因此会产生一个BufferOverflowException。

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

它们彼此无关。

【讨论】:

【参考方案4】:

缓冲区溢出/缓冲区溢出:

void k()

    BYTE buf[5];
    for( int i = 0; i < 10; ++i )
        buf[i] = 0xcd;

堆栈溢出:

void f()

     int k = 0;
     f();

【讨论】:

我找到了缓冲区运行的代码.. 它到底在做什么?

以上是关于缓冲区溢出(vs)缓冲区溢出(vs)堆栈溢出[重复]的主要内容,如果未能解决你的问题,请参考以下文章

什么是堆栈溢出和缓冲区溢出错误? [复制]

怎么解决 LINUX 堆栈溢出内存的问题

缓冲区溢出及堆栈/堆操纵

VS警告:C6386 写入到“xxx”时缓冲区溢出: 可写大小为“xxx”个字节,但可能写入了“4294967295”个字节

VS警告:C6386 写入到“xxx”时缓冲区溢出: 可写大小为“xxx”个字节,但可能写入了“4294967295”个字节

VS部分安全函数用法