来看一个程序:
#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 isfree 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);
浙江温州皮鞋湿,下雨进水不会胖!

技术
©2019-2020 Toolsou All rights reserved,
mybatis-config.xml设置默认值配置keras从dataframe中读取数据并进行数据增强进行训练(分类+分割)Python实现switch方法Keras训练数据加载实现小结Map---Java判断Map中是否包含某个key【JAVA】【华为校园招聘笔试-软件】2020-09-09华为Mate 40 Pro+ 5G曝光:徕卡电影镜头、陶瓷机身ajax get请求中文参数乱码解决华为鸿蒙操作系统有哪些特点和优势?余承东《全场景时代 新体验与新生态》演讲全文判断当前对象是不是数组的4种方式