缓冲区溢出

一、定义

  缓冲区溢出(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、利用编译器的边界检查来实现缓冲区的保护,使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁。

posted @ 2021-10-31 13:59  20191309刘嘉祺  阅读(523)  评论(0编辑  收藏  举报