关于c语言printf 与scanf问题 漏洞

今天心血来潮,想研究漏洞。代码如下
char p[125] = { 0 };
scanf("%s", p);
printf("%s", p);
然后我在dos窗口下输入hello",

最后printf完全输出,比没有没错误,这让我很奇怪,不符合逻辑,我很怀疑在scanf输入的时候函数自动给 " 加转义字符 \ 。可是我用 代码如下
char p[125] = { 0 };
scanf("%s", p);
int i = 0;
while (1)
{
if(p[i]==NULL)
{
break;
}

printf("%c\n", p[i]);
i++;
}
printf("%s", p);
测试他有没有转义字符,结果没有,实在让我感到好奇。不知道是编译器的智能,还是我不了解,printf源码结构.请高手求教。
本人想如何利用 "(双引号) 让printf有漏洞

这个是可以实现的,这样就行。#include#include#include#includeintmain(){intn;printf("请输入数字:【】\b\b");scanf("%d",&n);}\b是退格符号。因为“【】”是中文符号,所以占得字节数与英文字符不一样。你自己可以调一下格式。而且这儿还有一个关键的问题,就是当“【】”内的内容够长时,就会把后面的括号“】”覆盖掉。你可以自己试一下
温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-06-12
你当然看不到作为转义字符的 '\' ,假设:
char c = '\"'; 你不能指望它会输出两个字符

举个 ' " ' 的例子吧,为什么它需要转义? 因为在编程时,它代表某种语法规则,比如字符串需要用双引号括上。当不需要这种规则时,使用转义字符来取消。

总而言之,转义字符是在赋值时生效的,当它已经是值时,它就是它。

在DOS窗口中,并不存在C的某种语法规则吧?你输入什么就是什么,所以转义字符也就没有用武之地了。本回答被提问者和网友采纳
第2个回答  2016-06-12
'\0'的ASCII就是0,开始时,char p[125] = { 0 };就是把数组p的所有元素都置为0,因为p是char型数组,而ASCII的0就是字符'\0',scanf("%s", p);后,后面的元素是0,即'\0',所以输出正常,因为遇到第一个'\0'停止。追问

我的意思是想看到\"这样的转义字符,而不是停不停止的问题

追答

"是一个字符,有唯一的ASCII码,ASCII码是34,字符在内存里面的表示方式是ASCII码,不会表示成转义符,输入的时候也可以直接输入",不需要用转义字符,只是在类似printf("abc\"");的语句中如果要打印"才用到转义字符,因为如果不用的话,编译器认为"与前面的"配对,导致字符串结束。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网