缓冲区溢出攻击的基本原理就是溢出时覆盖了函数返回地址,之后就会去执行攻击者自己的函数;
针对缓冲区溢出时覆盖函数返回地址这一特征,微软在编译程序时使用了安全编译选项-GS;
目前版本的Visual Studio中默认启用了这个编译选项;
GS的工作机制是,
在所有函数调用发生时,向栈帧内压入一个额外的随机DWORD,称为Security Cookie;
Security Cookie位于EBP之前,系统还将在.data的内存区域中存放一个Security Cookie的副本;
当栈中发生溢出时,Security Cookie将被首先淹没,之后才是EBP和返回地址;
在函数返回之前,系统将执行一个额外的安全验证操作,被称做Security check;
这样如果Security Cookie被改变了,就证明受到了缓冲区溢出攻击;
此选项默认开启;VS2015,如下图;
只是了解一下;还不会反汇编跟踪查看到栈帧内的Security Cookie;
如果每个函数调用都进行Security check,对性能还是会有影响;
根据MS的说法,
如果值不同(Security Cookie),则指示可能已覆盖堆栈。 如果检测到不同的值,将终止进程。
如果命令行编译则是加 /GS 选项;
根据MS的说法,
/GS 编译器选项保护以下项:
函数调用的返回地址;
函数的异常处理程序地址;
易受攻击的函数参数;