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