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

3

我最近学习了缓冲区溢出的知识,尝试使用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语言是如何识别这一点的?一些黑客如何执行更复杂的缓冲区溢出攻击,并使其真正起作用?

1
C(或 C++)并不认识那个。这两种语言对于 C 字符串或数组没有边界检查,至少没有标准化的检查方式。访问超出边界的数据会导致未定义行为,也就是可能会发生任何事情。 - Some programmer dude
没有生成的汇编代码(gcc -S),我们无法明确回答问题,一旦提供了汇编代码,答案应该是清晰明了的,不需要再提问。 - Pascal Cuoq
1
你使用的是哪个平台、gcc版本以及编译/链接命令行? - Michael Burr
1
检查一下你运行程序的方式,可能是在强制进行某些运行时检查。在这里查看它的工作原理:http://ideone.com/wQHItj。另外请注意,在 ideone 上堆栈增长的方向与正常相反。 - Nikita
@MichaelBurr 操作系统版本为OS 10.10.2,GCC编译器版本为最新的4.2.1。 - Thor Correia
3个回答

3
在你的情况下,你成功地通过试图在一个内存区域中写入14个字符来产生了缓冲区溢出。
一旦你超过了分配的内存空间,行为就变得不明确了。因此,Abort消息就出现了。
相关链接:未定义行为

2

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

实际上,在您的情况下确实发生了缓冲区溢出。这就是为什么您会看到终止消息的副作用


1

你如何将你的鼻子与程序联系起来呢? - Lundin
@Lundin 现在问那个问题会导致未定义行为。:-D - Natasha Dutta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接