printf( )的一点探索
先看一段代码:
#include <stdio.h>
int main(void)
{
char s[10] = "jackpot\n";
printf("%s", s);
printf("%.1s\n", "hello,world" + 1);
printf("%s\n", (char *)0xffffffff);
return 0;
}
printf中,经常用%s来格式化字符串,那么%s的作用是什么呢?
第一个,我们给了s作为参数,即字符串的首地址,结果输出了jackpot
第二个,输出了e,等等,为什么是‘e’?而且我们的参数是“hello,world”+ 1 . 哈哈,对了,输出e是因为我们指定了输出字符串的长度,而且,字符串“hello,world”其实是个地址!!是内存中“hello,world”的首地址,所以我们通过+1可以指向‘e’。
第三个,我们知道printf将指定地址的内容输出,不断输出直到\0为止。还记得字符串以\0结尾吧。所以,当我们输出地址0xffffffff中的内容时,出现了段错误,因为我们非法读取了不可读的段。
以上是printf所具备的一部分特性,%s的作用使得程序可能会遭到格式化字符串攻击。


浙公网安备 33010602011771号