C 如何启用/禁用金丝雀?

C 如何启用/禁用金丝雀?,c,gcc,compiler-optimization,buffer-overflow,C,Gcc,Compiler Optimization,Buffer Overflow,我看到像gcc vuln.c-o vuln\u disable\u canary-fno stack protector这样的命令被称为禁用canary 我尝试了下面的示例,vanilla gcc命令生成一个没有金丝雀的文件 有人知道如何禁用/启用金丝雀吗 $ cat helloworld.c #include <stdio.h> int main() { puts("Hello World!"); } $ gcc helloworld.c $ gcc h

我看到像gcc vuln.c-o vuln\u disable\u canary-fno stack protector这样的命令被称为禁用canary

我尝试了下面的示例,vanilla gcc命令生成一个没有金丝雀的文件

有人知道如何禁用/启用金丝雀吗

$ 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
$cat helloworld.c
#包括
int main(){
放置(“你好,世界!”);
}
$gcc helloworld.c
$gcc helloworld.c-o no_canary.out-fno堆栈保护器
$rabin2-I a.out |格雷普金丝雀
假金丝雀
$rabin2-我没有金丝雀。我出去了,格雷普金丝雀
假金丝雀

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

显然,在你的平台上,默认情况下它是禁用的;当从源代码构建gcc时,此行为是可配置的,这是您的操作系统或打包程序选择执行的操作。使用
-fstack protector
启用它(如果您的平台支持它)

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


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

put
并不是真正易受攻击的。您可能正在查找
get
。因此,金丝雀值应该被一个不会改变原始值的值覆盖。在这种情况下,不会检测到堆栈损坏?@user15502206:对,如果你想发起成功的攻击,那就是你必须做的。问题是每次运行程序时都会随机选择金丝雀值,因此攻击者通常不知道它是什么。你要么非常幸运,要么找到其他一些泄露金丝雀价值的漏洞。