关于C#:-fno-stack-protector的用途是什么?

What is the use of -fno-stack-protector?

我已经用C语言编写了一个应用程序,并且试图了解-fno-stack-protector命令在编译时的目的是什么。对于我的特定应用程序,无论是否使用此命令,在防止缓冲区溢出方面都没有区别。

我已经在线阅读了-fstack-protector-fno-stack-protector命令分别启用和禁用堆栈粉碎保护程序,但是如果我自己编译应用程序,那么如何预先启用该保护程序?该命令的用法是否取决于应用程序在哪个系统上运行?


在标准/常规GCC中,堆栈保护器默认情况下处于关闭状态。但是,某些Linux发行版已修补GCC,以默认将其打开。在我看来,这是相当有害的,因为它会破坏编译未与标准用户空间库链接的任何内容的能力,除非Makefile专门禁用了堆栈保护程序。它甚至会破坏Linux内核的构建,除了带有此hack的发行版向GCC添加了额外的hack,以检测到正在构建内核并禁用了它。


如果使用-fstack-protector进行编译,则在代码设置检查后,实际上将检查您是否在在函数中已覆盖堆栈。

这将对您的应用程序有所帮??助。如果启用,它将迅速阻止堆栈溢出攻击。仅当您的代码中没有函数调用时,它才会使程序不受影响(并且由于您通常编写main(),并且该函数由启动代码调用,因此它将对您的程序产生影响)。但是,堆栈溢出攻击不是唯一可以使用的攻击,因此它不是万能药。但这是有用的保护,而且成本有限。

保护本身不依赖于系统;这取决于您使用的编译器的版本,仅此而已。


堆栈保护器是由编译器生成并置于程序中的代码。这不是您的程序调用的外部程序或系统调用。


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

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

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

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

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