分类: C/C++
2009-04-26 22:11:39
gets函数的漏洞
gets函数和fgets函数最大的不同是gets函数的缓冲区虽然由用户提供,但是用户无法指定其一次最多读入多少字节的内容。这一点导致gets变成了一个非常危险的函数。
下例演示了gets函数的危险性。该程序定义了一个缓冲区,但是使用gets函数接收用户输入的字符串时却会出现问题。
(1)在vi编辑器中编辑该程序如下:
程序清单21-5 risk.c 利用gets函数的漏洞进行缓冲区攻击
#include int main(void) while(gets(buf) != buf){ /* 从屏幕读入一行字符串 */ |
$gcc risk.c -o risk |
$./risk |
到目前为止都没有出现问题,事实上,在命令行终端的情况下不会出现问题。因为shell终端的输入缓冲区只有1024个字节,也就是说我们的攻击实际上被shell挡住了。
(4)这个时候换一种方式,先结束该程序。
$^c |
$./risk < big_file.txt |
段错误出现了,程序崩溃了。原因就是输入的字符过多,造成了gets函数的缓冲区越界。
注意:由此可见,gets函数确实是一个非常不安全的函数,所以笔者不推荐读者使用该函数。