printf(\"%s %s %s\
printf的linux实现:static int printf(const char *fmt, ...){ va_list args; int i;\t va_start(args, fmt); write(1,printbuf,i=vsprintf(printbuf, fmt, args)); va_end(args); return i;}
展开vsprintf会发现这么一句话: case \u0026#39;s\u0026#39;: s = va_arg(args, char *); //...
展开va_arg宏:#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)\u0026amp;~(sizeof(int) - 1) )#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
事实证明输出应该是不确定的。至于那些多打出来的数据参考这个链接:格式化字符串漏
■网友
你可以去查一查“C语言格式化字符串漏洞”恭喜你,你事实上独立发现了这个漏洞当然,如果要进一步的应用,还需要对栈上的数据you更多的了解
■网友
c语言就是这样,自由+危险,该三个你写两个,结果就是不管了,什么都有可能,printf这种参数个数不定的函数,都是通过把参数放在内存的连续的地方来确定参数的,三个%s对应后面三个char*,-----1-----2-----(3)找到第一个第二个,也会一样的在后面找到第三个,只不过这里的东西不是实参传过来的,程序不管这里存的是什么,反正它就认定了这里存的是第三个char*,然后根据这个char*找到第三个字符串,并输出,但这第三个字符串程序没有提供,char*指向哪里也是未知的,这里有什么也是未知的,只会一个一个字节视为char输出,直到遇到0,---------------------------------------每次都一样可能是程序关闭时释放了所有空间,再打开时又申请回来,所有变量包括第三个字符串在内存中的位置都没变,输出也就一样了,可以试试重启,或者过很久再运行试试,应该会有变化……
■网友
错误的代码,完全无法预期的结果。
■网友
腾讯模拟笔试题……我选的是输出 hello world。还是匿了。
■网友
这是腾讯的一个面试题?
■网友
伪码农,初学者,认为貌似是语法糖导致每次输出结果都一样……
推荐阅读
- linux 应用层可以使用DMA进行数据传输吗
- 为啥C语言没有直接支持二进制数
- 目前整个嵌入式linux行业的发展前景咋样
- 有逼格高的XX卫士吗?
- 嵌入式linux通过无线网卡ping后怎样进行无线数据传送有基于嵌入式linux应用程序吗谢谢
- 应届生学完python之后,继续学Java还是学linux运维,或者说做python项目
- 翻译一些英语的技术类杂志的时候,文章的结尾有杂志的简写。请问这个简写还翻译吗比如说LinuxFormat 这份杂志的文章结尾是LXF。
- 在Linux网络协议栈中,IP选项功能是一个可选加载模块,类似于make install
- 怎样从小白到kali入门
- 在ic公司,做数字机顶盒音频视频sdk软件中间件开发,嵌入式Linux平台,想往互联网公司发展。?