我有一个小问题。我知道%x格式说明符可用于在格式字符串攻击中从堆栈中读取值。
我发现以下代码:
%08x%08x%08x%08x
08是什么意思?它到底在做什么?谢谢 :)
我有一个小问题。我知道%x格式说明符可用于在格式字符串攻击中从堆栈中读取值。
我发现以下代码:
%08x%08x%08x%08x
08是什么意思?它到底在做什么?谢谢 :)
printf()
正在使用。
Answers:
分解:
8
说您要显示8位数字0
您要加上0
而不是空格的前缀x
您要以小写十六进制打印。快速示例(感谢Grijesh Chauhan):
#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
%-8x
和资本X
。并观察效果
8
和0
都是数字(因此是英语中语法的相同部分),它们也是printf格式语法的不同部分。0
是一个“标记”和8
是“宽度”(其可以是一个参数<ε (no input)>
,<d (any number greater than 0)>
或* (a literal asterisk)
)。肯定是非直觉的API!但是,您能说什么呢……所有这些都是老式的C语言,其中的内存是如此宝贵,以至于您想在程序中保存尽可能多的字符-考虑到他们所面临的限制,我同意他们的决定!
printf
语法?我喜欢%
用作转义字符,它对字符串格式是如此独特且利基。我认为修饰符应该附加而不是前置-这样,您就可以从左到右阅读它。有点像%<specifier>[%f<flags>][%-w<width>.<precision>]%
,而不是%[flags][width][.precision][length]specifier
。我%
在每个字段之间都选择了一个,以及要关闭的字段(因此您仍然可以执行%x%x
-%x %% x%),并允许使用多字符说明符
来自http://en.wikipedia.org/wiki/Printf_format_string
指定width选项时,请使用0而不是空格来填充字段。例如,printf("%2d", 3)
结果为“ 3”,而printf("%02d", 3)
结果为“ 03”。
000007ac
或0005ceef
。