Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么';GCC是否会发生缓冲区溢出?_C++_C_Gcc_Buffer_Buffer Overflow - Fatal编程技术网

C++ 为什么';GCC是否会发生缓冲区溢出?

C++ 为什么';GCC是否会发生缓冲区溢出?,c++,c,gcc,buffer,buffer-overflow,C++,C,Gcc,Buffer,Buffer Overflow,我最近刚刚了解到缓冲区溢出。我试图用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"); prin

我最近刚刚了解到缓冲区溢出。我试图用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;
}
然而,在这之后不久

[STRCPY] copying 14 bytes into buffer_two

Abort trap: 6

为什么C会认识到这一点?一些黑客如何执行更复杂的缓冲区溢出,而这些溢出实际上是有效的呢?

在你的例子中,你试图在
8
char
s的内存区域中写入
14
char
s,成功地造成了缓冲区溢出

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


相关:。

发生缓冲区溢出时发生的情况是。这意味着任何事情都有可能发生。例如

这里发生的是你的程序崩溃了。相当无聊

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


嗯,你的情况就是这样。这就是为什么,作为一种副作用,您可以看到中止消息。

C(或C++)无法识别这一点。这两种语言都没有对C字符串或数组进行边界检查,而且也没有标准化。写任何东西都会导致未定义的行为,这意味着任何事情都可能发生。如果没有为您的代码生成的程序集(
gcc-S
),就不可能给出明确的答案,而且一旦提供,答案应该足够清楚,不需要任何问题。什么平台、gcc版本,您使用的是compile/link命令行吗?检查您的程序是如何运行的,可能您正在强制执行一些运行时检查。看看它是怎么工作的。还要注意,在ideone上,堆栈的增长方向是相反的。@MichaelBurr OS 10.10.2,GCC 4.2.1的最新版本,您如何将您的鼻子与程序连接在一起?@Lundin现在,问这个问题将导致UB.:-D
[STRCPY] copying 14 bytes into buffer_two

Abort trap: 6