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

为什么C有%n格式说明符,尽管有明显的缺点?,c,C,我一直在学习格式化字符串漏洞,这是我第一次听说%n。我不明白它为什么存在 好的,当然,我可以想象你想知道到目前为止你已经写了多少个字符。但是还有很多其他方法可以找到字符串的长度,%n似乎是一种奇怪的方法。它不同于所有其他格式说明符,因为它不写入字符串,而是写入内存中其他手动指定的位置。因为它太不直观了,谁会想到printf会写入任意内存呢它显然有可能造成安全漏洞。除非有人警告您格式字符串漏洞,否则您可能永远不会想到它 这样做肯定是有原因的。那是什么?或者上述问题当时并不严重?如图所示,它实际上并

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

好的,当然,我可以想象你想知道到目前为止你已经写了多少个字符。但是还有很多其他方法可以找到字符串的长度,
%n
似乎是一种奇怪的方法。它不同于所有其他格式说明符,因为它不写入字符串,而是写入内存中其他手动指定的位置。因为它太不直观了,谁会想到printf会写入任意内存呢它显然有可能造成安全漏洞。除非有人警告您格式字符串漏洞,否则您可能永远不会想到它

这样做肯定是有原因的。那是什么?或者上述问题当时并不严重?

如图所示,它实际上并没有将其值存储在随机内存中


没有印刷。参数必须是指向有符号整数的指针,其中存储了迄今为止写入的字符数

#包括
int main()
{
int-val;
printf(“blah%n blah\n”、&val);
printf(“val=%d\n”,val);
返回0;
}


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

有史以来最糟糕的问题措辞。如果你只是问“什么是…的有效用途”,你可能会得到一个答案。我已经知道它是如何工作的。我想知道为什么语言是这样设计的,而不仅仅是让人们使用strlen()ῥεῖ 我不太明白你在说什么。我的问题是:为什么在C语言中定义了%n格式说明符,尽管它有明显的缺点?也许我应该改变我的标题来反映这一点。只有在运行时可以修改格式字符串,这才是危险的;如果是文本,只需传递与
%n“
说明符对应的
int
对象的地址即可。至于
strlen
,如果您使用
printf
fprintf
写入文件,则没有什么可应用的
strlen
。我知道它不存储在“随机内存”中,我知道它就是这样工作的。但我想知道为什么会这样。与strlen()相比,计算换行是否更方便?除非您总是使用
sprintf
或同等工具将输出输出打印到字符串缓冲区,然后在使用
printf
之前使用
strlen
,否则没有其他方法(不需要进行黑客攻击)获取
printf
输出的长度。除了
\t
被视为一个字符,这意味着你也不能用它来正确换行。@Mehrdad不要用
\t
那么,我的任何输出中都没有,我甚至都不会回避它。@Serdalis:Patient:“医生,医生!我走路的时候疼!”医生:“那就别走路了:P,我有轮椅,我甚至都不避免走路”
#include <stdio.h>

int main()
{
  int val;

  printf("blah %n blah\n", &val);

  printf("val = %d\n", val);

  return 0;

}