【发布时间】:2014-06-20 00:15:14
【问题描述】:
我一直在学习格式字符串漏洞,这是我第一次听说%n。而且我不明白它为什么存在。
好的,当然,我可以想象你想知道到目前为止你写了多少个字符的情况。但是还有很多其他方法可以找到字符串的长度,%n 似乎是一种奇怪的方法。它与所有其他格式说明符不同,因为它不写入字符串,而是写入内存中其他一些手动指定的位置。而且因为它太不直观了——谁会期望 printf 写入任意内存? - 它似乎具有制造安全漏洞的明显潜力。除非有人警告您格式字符串漏洞,否则您可能永远不会考虑它。
这样做一定是有原因的。但那是什么?还是上面描述的问题在当时不被认为是严重的?
【问题讨论】:
-
有史以来最糟糕的问题措辞。如果您只是问“什么是……的有效用途”,您可能已经得到了答案。
-
我已经知道它是如何工作的。我想知道为什么语言是这样设计的,而不是让人们使用 strlen()。
-
@πάνταῥεῖ 我不太明白你在说什么。我的问题是:为什么在 C 语言中定义 %n 格式说明符,尽管它有明显的缺点?也许我应该改变我的标题以反映这一点。
-
只有在运行时可以修改格式字符串才有危险;如果它是文字,您只需传递与
"%n"说明符对应的int对象的地址。至于strlen,如果您正在使用printf或fprintf写入文件,则没有什么可以应用strlen。
标签: c