格式化字符漏洞.ppt

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
格式化字符漏洞

格式化字符漏洞 即使只有一点C语言基础的人也会printf()函数,实际上C语言教科书上通常的第一个程序就是“Hello, World!”, #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 在第四行申明了一个int类型的变量bytes_formatted,在第六行,格式化字符表示20个字符应该按十六进制 (“%.20x”) 进行格式化,%n则把值20写到bytes_formatted变量中。这意味着已经写了一个值到另外的内存空间中。现在我们不讨论编译者写数值或者写地 址的影响,而讨论那种通过通过某种方式在操作这些值的时候造成了缺陷(溢出),如果这样成功的话,可能获得超过程序的执行控制。 在程序员试图传递一个字符串到一个使用格式化字符的格式函数中,就可能发生溢出情况。参考下面的程序。 #include <stdio.h> void main(int argc, char *argv[]) { int count = 1; while(argc > 1) { printf(argv[count]); printf(“ “); count ++; argc --; } } 编译并运行后显示如下程序: Prompt: myecho hello hello Prompt: myecho this is some text this is some text So it justs spits back what we feed in – or does it? Try: Prompt: myecho %x%x 112ffc0 注意到myecho %x%x,并没有按照原本的意思打印出来,却显示的十六进制数?原因正是因为这些属于格式化字符,它们被传递给printf()函数却没有用函数来解释这些字符,被认为是格式化字符。安全的写法应该是 printf(“%s”,argv[count]); 而不是: printf(argv[count]); 一个攻击者能够怎么利用呢?他们使用 “%n”格式化字符,能写任意值到他们选

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档