0x00 print() 是C编程中经常用来输出字符串的函数,其调用方式为:printf([格式化字符串],参数),如:
但若写成:
当第一个参数可以被调用者控制时,便会产生格式化字符串漏洞。
0x01 漏洞原理(以print为例):以print(s)的形式调用print时,printf函数并不知道参数个数,它的内部有个指针,用来索检格式化字符串。对于特定类型%,就去栈中取相应参数的值。
格式化参数
%d 值 十进制整数
%u 值 无符号十进制整数
%x 值 十六进制整数
%s 指针 字符串
%n 指针 到目前位置为止,已输出的字节个数