1. Stack Canaries的工作原理
想象一下你家的防盗门装了一个特殊的报警器。如果有人试图撬锁,报警器会立即响起。Stack Canaries在计算机安全领域扮演着类似的角色,它是栈溢出攻击的第一道防线。
这个技术的名字来源于煤矿中的金丝雀——矿工们带着金丝雀下井,如果金丝雀突然死亡,就说明矿井中有毒气泄漏。在计算机系统中,Stack Canaries就是这只"金丝雀",当它被破坏时,系统就知道发生了栈溢出攻击。
具体来说,Stack Canaries是一个随机生成的数值,被放置在函数栈帧中返回地址之前的位置。由于栈溢出攻击通常需要覆盖返回地址来控制程序执行流程,攻击者必须先覆盖这个Canary值。在函数返回前,系统会检查这个值是否被修改。如果发现值被篡改,程序会立即终止并报错,防止攻击者利用栈溢出漏洞。
2. Stack Canaries的类型与实现
2.1 Terminator Canaries
这类Canaries特别针对字符串操作引发的栈溢出。它们通常包含像NULL(0x00)、CR(0x0d)、LF(0x0a)和EOF(0xff)这样的终止字符。因为这些字符会截断大多数字符串操作,所以攻击者很难通过字符串操作来覆盖Canary而不触发终止。
我在实际项目中遇到过这样的情况:一个使用strcpy()函数的漏洞,攻击者试图通过长字符串覆盖返回地址。由于使用了Terminator Canaries,攻击字符串在遇到0x00字符时就被截断了,攻击因此失败。
2.2 Random Canaries
这类Canaries在程序启动时随机生成,通常来自/dev/urandom或时间哈希。随机性使得攻击者难以猜测正确的Canary值。不过,如果攻击者能够读取内存,还是有可能获取到这个值。
在Linux系统中,Random Canaries通常存储在Thread Local Storage(TLS)中,通过fs寄存器(32位系统是gs寄存器)访问。具体来说,在x86-64架构中,Canary值存储在fs:0x28的位置。


413

被折叠的 条评论
为什么被折叠?



