内存越界引用和缓存区溢出
void echo()
{
char buf[8];
gets(buf);
puts(buf);
}
栈区如上图所示,echo会在栈顶区域分配8字节大小给buf,当输入的字节数量0-7时,不会对栈造成破坏,当输入9-23字节时,由于是空区域,所以也不会造成破坏,但是当输入>24字节时,会修改返回地址数据,对整个栈区造成破坏。
对抗缓冲区溢出攻击
-
栈随机化
程序每次运行,就栈的地址都采用随机化处理。
-
栈破坏检测(金丝雀)
其思想是在栈帧中任何局部缓冲区与栈状态之间存储一个特殊的金丝雀值,也成为哨兵值,是在程序每次运行时随机产生的。在恢复寄存器状态和从函数返回之前,程序检查这个金丝雀值是否被改变,如果是,那么程序异常中止。这个金丝雀的值是在程序运行时从内存中读入存在栈中,比较的时候就将栈中的值与内存的值做XOR运算。