我有一个小问题。 我知道%x格式说明可用于从一个格式化字符串攻击堆栈读取值。
我发现下面的代码:
%08x%08x%08x%08x
什么是08呢? 它正在做什么呢? 谢谢 :)
我有一个小问题。 我知道%x格式说明可用于从一个格式化字符串攻击堆栈读取值。
我发现下面的代码:
%08x%08x%08x%08x
什么是08呢? 它正在做什么呢? 谢谢 :)
分解:
8
说,你想显示8个位数 0
要使用前缀0
的,而不是仅仅空格 x
要在小写十六进制打印。 简单的例子(感谢Grijesh肖汉):
#include <stdio.h>
int main() {
int data = 29;
printf("%x\n", data); // just print data
printf("%0x\n", data); // just print data ('0' on its own has no effect)
printf("%8x\n", data); // print in 8 width and pad with blank spaces
printf("%08x\n", data); // print in 8 width and pad with 0's
return 0;
}
输出:
1d
1d
1d
0000001d
另请参阅http://www.cplusplus.com/reference/cstdio/printf/以供参考。
指定你要多少位数它显示。
整数值或*指定最小字段宽度。 结果则以用空格字符(默认),如果需要的话,在左边时,右对齐,或在右边,如果左对齐。 在当使用*的情况下,宽度是由int类型的附加的参数指定。 如果参数的值是负的,其结果与 - 指定的标志和正字段宽度。
%08x
意味着每个数应与用零填充丢失的所有数字被印刷宽至少8个字符,例如为“1”输出将是00000001
从http://en.wikipedia.org/wiki/Printf_format_string
使用0,而不是空格填充的字段中指定的宽度选项时。 例如, printf("%2d", 3)
的结果为“3”,而printf("%02d", 3)
在“03”的结果。
在printf的你提到的格式化字符串攻击是不特定的“%X”格式 - 在printf的有更多的格式参数传递比任何变量的情况下,它会从那些不属于它的堆栈读取值。 您将获得与例如,%d同样的问题。 当你想看到这些值作为十六进制%x是有用的。
如在先前的答案所解释的,%08X将产生一个8位数字的十六进制数,通过前述补零。
在printf的代码示例中的格式,没有额外的参数:
printf ("%08x %08x %08x %08x");
将获取从堆栈4个参数,并显示它们作为8位填充的十六进制数。