百度一下 藏锋者 就能快速找到本站! 每日资讯归档 下载藏锋者到桌面一键访问

当前位置:主页 > 网络安全 > 缓冲区溢出原理(BufferOverflow)和示例代码

缓冲区溢出原理(BufferOverflow)和示例代码

所在栏目:网络安全 时间:05-09 08:27 分享:

缓冲区溢出,指通过向程序的缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其他指令,以达到控制系统,实施攻击的目的。据统计,通过缓冲区溢出进行的攻击占所有攻击总数的80%以上。

造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面的程序:

Example1:voidfunction(charstr){charbuffer[16];strcpy(buffer,str);}

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

当然,随便往缓冲区中填东西造成它溢出一般只会出现“Segmentationfault”错误,而不能达到控制系统,实施攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其他命令。

那么,如何制造缓冲区溢出呢?一个程序在内存中通常分为程序段、数据段、堆栈三部分。程序段中存放程序代码和静态局部变量,数据段中存放全局变量,而动态数据则存放在堆栈中,用来保留函数的调用现场、函数返回值、auto变量等。

当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器(IP)中的内容作为返回地址(RET);第三个压入堆栈中的是基址寄存器(FP);然后把当前的栈指针(SP)拷贝到FP,作为新的基地址;最后为本地变量留出一定空间,把SP减去适当的数值。

Example2:voidfunction(charstr){charbuffer[16];strcpy(buffer,str);}voidmain(){charlarge string[256];inti;for(i=0;i<256;i++)large string[i]=‘A’;function(large-string);}

当调用函数function()时,堆栈如图9—1所示:←低端内存高端内存栈顶buffer sfp ret str 栈底图9—1 缓冲区溢出(BufferOverflow)毫无疑问,程序的执行结果是“Segmentfault(coredumped)”或者类似的出错信息。因为从buffer开始的256个字节,包括栈基址寄存器SFP,返回地址RET,甚至参数str的空间都将被str指向的内容‘A’覆盖。‘A’的16进制值为0x41,所以函数的返回地址变成了0x41414141,这超出了程序的地址空间,所以出现段错误,在Windows98下使用TC2.0编译运行显示的结果为:非法操作,中止运行。

 如果将上例中的‘A’替换成执行代码(一般为黑客程序)并写入缓冲区,只需覆盖返回地址RET的内容,使它指向缓冲区的开头,就可以达到运行其他指令的目的。

这样的例子在实际中是比较多的。比如,MSSQLServer7远程缓冲溢出漏洞可能执行攻击者任意代码。MSSQLServer扩展存储过程xp dirtree允许所有用户取得指定的驱动器或文件夹下的子目录。但是发现当提供过长的字符串时将会触发缓冲区溢出:

xp dirtree’XXXXXX……’---->many,manyX’s(多个X)xp dirtreeN’XXXXXX……’---->many

manyX’s攻击者可能导致服务器拒绝服务或在受影响系统上执行任意代码。

缓冲区溢出原理(BufferOverflow)和示例代码 免费邮件订阅: 邮件订阅

图片推荐

热点排行榜

CopyRight? 2013 www.cangfengzhe.com All rights reserved