C 格式字符串漏洞

C 格式字符串漏洞,c,string,security,scanf,C,String,Security,Scanf,我有一个简单的C程序: char user_input[100]; scanf("%s", user_input); printf(user_input); 据我所知,这代表了安全漏洞;e、 g.输入一组%x将打印出堆栈的内容 但如何打印选定的内存位置 我读到: \x10\x01\x48\x08_%08x.%08x.%08x.%08x.%08x|%s| 应在位置0x08480110处从转储内存内容。但是,它会将下一个4字节打印到堆栈上的格式字符串中。我正在试图理解原因。格式字符串本身将在堆栈

我有一个简单的C程序:

char user_input[100];
scanf("%s", user_input);
printf(user_input);
据我所知,这代表了安全漏洞;e、 g.输入一组%x将打印出堆栈的内容

但如何打印选定的内存位置

我读到:

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

应在位置0x08480110处从转储内存内容。但是,它会将下一个4字节打印到堆栈上的格式字符串中。我正在试图理解原因。

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

当然,要使其工作,您需要确切地知道要读取堆栈多远才能命中格式字符串。因此,您可能需要调整
%08x
的数量


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

中对此进行了详细说明


如果需要图片,请参阅第4.4节。

这是一个树丛问题,请输入99个以上的字符以调用缓冲区溢出。小Bobby Tables不清理输入的故事。格式字符串在内存中是否不低于用户输入?另外,我知道%x“遍历堆栈”,是否有一种方法不打印堆栈的全部内容,即遍历堆栈到格式字符串,该格式字符串将使用前4个字节作为它必须从堆栈读取的地址,但不打印中间的所有内容?@Pi_:。在x86上,堆栈通常向下增长(因此,
printf
的堆栈帧的地址将低于调用方的堆栈帧)。注意:我发现输入“%n$x”,其中n是整数,正在经历第一个n-1迭代,而没有打印出结果(即,它弹出n-1迭代并直接进入n的迭代)