c - 接收%x格式说明(C - The %x format specifier)

2019-07-20 15:29发布

我有一个小问题。 我知道%x格式说明可用于从一个格式化字符串攻击堆栈读取值。

我发现下面的代码:

%08x%08x%08x%08x

什么是08呢? 它正在做什么呢? 谢谢 :)

Answer 1:

分解:

  • 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/以供参考。



Answer 2:

指定你要多少位数它显示。

整数值或*指定最小字段宽度。 结果则以用空格字符(默认),如果需要的话,在左边时,右对齐,或在右边,如果左对齐。 在当使用*的情况下,宽度是由int类型的附加的参数指定。 如果参数的值是负的,其结果与 - 指定的标志和正字段宽度。



Answer 3:

%08x意味着每个数应与用零填充丢失的所有数字被印刷宽至少8个字符,例如为“1”输出将是00000001



Answer 4:

从http://en.wikipedia.org/wiki/Printf_format_string

使用0,而不是空格填充的字段中指定的宽度选项时。 例如, printf("%2d", 3)的结果为“3”,而printf("%02d", 3)在“03”的结果。



Answer 5:

在printf的你提到的格式化字符串攻击是不特定的“%X”格式 - 在printf的有更多的格式参数传递比任何变量的情况下,它会从那些不属于它的堆栈读取值。 您将获得与例如,%d同样的问题。 当你想看到这些值作为十六进制%x是有用的。

如在先前的答案所解释的,%08X将产生一个8位数字的十六进制数,通过前述补零。

在printf的代码示例中的格式,没有额外的参数:

printf ("%08x %08x %08x %08x");

将获取从堆栈4个参数,并显示它们作为8位填充的十六进制数。



文章来源: C - The %x format specifier