缓冲区溢出攻击

时间:2021-02-08 06:59:07

                缓冲区溢出是指当计算机向缓冲区内填充数据时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。缓冲区溢出中最危险的是堆栈溢出,入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意位置;从而导致程序崩溃,或者跳转并执行一段恶意代码。

                通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:

  void function(char *str) {

  char buffer[16]; strcpy(buffer,str);

  }

  上面的strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在像strcpy这样的问题的标准函数还有strcat()、sprintf()、vsprintf()、gets()、scanf()等。

  当然,随便往缓冲区中填东西造成它溢出一般只会出现分段错误(Segmentationfault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。