如何enable/disable金丝雀?

How to enable/disable canary?

How to turn off gcc compiler optimization to enable buffer overflow

我看到像 gcc vuln.c -o vuln_disable_canary -fno-stack-protector 这样的命令据说可以禁用金丝雀。

我尝试了以下示例,vanilla gcc 命令生成了一个没有 canary 的文件。

有人知道如何 disable/enable 金丝雀吗?

$ cat helloworld.c
#include <stdio.h>
int main() {
    puts("Hello World!");
}
$ gcc helloworld.c
$ gcc helloworld.c -o no_canary.out -fno-stack-protector
$ rabin2 -I a.out | grep canary
canary   false
$ rabin2 -I no_canary.out | grep canary
canary   false

顺便说一句,金丝雀这个名字是什么意思?

所以,显然它在您的平台上默认是禁用的;当 gcc 从源代码构建时,此行为是可配置的,这就是您的 OS 或打包程序选择做的事情。使用 -fstack-protector 启用它(如果您的平台完全支持它)。

有关 gcc 的堆栈金丝雀系统如何工作的更多信息,请参阅 Stack smashing detected

在普通英语中,canary 是一种用于检测矿井中有毒气体的鸟类。鸟类对这些气体比人类更敏感,因此如果鸟类死亡,这可能会提醒矿工注意危险,同时他们还有时间撤离。类比是堆栈上的值就像金丝雀:如果它“死亡”(被覆盖),那么程序可以在漏洞利用发生之前“撤离”(中止)。