当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > 缓冲区溢出指的是什么

缓冲区溢出指的是什么 时间:2018-12-28      来源:华清远见

缓冲区溢出,是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁著中断之际并获取程序乃至系统的控制权。

计算机程序一般都会使用到一些内存,这些内存或是程序内部使用,或是存放用户的输入数据,这样的内存一般称作缓冲区。溢出是指盛放的东西超出容器容量而溢出来了,在计算机程序中,就是数据使用到了被分配内存空间之外的内存空间。而缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。

在计算机安全领域,缓冲区溢出就好比给自己的程序开了个后门,这种安全隐患是致命的。缓冲区溢出在各种操作系统、应用软件中广泛存在。而利用缓冲区溢出漏洞实施的攻击就是缓冲区溢出攻击。缓冲区溢出攻击,可以导致程序运行失败、系统关机、重新启动,或者执行攻击者的指令,比如非法提升权限。通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。

下面通过一个示例来详细看看什么是缓冲区溢出。程序的缓冲区就像一个个格子,每个格子中存放不同的东西,有的是命令,有的是数据,当程序需要接收用户数据,程序预先为之分配了4个格子(下图中黄色的1~4号格子)。按照程序设计,就是要求用户输入的数据不超过4个。而用户在输入数据时,假设输入了17数据,而且程序也没有对用户输入数据的多少进行检查,就往预先分配的格子中存放,这样不仅4个分配的格子被使用了,其后相邻的13个格子中的内容都被新数据覆盖了。这样原来13个格子中的内容就丢失了。这时就出现了缓冲区(1~4号格子)溢出了。

缓冲区溢出

如下代码的问题就出在strcpy(buf, s)这条语句上,它将s拷贝到buf中,而没有对s的长度进行限制,这就给缓冲区溢出攻击提供了可乘之计。

#include 

#include 

void vulFunc(char* s)

{

    char buf[10];

    strcpy(buf, s);

    printf("String=%s\n", buf);

}

 

main(int argc, char* argv[])

{

     if(argc == 2)

     {   

           vulFunc(argv[1]);

     }

   else

   {

      printf("Usage: %s \n", argv[0]);

   }

}

缓冲区溢出一般是由于一下原因导致:

1.字符串处理函数没有指定长度,单单凭借结尾字符是不是'\0'来判断结束。

2.被处理的字符超过缓冲区可接受的大小。例如,从屏幕输入字符串:gets(buff),但是buff的内存少于屏幕一行字符个数,就会导致溢出,应该使用fgets。

3.所有格式化字符串的函数:fprintf("%n",&num_write)。

避免的办法:

1.不要把用户的输入作为参数传到格式化字符串处理函数中,例如,printf("%s", argv[1])。

2.字符串处理避免使用strcpy,strcat,sprintf,gets。应该使用strncpy,strncat,snprintf。strlcpy和strlcat都是NULL结尾。尽量使用std::string,MFC::CString

3.使用C++ I/O函数

4.使用安全的C Runtime Time函数

5.检查文件路径的长度,不要超过系统允许的最大值。

上一篇:什么是字符串数组

下一篇:ARM工程师是做什么的?需要掌握什么技能?

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2018 北京华清远见科技发展有限公司 版权所有 ,京ICP备16055225号,京公海网安备11010802025203号