【问题标题】:Why doesn't buffer overflow occur with GCC?为什么 GCC 不会发生缓冲区溢出?
【发布时间】:2015-05-27 14:18:49
【问题描述】:

我最近刚刚了解缓冲区溢出。我试图使用 GCC 来复制它。这是我写的代码。

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int value = 5;
    char buffer_one[8], buffer_two[8];

    strcpy(buffer_one, "one");
    strcpy(buffer_two, "two");

    printf("[BEFORE] buffer_two is at %p and contains %s\n", buffer_two, buffer_two);
    printf("[BEFORE] buffer_one is at %p and contains %s\n", buffer_one, buffer_one);
    printf("[BEFORE] value is at %p and contains %d\n\n", value, value);

    printf("[STRCPY] copying %d bytes into buffer_two\n\n", strlen(argv[1]));
    strcpy(buffer_two, argv[1]);

    printf("[BEFORE] buffer_two is at %p and contains %s\n", buffer_two, buffer_two);
    printf("[BEFORE] buffer_one is at %p and contains %s\n", buffer_one, buffer_one);
    printf("[BEFORE] value is at %p and contains %d\n\n", value, value);

    return 0;
}

看起来应该可以了,对吧? buffer_two 和 buffer_one 在内存中是相邻的。

[BEFORE] buffer_two is at 0x7fff56ff2b68 and contains two
[BEFORE] buffer_one is at 0x7fff56ff2b70 and contains one
[BEFORE] value is at 0x5 and contains 5

然而,不久之后……

[STRCPY] copying 14 bytes into buffer_two

Abort trap: 6

C 怎么会认出这个?一些黑客如何执行更复杂的实际有效的缓冲区溢出?

【问题讨论】:

  • C(或 C++)不承认这一点。两种语言都没有对 C 字符串或数组进行边界检查,无论如何都没有标准化。写出任何东西都会导致未定义的行为,这意味着任何事情都可能发生。
  • 如果没有为您的代码 (gcc -S) 生成的程序集,就不可能明确回答,一旦提供,答案应该足够清楚,无需提问。
  • 您使用的是什么平台、gcc 版本和编译/链接命令行?
  • 检查你如何运行你的程序,可能你正在强制进行一些运行时检查。在这里查看它是如何工作的 ideone.com/wQHItj 。另请注意,ideone 堆栈的增长方向相反。
  • @MichaelBurr OS 10.10.2,最新版本的 GCC 4.2.1

标签: c++ c gcc buffer buffer-overflow


【解决方案1】:

在您的情况下,您已经成功地通过尝试在8chars 的内存区域中写入14chars 来产生缓冲区溢出。

一旦您写入超过分配的内存,行为就会变得未定义。所以,Abort 消息就在那里。

相关:undefined behaviour.

【讨论】:

    【解决方案2】:

    为什么 GCC 不会发生缓冲区溢出?

    嗯,它是发生在你的情况。这就是为什么,作为一个副作用,您可以看到 Abort 消息。

    【讨论】:

      【解决方案3】:

      发生缓冲区溢出时会发生undefined。这意味着任何事情都可能发生。例如,demons may fly from your nose。

      这里发生的事情是您的程序崩溃了。比较无聊。

      【讨论】:

      • 你如何将你的鼻子与你的程序联系起来?
      • @Lundin 现在,问这个问题会导致 UB。 :-D
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多