我写了一个C语言应用程序,现在我正试图了解在编译时使用-fno-stack-protector
命令的目的是什么。对于我的特定应用程序而言,是否使用此命令并不影响其防护缓冲区溢出。
我在网上看到说-fstack-protector
和-fno-stack-protector
命令分别启用和禁用栈破坏保护器,但如果我自己编译应用程序,那么如何先启用保护器呢?这个命令的使用可能取决于应用程序所运行的系统吗?
我写了一个C语言应用程序,现在我正试图了解在编译时使用-fno-stack-protector
命令的目的是什么。对于我的特定应用程序而言,是否使用此命令并不影响其防护缓冲区溢出。
我在网上看到说-fstack-protector
和-fno-stack-protector
命令分别启用和禁用栈破坏保护器,但如果我自己编译应用程序,那么如何先启用保护器呢?这个命令的使用可能取决于应用程序所运行的系统吗?
在标准/原始的GCC中,默认情况下未启用栈保护器。然而,一些Linux发行版已经打了补丁,使GCC默认开启它。在我看来,这是相当有害的,因为它会破坏编译任何未链接到标准用户空间库的东西的能力,除非Makefile明确禁用栈保护器。它甚至会破坏Linux内核构建过程,但这些发行版添加了额外的Hack来检测正在构建内核并禁用它。
-fstack-protector
进行编译,那么在栈上会分配更多的空间,在函数进入和返回时,代码将设置检查并实际检查是否在函数内部覆盖了栈,因此会产生一些额外的开销。main()
,它是由启动代码调用的函数,所以它将影响您的程序)。但是,堆栈溢出攻击并不是唯一可能使用的攻击,因此它并非万灵药。但是,它是一种成本有限的有用保护。-fstack-protector
还重新排列堆栈布局,以便更容易检测到Smash攻击。 - jww堆栈保护器是由编译器生成并嵌入程序中的代码。它不是被程序调用的外部程序或系统调用。
与默认编译器设置匹配的选项有用的时候包括:
当您使用可能具有复杂配置的构建系统时,您希望进行微调。与其弄清楚在一堆makefile中可能会选择使用fstack-protector
(例如),不如让您轻松地传递附加选项,这些选项只需添加到选项列表的末尾即可。如果GCC在选项集中看到fstack-protector
和fno-stack-protector
,则命令行上最后一个选项将生效。
另一种情况下,这种方法可能很方便(但似乎不适用于-fstack-protector
),就是当您有一个选项可以打开一堆“子选项”时。例如,设置-O2会打开一系列-fxxx
优化选项,您可能大部分时间都想使用-O2
,但不想使用GCC的严格别名优化。因此,您可以指定-fno-strict-aliasing
将该特定选项设置回其默认设置。(注意:此情况实际上等同于上面的情况)
有三个可能需要关闭这个功能的原因:
.o
文件,并将它们用作数据由JIT进行汇编,只需最少的ISA特定知识。也许你不喜欢我的例子,但肯定可以想出其他例子。基本上,在任何使用编译器作为独立实现的情况下,堆栈保护都是错误的(尽管可以通过省略-lssp
并提供自己的__stack_chk_fail
来使其正常工作)。 - R.. GitHub STOP HELPING ICE