所谓缓冲区溢出就是程序中所给出的变量内容没能适应已分配的存储空间,假如一个程序设计人员把一个100字节的数据存入到一个只分配有50字节的存储空间的缓冲区中,虽然说这样是合法的,但是这种操作很可能导致程序崩溃,这也就是常被人称为的缓冲区溢出,但是由于一那些多出的50个字节数据会溢出在存储空间之外,从而会重写已分配的存储空间后面的数据,但如果被重写的数据是很重要且关键的数据,那么就会导致程序崩溃.下面给大家看一段代码,演示的是缓冲区溢出的例子:

//buffer_overflow.c 程序代码,[Linux x86,Win32,AIX PowerPC,Solaris SPARC,HP-UX PA平台下已通过编译]

void buffer_over(char *str)
{
  char buffer[20];
  strcpy(buffer,str);   //将main函数中传来的形参(Str)数据写入到一个只有20字节的存储空间(buffer)中.
}

int main()
{
  char max_str[128];
  int i;
  for(i=0;i<128;i++)   //循环128次,大于就跳出.
  {
    max_str='S';   //往max_str存储空间中写入S,共写入128次.
  }
  buffer_over(max_str);   //将max_str存储空间中的数据传给子buffer_over函数.
  exit(0);
}

  从上面的代码中定义有一个名称为buffer_over()的函数,这个函数接收一个从main中传来的字符串指针str,然后将str存储单元中的数据内容写入到一个局部变量buffer中去,程序中给buffer变量只分配了20个字节的缓冲区.而程序中main()函数中的变量max_str则分配了一个128个字节的缓冲区,且程序中用了for循环给max_str缓冲区中全部写入了数据'S'.然后,调用子函数buffer_over(),并将这个存有128个字节的缓冲区指针当作buffer_over()的传递参数.这样一运行就可能出问题了,因为buffer_over()子函数就会尽力的将这128个字节的缓冲区数据写入到只给分配了仅20个字节的buffer缓冲区中,但是剩余的108个字节数据存放在已分配的存储空间之外的缓冲区中.
  下面看Linux x86下编译后出现的结果:
  [root@root home]#gcc -o buffer_overflow buffer_overflow.c   //编译buffer_overflow.c 程序文件
  [root@root home]#chmod 777 buffer_overflow   //让buffer_overflow有可执行权限(有些版本的LINUX可以不用)
  [root@root home]#./buffer_overflow
  segmentation fault           //看到没程序报出错误.
  [root@root home]#
  程序由于溢出而崩溃了,但是这种错误对于程序员来说是很常见的错误,并且也可以相当容易的解决掉,只要程序员知道自已编写的程序在已后的用户输入的数据有多大.但是通常程序员都期望着用户输入的总是一定的长度数据,并让这个长度做他的指导.但是由于***潜心尽力的去研究那些程序员没有考虑到的问题和错误,因此就算有一个正常运行了多年的程序也会让一个***所输入的成千上万的字符写入到一个只有几十个字节的缓冲区域中,比如像用户名,密码,验让编码等字段缓冲区域.因而导致程序突然崩溃.
  因此***可以通过缓冲区溢出来使程序崩溃,从而得到系统中的各种权限.其实只要去检查那些真正被重写的数据就可以找到出路了.