gcc内存分配问题 - 缓冲区溢出攻击

Rav*_*avi 15 c gcc

gcc是否智能地进行内存分配以防止缓冲区溢出攻击?

int function(char *str) {
    int a = 0;                 // See the
    char b[16] = "abcd";       // changes here

    if(!strcmp(b, str))
        a = 1;

    return a;
}
Run Code Online (Sandbox Code Playgroud)

int function(char *str) {
    char b[16] = "abcd";       // See the
    int a = 0;                 // changes here

    if(!strcmp(b, str))
        a = 1;

    return a;
}
Run Code Online (Sandbox Code Playgroud)

当我用gdb调试它时,它总是首先将内存分配给整数变量然后分配字符数组; 无论变量声明的顺序是什么.即在上述两种情况下,编译器首先分配内存a然后分配给内存b.

(higher address)
  Memory
|        |
|        |
+--------+
|        |
|        |
|        |
|        |
+--------+ <----- b (16 bytes)
|        |
+--------+ <----- a (4 bytes)
|        |
(lower address)
Run Code Online (Sandbox Code Playgroud)

所以,即使我们提供超过16个字符str,它也不会影响价值a.有人可以帮帮我吗?

谢谢.

Has*_*kun 11

是的,如果用-fstack-protector旗帜运行.

当使用该标志运行时,GCC添加堆栈canaries,将数组变量排序到堆栈帧的最高部分,以使其更难以溢出它们并破坏其他变量,并使函数参数的副本与其他本地存储一起存储.

有关详细信息,请参阅有关缓冲区溢出保护Wikipedia页面ProPolice主页