Canary保护概述
- 在函数调用发生时,向栈帧内压入一个额外的随机DWORD,这个随机数被称为“Canary”
- 如果使用IDA反汇编的话,您可能会看到IDA会将这个随机数标注为“Security Cookie”,在部分书籍的叙述中会用Security Cookie来引用这种随机数
- Canary位于EBP之前,系统还将在内存区域中存放一个Canary的副本
- 当栈中发生溢出时,Canary将被首先淹没,之后才是EBP和返回地址
- 在函数返回之前,系统将执行一个额外的安全验证操作,被称作“Security check”
- 在Security check过程中,系统将比较栈帧中原先存放的Canary和在内存中的副本,如果两者不符合,说明栈帧中的Canary已被破坏,即栈中发生了溢出
- 当检测到栈中发生了溢出时,系统将进入异常处理流程,函数不会被正常返回,ret指令也不会被执行
以下面的源码为例子,来学习Canary
#include<stdio.h>
int main()
{
char *name = "prettyX";
printf("My name is %s",name);
return 0;
}
0x01 分析未开启Canary保护的程序
以下面选项进行编译
gcc -no-pie -fno-stack-protector -m32 -o canary canar