翻译: xuzq@chinasafer.com 内容: 介绍 什么是格式化字符串攻击? Printf-学校忘记教给你的东西 简单的例子 来格式化吧!(Format Me!) X MARKS THE SPOT(X是本文示例程序中我们试图重写的一个变量,这句我不知 道如何翻译) 怎么着(So what)? 摘要 本文讨论格式化字符串漏洞的成因和含义,并给出实际的例子来解释原理。 介绍 我知道在某些时候对于你我和我们大家而言,下面这种情况总会发生。在一个时下流行的 晚餐会上,夹杂在同事们大呼小叫的声音里,你听到了"格式化字符串攻击"这只言片语。 "格式化字符串攻击?什么是格式化字符串攻击?"你心说。由于害怕在同事们面前显露出 自己的无知,你决定停 止不自然的微笑,而频频点头以示自己对这玩艺了如指掌。如果一切顺利,大家会共饮鸡 尾酒,谈话仍将继续,但是没人明白这究竟是怎么回事。现在不用再害怕什么了,本文会 提供你想知道而又不好意思问的所有内容。 什么是格式化字符串攻击? 格式化字符串漏洞同其他许多安全漏洞一样是由于程序员的懒惰造成的。当你正在阅读本 文的时候,也许有个程序员正在编写代码,他的任务是:打印输出一个字符串或者把这个 串拷贝到某缓冲区内。他可以写出如下的代码: printf("%s", str); 但是为了节约时间和提高效率,并在源码中少输入6个字节,他会这样写: printf(str); 为什么不呢?干嘛要和多余的printf参数打交道,干嘛要花时间分解那些愚蠢的格式? printf的第一个参数无论如何都会输出的!程序员在不知不觉中打开了一个安全漏洞,可 以让攻击者控制程序的执行,这就是不能偷懒的原因所在。 为什么程序员写的是错误的呢?他传入了一个他想要逐字打印的字符串。实际上该字符串 被printf函数解释为一个格式化字符串(format |