gcc -fno-stack-protector 选项

Posted

技术标签:

【中文标题】gcc -fno-stack-protector 选项【英文标题】:gcc -fno-stack-protector option 【发布时间】:2012-03-23 17:39:21 【问题描述】:

我正在做一个学校项目,基本上我们正在尝试了解堆栈溢出。我正在处理的一些示例代码基本上是:(精简)

char test[10];
int i;
for (i=0;i < 10000;i++) 
    test[i] = 'a';

当我用 gcc 编译它时,一切都很好。 Gcc 会自动保护堆栈并且永远不会让它异常溢出。现在,如果我尝试使用 gcc -fno-stack-protector.... 完全相同的程序运行。我什至对程序集文件(-S 选项)进行了比较,它们是相同的。是什么赋予了?我搜索了手册页,没有提到 -fno-stack 选项......网上的一切都指向 -fno-stack-protector 选项,但我根本无法重新创建任何东西......

提前感谢您的帮助。 :)

【问题讨论】:

【参考方案1】:

你确定吗?我的给出(如果堆栈保护未禁用):

.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';
 

【讨论】:

嗯嗯嗯嗯。我一直在研究它,虽然奇怪的是默认情况下没有启用堆栈保护,但 -fno-stack-protector 选项绝对没有任何作用。我必须使用 -fstack-protector 选项来启用堆栈保护,这现在会使我的应用程序在运行后引发段错误。那么堆栈保护会导致应用程序抛出分段错误,而没有堆栈保护可以让代码随意修改堆栈? 取决于系统(发行版),最好依靠“除非你设置它,否则什么都没有设置”。此外,一些优化。标志将其关闭(-O3,不要认为 O2 会这样做)。 @Glen 您的程序运行纯属巧合,可能比段错误更糟糕。它很高兴在禁用堆栈保护的情况下注销数组的末尾,您只是不知道它(因为没有检查您是否在边界内)。它可能已经用 delete_hard_drive 或 launch_the_missiles 覆盖了 printf 的地址,而您只是不知道,因为您在此运行中没有调用 printf。大声的崩溃通常比无声的失败要好。 所以要确保它在 aff -fstack-protector 上似乎?

以上是关于gcc -fno-stack-protector 选项的主要内容,如果未能解决你的问题,请参考以下文章

Mac OSX 上的 GCC——多个版本的 gcc

mingw和gcc的关系?mingw具有gcc的全部核心编译功能吗

gcc 和 g++/gcc-c++ 有啥区别?

ubuntu系统下怎么安装gcc编译器

GCC:在 GCC 版本之间伪装

arm gcc 内嵌汇编,gcc该是啥选项呢