-fno-stack-protector有什么用?

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

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

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

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

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

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

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

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

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

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

有三个原因你可能想要关闭它,

  • 您正在构建一个共享库,这可能很重要,其他函数可以对堆栈进行假设。
  • 你关心的是表现。
  • 您想构建易受攻击的软件。 这种情况经常发生在Capture The Flag(CTF)之类的情况下,如果您想构建Protostar来演示一个您不会容易受到攻击的漏洞。