格式化字符串漏洞
漏洞成因
对于正常且安全的使用printf函数是这样操作的
#include <stdio.h>
int main(void)
{
int n=5;
printf("%d",n);
return 0;
}
但是偏偏有些懒人喜欢偷懒 少打两个字写成这样子
#include <stdio.h>
int main(void)
{
char a[]="qwerdf";
printf(a);
return 0;
}
对于printf函数来说 它的函数原型是
printf(“格式化字符串”,参量1,参量2…)
如果输出成功返回输出的字数 如果输出失败则返回负数
格式化字符串 可以是以’%'开头的后跟特定字符来确定输出样式的 也可以是正常的字符串
但是由于函数调用的关系 实参和形参结合的顺序是从左向右结合的 所以函数这样写也是可以正常输出的
以上代码 本身没有什么问题 但是如果用户可以控制输入的话 就会造成一些意想不到的结果
#include <stdio.h>
int main(void)
{
char a[100];
scanf("%s",a);
printf(a);
return 0;
}