-fno-stack-protector有什么用?

时间:2012-05-23 03:16:27

标签: c buffer stack-overflow protection callstack

我用C编写了一个应用程序,我试图在编译时理解-fno-stack-protector命令的用途是什么。对于我的特定应用程序,如果我在防止缓冲区溢出方面使用此命令,则没有区别。

我在网上看到-fstack-protector-fno-stack-protector命令分别启用和禁用堆栈粉碎保护程序,但如果我自己编译应用程序,如何预先启用保护程序?命令的使用是否可能取决于运行应用程序的系统?

5 个答案:

答案 0 :(得分:15)

在标准/库存GCC中,堆栈保护器默认处于关闭状态。但是,一些Linux发行版修补了GCC以默认打开它。在我看来,这是相当有害的,因为它打破了编译任何没有链接到标准用户空间库的能力,除非Makefile专门禁用堆栈保护程序。它甚至会破坏Linux内核的构建,除了带有这个hack的发行版为GCC增加了额外的攻击,以检测内核是否正在构建并禁用它。

答案 1 :(得分:11)

如果使用-fstack-protector进行编译,那么在代码设置检查然后实际检查是否会在堆栈上分配更多的空间并且在进入和返回函数时会有更多的开销在函数中你已经覆盖了堆栈。

它会对您的应用程序产生影响。如果启用,它将很快阻止堆栈溢出攻击。只有在代码中没有函数调用时才会使程序不受影响(因为你通常会编写main(),这是一个由启动代码调用的函数,它会对你的程序产生影响) 。但是,堆栈溢出攻击并不是唯一可以使用的攻击,因此它不是灵丹妙药。但这是有限的成本保护。

保护不依赖于系统本身;它取决于您使用的编译器的版本,但这就是全部。

答案 2 :(得分:1)

堆栈保护程序是由编译器生成的代码,放入程序中。它不是程序调用的外部程序或系统调用。

答案 3 :(得分:1)

与默认编译器设置匹配的选项有用的时间包括:

  • 当您使用的构建系统可能具有要调整的复杂配置时。它可能会让您轻松传入其他选项,而不是确定迷宫中的哪个位置可能会选择使用fstack-protector(例如),这些选项可以简单地添加到选项列表的末尾。如果GCC在选项集中同时看到fstack-protectorfno-stack-protector,则命令行中的最后一个是生效的。

  • 另一次这种事情可能很方便(但似乎并不适用于-fstack-protector),当你有一个选项打开一堆'子选项'时。例如,设置-O2会启用大量-fxxx优化选项,您可能希望大部分时间使用-O2,但不希望GCC严格别名优化。因此,您可以指定-fno-strict-aliasing将该特定选项设置回其默认设置。 (注意:这种情况实际上与上述情况相同)

答案 4 :(得分:0)

可能要关闭此功能的原因有三个,

  • 您正在构建一个共享库,这可能很重要,而其他功能则对堆栈进行了假设。
  • 您担心性能。
  • 您要构建易受攻击的软件。这在Capture The Flag(CTF)之类的情况下经常发生,例如,如果您要构建Protostar来演示利用本来也不会受到攻击的漏洞。
相关问题