缓冲区溢出的入门介绍 – 作者:凯信特安全团队

缓冲区溢出漏洞概念:在计算机程序中,就是数据使用到了被分配内存空间之外的内存空间。而缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据,缓冲区溢出是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序的堆栈,使程序转而执行其他指令,以达到攻击的目的。

缓冲区溢出漏洞产生原理:

官话有点多,下面简单介绍一下缓冲区溢出漏洞是如何发生的。

以下是对C语言中缓冲区溢出漏洞的理解,因为C语言中并没有对数组和指针的引用进行检查,所以在平时的程序运行时缓冲区溢出漏洞更容易出现。

例子:

#include<stdio.h>

void main()

{

    chara [10];

   gets(a);

}

这个程序中若输入的字符数不超过10个,像helloworld,则运行正常,若输入的是helloworld则程序发生溢出。因为程序只申请了10个字符,而输入的字符超过了这个数目,这时,多余的字符将会占用不属于自己的内存空间。由于C语言并不会进行边界检查,所以程序看似运行正常。如果被占用的内存本来就是空的,或者不重要。那么程序也会正常运行,如果是重要的信息,将会造成严重后果。

在实际的运行过程中缓冲区溢出又分为堆溢出和栈溢出。

堆溢出:堆溢出的原理是覆盖其他重要的数据以达到目的。但是实现比较困难:首先要确定那个变量是重要的变量,其次要知道比目标变量低的溢出点的内存位置,最后重要的变量被覆盖后程序还能继续运行下去。

栈溢出:栈溢出的原理是覆盖函数的返回地。函数调用过程中,函数的返回地址保存在栈里面。所以栈溢出的思路就是把栈里面的返回地址覆盖,然后替换成攻击者想要的地址。因为栈是往下增加的,先进入栈的地址反而要大,这种机制更方便的提供了漏洞产生的可能性。

缓冲区溢出的危害:缓冲区溢出攻击,可以导致程序运行失败、系统关机、重新启动,或者执行攻击者的指令,比如非法提升权限。

缓冲区漏洞对应函数:C/C++语言中像strcpy函数还有strcat()、sprintf()、vsprintf()、gets()、scanf() 以及在循环内的getc()、fgetc()、getchar()等这些常见的函数都会造成缓冲区溢出漏洞。

来源:freebuf.com 2019-02-21 13:47:23 by: 凯信特安全团队

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论