【问题标题】:gcc -fno-stack-protector optiongcc -fno-stack-protector 选项
【发布时间】: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 选项,但我根本无法重新创建任何东西......

提前感谢您的帮助。 :)

【问题讨论】:

    标签: c gcc stack stack-overflow


    【解决方案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 上似乎?
    猜你喜欢
    • 2012-05-29
    • 1970-01-01
    • 2012-01-20
    • 2012-05-02
    • 2019-09-22
    • 2016-06-15
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多