格式字符串漏洞

时间:2012-03-03 19:04:18

标签: c string security scanf

我有简单的C程序:

char user_input[100];
scanf("%s", user_input);
printf(user_input);

据我所知,这代表了安全漏洞;例如输入一堆%x将打印出堆栈的内容。

但是如何打印所选的内存位置呢?

我读到了:

\x10\x01\x48\x08_%08x.%08x.%08x.%08x.%08x|%s|

应该将内存的内容从this paper转储到0x08480110位置。但相反,它将打印出接下来的4字节到堆栈上的格式字符串。我想了解原因。

2 个答案:

答案 0 :(得分:1)

格式字符串本身将在堆栈中(因为您已将user_input声明为本地变量)。因此,如果您走得足够远(这是%08x强制printf要做的事情),那么您最终将到达格式字符串的开头。 %s告诉printf从堆栈中读取地址,然后打印在该位置找到的字符串。所以它读取格式字符串的前4/8字节,并将它们用作地址。

当然,要实现这一点,您需要确切知道通过堆栈读取多远才能达到格式字符串。因此,您可能需要调整%08x的数量。

此外,在运行时输入\x10的用户与包含\x10的源代码中的字符串文字不同...

答案 1 :(得分:0)

Exploiting Format String Vulnerabilities.

详细解释了这一点

如果您想要图片,请参阅这些lecture notes的第4.4节。