格式化字符串攻击,pif的%什么意思

printf的%什么意思

格式化字符串攻击,pif的%什么意思

文章插图
格式化字符串 , 是C、C++等程序设计语言printf类函数中用于指定输出参数的格式与相对位置的字符串参数 。其中的转换说明(conversion specification)用于把随后对应的0个或多个函数参数转换为相应的格式输出;格式化字符串中转换说明以外的其它字符原样输出 。
格式化字符串中的占位符用于指明输出的参数值如何格式化 。
格式化占位符(format placeholder) , 语法是:
%[parameter][flags][field width][.precision][length]type
Parameter可以忽略或者是:
n$n是用这个格式说明符(specifier)显示第几个参数;这使得参数可以输出多次 , 使用多个格式说明符 , 以不同的顺序输出 。如果任意一个占位符使用了parameter , 则其他所有占位符必须也使用parameter 。这是POSIX扩展 , 不属于ISO C 。例:printf("%2$d %2$#x; %1$d %1$#x",16,17) 产生"17 0x11; 16 0x10"
Flags可为0个或多个:
+总是表示有符号数值的'+'或'-'号 , 缺省情况是忽略正数的符号 。仅适用于数值类型 。
空格使得有符号数的输出如果没有正负号或者输出0个字符 , 则前缀1个空格 。如果空格与'+'同时出现 , 则空格说明符被忽略 。
-左对齐 。缺省情况是右对齐 。
#对于'g'与'G' , 不删除尾部0以表示精度 。对于'f', 'F', 'e', 'E', 'g', 'G', 总是输出小数点 。对于'o', 'x', 'X', 在非0数值前分别输出前缀0, 0x, and 0X表示数制 。
0如果width选项前缀以0 , 则在左侧用0填充直至达到宽度要求 。例如printf("%2d", 3)输出" 3" , 而printf("%02d", 3)输出"03" 。如果0与-均出现 , 则0被忽略 , 即左对齐依然用空格填充 。
Field Width给出显示数值的最小宽度 , 典型用于制表输出时填充固定宽度的表目 。实际输出字符的个数不足域宽 , 则根据左对齐或右对齐进行填充 。实际输出字符的个数超过域宽并不引起数值截断 , 而是显示全部 。宽度值的前导0被解释为0填充标志 , 如上述;前导的负值被解释为正值 , 负号解释为左对齐标志 。如果域宽值为* , 则由对应的函数参数的值为当前域宽 。
Precision通常指明输出的最大长度 , 依赖于特定的格式化类型 。对于整形数值 , 是指最小数字位数 。对于a,A,e,E,f,F的浮点数值 , 是指小数点右边的输出值应该舍入的数字位数 。对于g,G的浮点数值 , 是指有效数字最大位数 。对于字符串类型 , 是指输出的字节的上限 , 超出限制的其它字符将被截断 。如果域宽为* , 则由对应的函数参数的值为当前域宽 。如果仅给出了小数点 , 则域宽为0 。
Length指出浮点型参数或整型参数的长度 。可以忽略 , 或者是下述:
字符
描述
hh对于整数类型 , printf期待一个从char提升的int尺寸的整型参数 。
h对于整数类型 , printf期待一个从short提升的int尺寸的整型参数 。
l对于整数类型 , printf期待一个long尺寸的整型参数 。
对于浮点类型 , printf期待一个double尺寸的整型参数 。对于字符串s类型 , printf期待一个wchar_t指针参数 。对于字符c类型 , printf期待一个wint_t型的参数 。
ll对于整数类型 , printf期待一个long long尺寸的整型参数 。
L对于浮点类型 , printf期待一个long double尺寸的整型参数 。