问答题 什么是缓冲区溢出
【正确答案】
【答案解析】缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。缓冲区溢出是指当向缓冲区内填充数据位数超过了缓冲区自身的容量限制时,发生的溢出的数据覆盖在合法数据(数据、下一条指令的指针、函数返回地址等)上的情况。最好的情况是程序不允许输入超过缓冲区长度的字符并检查数据长度,由于大多数程序都会假设数据长度总是与所分配的储存空间相当,进而存在缓冲区溢出安全隐患。
程序示例如下:
#include<unistd.h>
void Test()
{
char buff[4];
printf("Some input:");
gets(buff);
puts(buff);
}
int main(int argc, char *argv[])
{
Test();
return 0;
}
该程序的Test()函数中使用了标准的C语言输入函数gets(),由于它没有执行边界检查,最终会导致Test()函数存在缓冲区溢出安全漏洞。Test()函数的缓冲区最多只能容纳3个字符和一个空字符,所以超过4个字符就会造成缓冲区溢出。该程序的堆栈说明如图1所示。buff[4]被存储在Test()函数的栈帧里。

图1 堆栈说明

如果输入3个字符“AAA,buffer[4]正好被3个字符和NULL填充。输入3个字符后的堆栈说明如图2所示。

图2 输入3个字符后的堆栈说明

如果输入5个字符“AAAAA”,%ebp的一些区域的内容将被覆盖,造成缓冲区溢出。输入5个字符后的堆栈说明如图3所示。