Canary保护
Canary Canary(金丝雀) 保护原理 Canary 的意思是金丝雀,来源于英国矿井工人用来探查井下气体是否有毒的金丝雀笼子。工人们每次下井都会带上一只金丝雀。如果井下的气体有毒,金丝雀由于对毒性敏感就会停止鸣叫甚至死亡,从而使工人们得到预警。 Canary保护的原理是在栈上 rbp 附近放置一个随机数,等到函数执行结束,就会 检测 该位置存放的随机数是否被改动(覆盖),如果是说明发生了栈溢出,可能导致rbp,ret address 被修改导致异常行为,会中止程序的运行。 High Address | | +-----------------+ | args | +-----------------+ | return address | +-----------------+ rbp => | old ebp | +-----------------+ rbp-8 => | canary value | +-----------------+ | local variables | Low Address | | 具体细节 如何开启/关闭canary保护: gcc -o test test.c // 默认情况下,不开启Canary保护 gcc -fno-stack-protector -o test test.c //禁用栈保护 gcc -fstack-protector -o test test.c //启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码 gcc -fstack-protector-all -o test test.c //启用堆栈保护,为所有函数插入保护代码 -fno-stack-protector /-fstack-protector / -fstack-protector-all (关闭 / 开启 / 全开启) 编译一个例子来看看: ...