#说明:
一般情况下,在程序中使用了缓冲区,但又没有做安全的判断时
就可能会被覆盖缓冲区的方式来进行溢出攻击,比如最常用的就是返回值覆盖
返回值一旦被覆盖,代码接下来的运行轨迹就会被更改到恶意代码块了。
#栈缓冲区溢出攻击演示:
ESP
-4 字符串A < 缓冲区= 4 bytes >
+0 返回值
+4 1
+8 0
因为此时开发者只需要字符串A的大小为4
char str[4] ;
strcpy(str,arg_str);
这种时候攻击者就会精心的构造一个新的字符串传入(arg_str)
长度为8,后4位则为一个代码块入口地址
目的就是覆盖掉ESP+0处的返回值,让函数返回时能够跳转到一个新的地址中去执行
#解决方案:
严格的控制变量的长度,比如上面的例子完全可以使用strcpyn来给定长度。
返回值覆盖只是攻击方式的一种,从设计源头保持严谨的代码才能不给攻击者可乘之机。