1999年6月发现并公开的
2000年下半年发现了大量软件受到影响,震惊了安全界
格式化字符串相关函数
fprintf
printf
sprintf
snprintf
vfprintf
vprintf
vsprintf
vsnprintf
setproctitile
syslog
格式化字符串常见语法
%d
%u
%s
%x
%p
控制打印宽度
%<正整数>c
打印宽度为n的字符串
关于%n,%hn,%hhn
%n将当前已打印的个数(4字节)写入参数
%hn写入2字节
%hhn 写入1字节
关于$符号
%<正整数n>$<fmt>
printf("0x%2$x:0x%1$x\n",0xddeadbeef,0xcafebabe);
打印结果:
0xcafebabe:0xddeadbeef
参数不足的情况
如果printf参数不足,会发生什么
会假设这些参数的存在,在对应的寄存器上找到这些参数,并做相应的处理
可以用于泄露栈上的数据
可用于泄露栈上的数据
%d 打印signed int
%u 打印unsigned int
%p 打印指针,极void *
%x 打印hex指针,即void *
用于任意内存泄露
%s 打印参数地址处的字符串
对于不同字长的系统
32位:函数调用时参数在栈,格式化字符可控可以泄露栈上的数据
64位:函数调用使用寄存器+栈:格式化字符可控可以泄露特定寄存器和栈上的值