Win 2000中格式化字符的安全问题

(2002-12-13 11:03 )( )(20CN网络安全小组 )
导读-- 即使只有一点C语言基础的人也会printf()函数,实际上C语言教科书上通常的第一个程序就是“Hello, World!”......

  即使只有一点C语言基础的人也会printf()函数,实际上C语言教科书上通常的第一个程序就是“Hello, World!”,Kernighan and Ritchie在《The C Programming Language》中引发的惯例。

#include <stdio.h>
void main(void)
{
printf("\nHello,World!\n\n");
}

  这并没有完,在C语言中,当编译并运行这个程序向屏幕打印“Hello, World!”并不是简单的向屏幕输出字符串。和相关的程序fprintf(),vprintf() 以及 sprintf()等一样,就想在print后面加上“f”,这些实际上是打印格式。格式化部分允许程序员控制显示文本的样式。可以通过代替特殊的格式字符来显示值或数据,比如,要显示整型的变量“dVal”的值,就可以使用下面的格式化字符:

  printf(“The value is %d”,dVal);

  打印的时候,%d就被dVal的值所代替。如果程序员想用十六进制显示同样值:

  printf(“The value in decimal is %d and in hexadecimal is %x”,dVal,dVal);

  这里%d表示十进制的dVal值,%x表示十六进制的dVal的值。下面是集中特殊的格式化字符:

  %c 单字符格式
  %d 十进制整型 (pre ANSI)
  %e,%E 指数形式的 float or double
  %f 十进制 float or double
  %I 整型 (like %d)
  %o 八进制整型
  %p 地址指针
  %s 字符串
  %x,%X 十六进制整型

  当然,功能不仅限于怎么控制显示的数据类型,而且也能控制显示的宽度和队列等。

  一个格式字符%n没有列在上面,因为有特殊用途,但是它存在的格式化字符安全问题也非常严重。%n用于把前面打印的字符数记录到一个变量中。也用于统计格式化的字节数,这当然需要一个空间来存储这个数字,因此程序需要为此分配内存,例如下面的代码:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int bytes_formatted=0;
  5. char buffer[28]=”ABCDEFGHIJKLMNOPQRSTUVWXYZ”;
  6. printf(“%.20x%n”,buffer,&bytes_formatted);
  7. printf(“\nThe number of bytes formatted in the previous printf statement was %d\n”,bytes_formatted);
  8. return 0;
  9. }

  编译后输出显示为:

  0000000000000012ff64
  The number of bytes formatted in the previous printf statement was 20

共4页。 1 2 3 4 :
责编:
订阅新闻邮件) (推荐) (打印) (关闭页面) (至顶) (我对此感兴趣
相关文章
笔名:
请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。