缓冲区溢出攻击和防范.pdf
文本预览下载声明
计算机病毒和入侵检测大作业
缓冲区溢出攻击与防范
Buffer overflow attacking and prevention
学 院(系): 软件学院
专 业: 软件工程
学 生 姓 名: 刘毅超
学 号: 201192057
班 级: 软件 1116
完 成 日 期: 2013 年12 月30 日
大连理工大学
Dalian University of Technology
缓冲区溢出攻击与防范
目录
1 引言3
2 基本原理分析3
3 制造缓冲区溢出4
3.1 格式化字符串:4
3.2 堆栈缓冲区(Buffer)溢出攻击:6
3.3 HEAP/BSS 溢出攻击:8
4 预防缓冲区溢出攻击 10
4.1 强制写正确的代码 10
4.2 使缓冲区不可执行 10
4.3 利用编译器的边界检查来实现缓冲区的保护 10
4.4 在程序指针失效前进行完整性检查 11
4.5 可不可以从根本上解决缓冲区溢出攻击 11
5 总结 11
6 参考资料 12
2
缓冲区溢出攻击与防范
1 引言
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的
容量,使得溢出的数据覆盖在合法数据上。在当前网络与分布式系统安全中,
被广泛利用的50% 以上都是缓冲区溢出,而缓冲区溢出中,最为危险的是堆栈
溢出。(操作系统所使用的缓冲区又被称为堆栈. 。在各个操作进程之间,指令
会被临时储存在堆栈当中,堆栈也会出现缓冲区溢出。)本文详细分析了缓
冲区溢出的原理,描述了利用缓冲区溢出漏洞进行系统攻击的一般过程,最后
简单讨论了几种缓冲区溢出的保护方法。
2 基本原理分析
缓冲区是内存中存放数据的地方。在程序试图将数据放到机器内存中的某
一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。而人为的溢出则
是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区,然
后再向一个有限空间的缓冲区中植入超长的字符串,这时可能会出现两个结
果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可
导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取
得系统root 特级权限。
缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的
数据,随着动态分配变量会出现问题。大多时为了不占用太多的内存,一个有
动态分配变量的程序在程序运行时才决定给它们分配多少内存。如果程序在动
态分配缓冲区放入超长的数据,它就会溢出了。一个缓冲区溢出程序使用这个
溢出的数据将汇编语言代码放到机器的内存里,通常是产生root 权限的地方。
仅仅单个的缓冲区溢出并不是问题的根本所在。但如果溢出送到能够以root 权
限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。
现在存在的主要的缓冲区溢出攻击有格式化串缓冲区溢出攻击,堆栈缓冲
区(Buffer)溢出攻击和 HEAP/BSS 的缓冲区溢出。
3
缓冲区溢出攻击与防范
3 制造缓冲区溢出
3.1 格式化字符串:
这种安全漏洞源自于printf(),sprintf 等函数的参数格式, 以最简单的
printf()为例:
int printf(const char *for
显示全部