当心你的终端输入缓冲区里遗留的炸弹!

来看一个程序:

#include <stdio.h>

int main (int argc, char **argv)
{
	char buf[1];

	//syscall(0, 0, buffer, 1);
	read(0, buf, sizeof(buf));
	printf("buf is: %s\n", buf);
	return 0;
}

我这里不谈什么缓冲区溢出,也和各种漏洞无关,我这里说的仅仅是一个操作习惯,或者说编程习惯问题。

问题,输入abc会发生什么?

看看答案:

[root@localhost ]# ./a.out
abc
buf is: a
[root@localhost ]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
^C
(interrupt) Exiting bc.

Why??

很简单,因为前台bash进程在exec了a.out之后,就把终端/dev/pts/0(或者别的)给了a.out,read(0,就是读取的这个终端的数据:

  • bash和a.out是共用/dev/pts/0的!

然而a.out仅仅读取1个字符,剩下的bc就会留在/dev/pts/0的输入缓冲区了,当你输入abc时,缓冲区里有3个字符,当回车按下后,输入缓冲区里有4个字符:‘a’,‘b’,‘c’,’\CR’,发生了下面的事情:

  • a.out读取1个字符a,并且在打印后退出。
  • bash发现缓冲区里还有3个字符:‘b’,‘c’,’\CR’。
  • bash执行bc命令。

万一你输入的是:arm -rf /呢…

所以,在程序的最后,别忘了清空你的输入缓冲区:

int c
while ((c = getchar()) != '\n' && c != EOF);

浙江温州皮鞋湿,下雨进水不会胖!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值