尽管存在明显的缺点,为什么C具有%n格式说明符?

时间:2014-06-20 00:15:15

标签: c

我一直在学习格式字符串漏洞,这是我第一次听说%n。而且我不明白为什么它存在。

好的,当然,我可以想象你想知道你到目前为止写过多少个字的情况。但是还有很多其他方法可以找到字符串的长度,而%n似乎是一种奇怪的方法。它与所有其他格式说明符不同,因为它不会写入字符串,而是写入内存中的其他手动指定位置。而且因为它如此不直观 - 谁会期望printf写入任意内存? - 它似乎具有创建安全漏洞的明显潜力。除非有人警告你格式化字符串漏洞,否则你可能永远不会想到它。

必须有这样做的理由。但它是什么?或者上面描述的问题当时不被认为是严重的?

1 个答案:

答案 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;

}

如果您想知道何时在控制台上换行,想要对齐您的值以及您希望对输出执行的其他格式化过程,此参数非常有用。