利用格式化字符串漏洞对系统发起攻击
2007-07-15 16:45:29 来源:WEB开发网核心提示: int pos, x = 235, y = 93;printf("%d %n%d", x, &pos, y);printf("The offset was %d", pos);* %n格式返回应该被输出的字符数目,而不是实际输出的字符数目,利用格式化
int pos, x = 235, y = 93;
printf("%d %n%d
", x, &pos, y);
printf("The offset was %d
", pos);
* %n格式返回应该被输出的字符数目,而不是实际输出的字符数目。当把一个字符串格式化输出到一个定长缓冲区内时,输出字符串可能被截短。不考虑截短的影响,%n格式表示如果不被截短的偏量值(输出字符数目)。为了说明这一点,下面的代码会输出100而不是20:
char buf[20];
int pos, x = 0;
snprintf(buf, sizeof buf, "%.100d%n", x, &pos);
printf("position: %d
", pos);
简单的例子除了讨论抽象和复杂的理论,我们将会使用一个具体的例子来说明我们刚才讨论的原理。下面这个简单的程序能满足这个要求:
/*
* fmtme.c
* Format a value into a fixed-size buffer
*/
#include <stdio.h>
int
main(int argc, char **argv)
{
char buf[100];
int x;
if(argc != 2)
exit(1);
x = 1;
snprintf(buf, sizeof buf, argv[1]);
buf[sizeof buf - 1] = 0;
printf("buffer (%d): %s
", strlen(buf), buf);
printf("x is %d/%#x (@ %p)
", x, x, &x);
return 0;
}
对这个程序有几点说明:第一,目的很简单:将一个通过命令行传递值格式化输出到一个定长的缓冲区里。并确保缓冲区的大小限制不被突破。在缓冲区格式化后,把它输出。除了把参数格式化,还设置了一个整型值随后输出。这个变量是随后我们攻击的目标。现在值得我们注意的是这个值应该始终为1。
更多精彩
赞助商链接