格式字符串漏洞

我有简单的C程序:

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

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

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

我读到了:

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

应该从本文的位置0x08480110转储内存的内容。 但相反,它将打印出下一个4字节到堆栈上的格式字符串。 我想知道为什么。

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

当然,为了使其工作,您需要确切地知道通过堆栈读取多少才能达到格式字符串。 所以你可能需要调整%08x的数量。

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

在Exploiting Format String Vulnerabilities中详细解释了这一点。

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