- 1、本文档共14页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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 hellohelloPrompt: myecho this is some textthis is some text So it justs spits back what we feed in – or does it? Try: Prompt: myecho %x%x112ffc0 注意到myecho %x%x,并没有按照原本的意思打印出来,却显示的十六进制数?原因正是因为这些属于格式化字符,它们被传递给printf()函数却没有用函数来解释这些字符,被认为是格式化字符。安全的写法应该是 printf(“%s”,argv[count]); 而不是: printf(argv[count]); 一个攻击者能够怎么利用呢?他们使用 “%n”格式化字符,能写任意值到他们选
您可能关注的文档
- linux之位置参数.docx
- 2010—2015年全国高考理科数学试题分类汇编:坐标系与参数方程(试题).doc
- 第六章 Bshell编程.doc
- shell速记.doc
- 课堂作业3_shell script.doc
- Linux Shell常用技巧(四).docx
- 51CTO下载-BAT编程.doc
- 电子面单打印设置-PHP对接API.docx
- php缓存技术详解1.doc
- ant实践应用.doc
- 天津市静海区第一中学2024_2025学年高二生物3月月考试卷含解析.doc
- 新教材适用高中物理第三章电磁场与电磁波初步测评A教科版必修第三册.doc
- 贵州始匀市第一中学2024_2025学年高一化学上学期期中试题.doc
- 冲刺双一流备战2024年高考数学二轮复习核心专题讲练新高考版第3讲三角恒等变换与解三角形重难点题型突.docx
- 福建省莆田市五校2024_2025学年高二生物下学期期末考试试题含解析.doc
- 青海省海西州高级中学2024_2025学年高二化学上学期期中试题含解析.doc
- 内蒙古通辽市开鲁县2024_2025学年九年级语文下学期第二次月考试题无答案.docx
- 2024_2025学年高中生物阶段质量检测一人体的内环境与稳态动物和人体生命活动的调节含解析新人教版必修3.doc
- 内蒙古通辽市奈曼旗实验中学2024_2025学年高一地理下学期期中试题含解析.doc
- 四川省绵阳南山中学2024_2025学年高二数学下学期入学考试试题理扫描版.doc
文档评论(0)