缓冲区的溢出是我们经常遇到的一种错误情况,同时也是我们万万不能忽略的一种情况,因为它给程序乃至系统安全带来了很大的安全隐患。先给大家展示一段有安全隐患的代码:
#include "stdafx.h"
#include"stdlib.h"
void test();
void main(){
test();
system("pause");
}
void test(){
char buf[4];
printf("input:");
gets(buf);
puts(buf);
}
缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据。缓冲区溢出是指当向缓冲区内填充数据位数超过了缓冲区自身的容量限制时,发生的溢出的数据覆盖在合法数据(数据、下一条指令的指针、函数返回地址等)的情况。最好的情况是程序不允许输入超过缓冲区长度的字符并检查数据长度,但由于大多数程序都会假设数据长度总是与所分配的存储空间相当,进而存在缓冲区安全隐患。
现在我们回过来看上面所给的代码,由于test()函数没有执行边界检查,最终会导致test()函数存在缓冲区溢出安全漏洞。test()函数的缓冲区最多只能容纳3个字符和一个空字符'\0',所以当输入字符超过4个的时候就会造成缓冲区溢出。该程序的堆栈说明如图(1)所示,buf[4]被存储在test()函数的栈帧里。