<!--StartFragment--> 测试平台:RedHat 6.1, RedHat 6.2 (Intel i386)
前言: =====
最近一段时间,一种新的安全漏洞正开始引起人们注意,就是诸多的*printf()函数的格式 化串问题。其实这个问题应该说并不鲜见,只是一直没有人注意它,直到最近才开始进行 一些深入的讨论。格式化串的问题实际上是由于程序员编程时的疏漏所导致的,下面我们 就来看看具体是怎么回事。
关于格式化串 ============
*printf()函数包括printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf等函数,它们可以将数据格式化后输出。以最简单的printf()为例: int printf(const char *format, arg1,arg2,...);
通过定制format的内容(%s,%d,%p,%x...),用户可以将数据按照某种格式输出。问题是, *printf()函数并不能确定数据参数arg1,arg2...究竟在什么地方结束,也就是说,它不知 道参数的个数。它只会根据format中的打印格式的数目依次打印堆栈中参数format后面地址 的内容。先来看一个简单的例子:
<- begin -> fmt_test.c
#include <stdio.h>
int main(void) { char string[]="Hello World!"; printf("String: %s , arg2: %#p , arg3: %#p\n", string); return 0; }
<- end ->
上面的例子中我们其实只提供了一个数据参数"string",但在格式串中有三个打印格式, 我们看一下运行的结果:
[warning3@redhat-6 format]$ gcc -o fmt_test fmt_test.c [warning3@redhat-6 format]$ ./fmt_test String: Hello World! , arg2: 0x6c6c6548 , arg3: 0x6f57206f
我们来看一下arg2,arg3显示的是哪里的内容: [warning3@redhat-6 format]$ gdb ./fmt_test <...>=版权所有 软件 下载 学院 版权所有= (gdb) b printf Breakpoint 1 at 0x8048308 (gdb) r Starting program: /home/warning3/format/./fmt_test Breakpoint 1 at 0x40064f5c: file printf.c, line 30.
Breakpoint 1, printf ( format=0x80484c0 "String: %s , arg2: %#p , arg3: %#p\n") at printf.c:30 30 printf.c: No such file or directory. (gdb) x/10x $ebp 0xbffffc88: 0xbffffca8 0x08048403 0x080484c0 0xbffffc98 0xbffffc98: 0x6c6c6548 0x6f57206f 0x21646c72 0x08049500 0xbffffca8: 0xbffffcc8 0x400301eb
上一篇:Unix/ELF文件格式及病毒分析
下一篇:printf()格式化串安全漏洞分析(下)
|