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 选项的主要内容,如果未能解决你的问题,请参考以下文章