我一直在学习格式字符串漏洞,这是我第一次听说%n
。而且我不明白为什么它存在。
好的,当然,我可以想象你想知道你到目前为止写过多少个字的情况。但是还有很多其他方法可以找到字符串的长度,而%n
似乎是一种奇怪的方法。它与所有其他格式说明符不同,因为它不会写入字符串,而是写入内存中的其他手动指定位置。而且因为它如此不直观 - 谁会期望printf写入任意内存? - 它似乎具有创建安全漏洞的明显潜力。除非有人警告你格式化字符串漏洞,否则你可能永远不会想到它。
必须有这样做的理由。但它是什么?或者上面描述的问题当时不被认为是严重的?
答案 0 :(得分:2)
如This question所示,它实际上并未将其存储在随机存储器中。
什么都没打印。参数必须是指向signed int的指针,其中存储了到目前为止写入的字符数。
#include <stdio.h>
int main()
{
int val;
printf("blah %n blah\n", &val);
printf("val = %d\n", val);
return 0;
}
如果您想知道何时在控制台上换行,想要对齐您的值以及您希望对输出执行的其他格式化过程,此参数非常有用。