gcc-fno堆栈保护器选项

gcc-fno堆栈保护器选项,c,gcc,stack,stack-overflow,C,Gcc,Stack,Stack Overflow,我正在做一个学校项目,基本上我们正在努力学习堆栈溢出。我正在编写的一些示例代码基本上是:(精简) char测试[10]; int i; 对于(i=0;i

我正在做一个学校项目,基本上我们正在努力学习堆栈溢出。我正在编写的一些示例代码基本上是:(精简)

char测试[10];
int i;
对于(i=0;i<10000;i++){
测试[i]=“a”;
}
当我用gcc编译这篇文章时,一切都很好。Gcc自动保护堆栈,从不让堆栈过度溢出。现在,如果我尝试使用gcc-fno堆栈保护器。。。。运行完全相同的程序。我甚至对程序集文件(选项-S)进行了区分,它们是相同的。有什么好处?我搜索了手册页,没有提到-fno堆栈选项。。。所有在线内容都指向-fno堆栈保护器选项,但我根本无法重新创建任何内容

提前感谢您的帮助。:)

你确定吗?地雷(iff堆栈防护未禁用):

int测试(){
煤焦试验[10];
int i;
对于(i=0;i<10000;i++){
测试[i]=“a”;
}
}

hmmmm。我一直在研究它,虽然奇怪的是默认情况下没有启用堆栈保护,所以-fno-stack-protector选项完全不起作用。我必须使用-fstack-protector选项来启用堆栈保护,这使得我的应用程序在运行后抛出一个segfault。因此,堆栈保护会导致应用程序抛出分段错误,而没有堆栈保护允许代码随意修改堆栈?取决于系统(发行版),最好依靠“除非您设置了堆栈,否则不会设置任何内容”。还有一些optim。flags启动了它(-O3,不要认为是O2启动的)。@Glen你运行的程序是巧合,可能比segfault更糟糕。它很高兴在禁用堆栈保护的情况下注销了数组的末尾,您只是不知道(因为没有检查您是否在边界内)。它可能已经用delete_hard_drive或launch_the_飞弹覆盖了printf的地址,而你只是不知道,因为你在这次运行中没有调用printf。一个响亮的崩溃通常比无声的失败要好。所以要确保它在aff
-fstack protector
上,看起来是这样吗?
char test[10];
int i;
for (i=0;i < 10000;i++) {
    test[i] = 'a';
}
.L2:
        cmpl    $9999, -36(%rbp)
        jle     .L3
        movq    -8(%rbp), %rdx
        xorq    %fs:40, %rdx
        je      .L5
        call    __stack_chk_fail
int test() {
char test[10];
int i;
for (i=0;i < 10000;i++) {
  test[i] = 'a';
 }
}