C:读取的字节数多于格式字符串注入的格式字符串



在论文利用格式字符串漏洞中,作者给出了以下代码示例,其中input是一些未过滤的用户输入。

char outbuf[512];
char buffer[512];
sprintf (buffer, "ERR Wrong command: %400s", input);
sprintf (outbuf, buffer);

然后,他们解释说,通过使用特殊格式字符串作为输入,他们可以绕过%400s限制:

"%497dx3cxd3xffxbf<nops><shellcode>"

这将创建一个长度为 479 个字符的字符串。但是,我找不到关于%479d如何绕过%400s限制的解释。此输入如何使 sprintf 能够写入长度超过 400 个字符的字符串?

第二个sprintf()溢出outbuf因为它使用第一个sprintf()生成的格式字符串,并且在该字符串中放置"%497d"可以打印一个497个字符宽的整数字段(用空格填充以获得完整宽度)。 这与该字符串的其余部分一起,将超过 512 个字符的outbuf缓冲区大小。 它还会让它尝试读取实际上没有传递给函数的整数参数(第 2 sprintf() )。

问题是,如果input包含%标记,那么buffer将包含这些%标记(在第一个sprintf()之后),然后使用第二个sprintf()buffer"格式字符串",其中的%标记将被解释,即使没有参数可以插值到outbuf。 要避免此问题,请执行以下操作:

snprintf(outbuf, sizeof(outbuf), "%s", buffer);

strcpy(outbuf, buffer);

在这种情况下,snprintf()是矫枉过正,但它将机制剥离到基础。

相关内容

  • 没有找到相关文章

最新更新