缓冲区溢出
一、定义
缓冲区溢出(buffer overflow),是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁著中断之际并获取程序乃至系统的控制权。
二、原理
程序的缓冲区就像一个个格子。当程序需要接收用户数据,程序预先为之分配了若干个格子。用户在输入数据时,假设输入了更多数据,而且程序也没有对用户输入数据的多少进行检查,就往预先分配的格子中存放,这样不仅分配的格子被使用了,其后相邻的格子中的内容都被新数据覆盖了。这样原来后续格子中的内容就丢失了。
三、实践
C语言编程中,一些不作边界检查的字符串拷贝函数(如strcpy)容易造成缓冲区溢出。
后续编程以strcpy()函数为核心,代码如下:
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
int apple;
char buf[9];
strcpy(buf,"11111111111111111111111111111111111111111");
if (apple == 0x64636261)
{
printf("hello world!");
}
getchar();
return 0;
}
使用Microsoft Visual C++编译运行后出现报错
原因是buf数组输入了过长数据。
查看缓冲区发现缓冲区溢出,冲去原有EIP、EBP,导致后续运行失败,未能打印结果。
四、防范措施
在进行程序设计时,为了防范缓冲区溢出攻击,可以采用哪些方法?
1、通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码;
2、强制写正确的代码的方法;
3、利用编译器的边界检查来实现缓冲区的保护,使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁。