免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1180 | 回复: 0
打印 上一主题 下一主题

gets()函数is dangerous [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-29 21:13 |只看该作者 |倒序浏览

gets函数的危险性
gets函数和fgets函数最大的不同是gets函数的缓冲区虽然由用户提供,但是用户无法指定其一次最多读入多少字节的内容。这一点导致gets变成了一个非常危险的函数。
下例演示了gets函数的危险性。该程序定义了一个缓冲区,但是使用gets函数接收用户输入的字符串时却会出现问题。
(1)在vi编辑器中编辑该程序如下:
程序清单21-5 risk.c 利用gets函数的漏洞进行缓冲区攻击
#include stdio.h>int main(void)
{
/* 这个缓冲区已经很大了,如果用户输入是在命令行方式下的话,该缓冲的空间是足够的 */
     char buf[2048];
     while(gets(buf) != buf)
        {
          /* 从屏幕读入一行字符串 */
          printf("%s\n", buf);
          /* 并且将该字符串显示输出到屏幕上 */
        }
          return 0;
}
(2)在shell中编译该程序如下: $gcc risk.c -o risk
(3)在shell中运行该程序如下: $./riskhello world (输入)hello world (输出)welcome to the real world, it sucks, but you will love it(输入)welcome to the real world, it sucks, but you will love it(输出)
   到目前为止都没有出现问题,事实上,在命令行终端的情况下不会出现问题。因为shell终端的输入缓冲区只有1024个字节,也就是说我们的攻击实际上被shell挡住了。
(4)这个时候换一种方式,先结束该程序。
$^c
(5)将一个非常大的文件从定向到标准输入上。
$./risk  big_file.txt
Segmentation fault
   段错误出现了,程序崩溃了。原因就是输入的字符过多,造成了gets函数的缓冲区越界。
   注意:由此可见,gets函数确实是一个非常不安全的函数,所以笔者不推荐读者使用该函数。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/94145/showart_1981084.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP