在论文
Exploiting Format String Vulnerabilities中,作者给出了以下代码示例,其中输入是一些未经过滤的用户输入.
char outbuf[512];
char buffer[512];
sprintf (buffer, "ERR Wrong command: %400s", input);
sprintf (outbuf, buffer);
然后他们通过使用特殊格式字符串作为输入来解释它们可以绕过@ 0s限制:
"%497d\x3c\xd3\xff\xbf<nops><shellcode>"
这将创建一个长度为479个字符的字符串.但是,我无法找到G9d如何绕过@0s限制的解释.这个输入如何使sprintf写一个长度超过400个字符的字符串?
最佳答案 第二个sprintf()溢出outbuf,因为它使用第一个sprintf()生成的格式字符串,并在该字符串中放置“I7d”使它打印出一个497-char宽的整数字段(用空格填充以获得整个宽度).这与该字符串的其余部分一起将超过512-char outbuf缓冲区大小.它还会尝试读取一个实际上没有传递给函数的整数参数(第二个sprintf()).