软件工程专业缓冲区溢出的保护实践

上传人:s9****2 文档编号:560291925 上传时间:2024-02-05 格式:DOC 页数:9 大小:60.50KB
返回 下载 相关 举报
软件工程专业缓冲区溢出的保护实践_第1页
第1页 / 共9页
软件工程专业缓冲区溢出的保护实践_第2页
第2页 / 共9页
软件工程专业缓冲区溢出的保护实践_第3页
第3页 / 共9页
软件工程专业缓冲区溢出的保护实践_第4页
第4页 / 共9页
软件工程专业缓冲区溢出的保护实践_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《软件工程专业缓冲区溢出的保护实践》由会员分享,可在线阅读,更多相关《软件工程专业缓冲区溢出的保护实践(9页珍藏版)》请在金锄头文库上搜索。

1、*大学*学院信息安全产品开发实践课程设计报告题 目 缓冲区溢出的保护 学生姓名 学 号_ _ 年 级 指导老师 指导老师评阅意见: 指导老师评分: 提交时间: 2007年12月 缓冲区溢出的保护(软件工程专业)学生 学号 指导教师 摘要:1999 年 Bugtraq(一个讨论安全缺陷的邮件列表)进行的一次非正式调查发现,三分之二的参与者认为第一号的缺陷就是缓冲区溢出。从 1997 年到 2007 年 3 月,CERT/CC 发出的半数安全警报都基于缓冲区缺陷。 面对如此大的威胁,我们需要知道什么是缓冲区溢出,如何防止它们,可以采用哪些最新的自动化工具来防止它们以及为什么这些工具还不足够,还有如

2、何在编写程序的程序中防止它们。关键字:缓冲区溢出;溢出保护;溢出防御 Detection Of Buffer Overflow Abstract: From an informal investigation on Bugtraq (a mail list which discuss a limitation on security) in 1999, we can find that two-parts participants thought that the No.1 limitation is buffer overflow. From 1997 to May, 2007, almos

3、t half the secure warnings sent by CERT/CC were based on the limitation of buffer. Facing such a huge menace, we need to learn what is the buffer overflow, how to defend them, which kinds of the latest automatization tools we can used for avoid them , why these tools still not enough, and how to pre

4、vent them in programming.Keywords: Buffer Overflow,Overflow Detection, Overflow Defense 正文1 绪论1.1 立题背景缓冲区溢出是当前一些软件存在的最常见的安全隐患之一,通过提供一个恶意的输入黑客可以改变进程的执行流程,缓冲区溢出能够威胁到整个进程,机器,甚至相关的系统领域。如果运行的进程是在权限比较高的用户下面,比如administrator或者本地的系统帐户(Local System Account),那么黑客破坏所导致的损失将会很严重而且将会面临更广泛的潜在危胁。最近时期爆发的一些众所周知的病毒像,红色

5、代码病毒和震荡波蠕虫病毒,都是C/C+代码里存在着缓冲区溢出的结果。1.2 研究内容在几乎所有计算机语言中,不管是新的语言还是旧的语言,使缓冲区溢出的任何尝试通常都会被该语言本身自动检测并阻止(比如通过引发一个异常或根据需要给缓冲区添加更多空间)。但是有两种语言不是这样:C 和 C+ 语言。C 和 C+ 语言通常只是让额外的数据乱写到其余内存的任何位置,而这种情况可能被利用从而导致恐怖的结果。更糟糕的是,用 C 和 C+ 编写正确的代码来始终如一地处理缓冲区溢出则更为困难;很容易就会意外地导致缓冲区溢出。除了 C 和 C+ 使用得 非常广泛外,上述这些可能都是不相关的事实;例如,Red Hat

6、 Linux 7.1 中 86% 的代码行都是用 C 或 C + 编写的。因此,大量的代码对这个问题都是脆弱的,因为实现语言无法保护代码避免这个问题。 在 C 和 C+ 语言本身中,这个问题是不容易解决的。该问题基于 C 语言的根本设计决定(特别是 C 语言中指针和数组的处理方式)。由于 C+ 是最兼容的 C 语言超集,它也具有相同的问题。存在一些能防止这个问题的 C/C+ 兼容版本,但是它们存在极其严重的性能问题。而且一旦改变 C 语言来防止这个问题,它就不再是 C 语言了。许多语言(比如 Java 和 C#)在语法上类似 C,但它们实际上是不同的语言,将现有 C 或 C+ 程序改为使用那些

7、语言是一项艰巨的任务。有些语言存在允许缓冲区溢出发生的“转义”子句。Ada 一般会检测和防止缓冲区溢出(即针对这样的尝试引发一个异常),但是不同的程序可能会禁用这个特性。C# 一般会检测和防止缓冲区溢出,但是它允许程序员将某些例程定义为“不安全的”,而这样的代码 可能 会导致缓冲区溢出。因此如果您使用那些转义机制,就需要使用 C/C+ 程序所必须使用的相同种类的保护机制。许多语言都是用 C 语言来实现的(至少部分是用 C 语言来实现的 ),并且用任何语言编写的所有程序本质上都依赖用 C 或 C+ 编写的库。因此,所有程序都会继承那些问题,所以了解这些问题是很重要的。 2

8、缓冲区溢出的概述 2.1 缓冲区溢出的起源内存溢出已经是软件开发历史上存在了近40年的“老大难”问题2.2缓冲区溢出如何工作计算机还有由程序共享, 随机访问内存 (RAM)。 为了简化, 内存管理 Windows XP SP 2 有功能控制当前正在使用哪段的 RAM。 如果启动程序, 释放内存分配给程序。 该内存被分为三段: 代码段此处存储程序特定执行命令。 数据段此处程序特定数据存储。 堆栈是数据段 (一部分)此处存储所有与程序函数。 这包括参数、 缓冲区存储本地变量以及, 最重要、 返回地址。 返回地址指定执行函数后, 程序将继续从。作为是由用户输入该信息也注册作为变量, 一切, 发送到堆

9、栈用户类型。 不通常, 此行为不提出问题。 但是, 如果因编程错误, 超过缓冲区限制堆栈成为容易控制。 整个段被指定为本地变量例如, 如果攻击者选择适当项对于攻击, 可能会覆盖用指令。 此外, 后续返回地址可更改为指向恶意代码。 因此, 程序不再正常, 但盲目执行攻击者的命令。内存的底部 内存的顶部 buffer1 sfp ret a b c - 增长 - . 堆栈的顶部 堆栈的底部 许多计算机处理器,包括所有 x86 处理器,都支持从高位地址向低位地址“倒”增长堆栈。因此,每当一个函数调用另一个函数,更多的数据将被添加到左边(低位地址),直至系统的堆栈空间耗尽。在这个例子中,当 main()

10、 调用 function1() 时,它将 c 的值压入堆栈,然后压入 b 的值,最后压入 a 的值。之后它压入 return (ret) 值,这个值在 function1() 完成时告诉 function1() 返回到 main() 中的何处。它还把所谓的“已保存的帧指针(saved frame pointer,sfp)”记录到堆栈上;这并不是必须保存的内容,此处我们不需要理解它。在任何情况下, function1() 在启动以后,它会为 buffer1() 预留空间,这在图 1 中显示为具有一个低地址位置。 现在假设攻击者发送了超过 buffer1() 所能处理的数据。接下来会发生什么情况呢

11、?当然,C 和 C+ 程序员不会自动检查这个问题,因此除非程序员明确地阻止它,否则下一个值将进入内存中的“下一个”位置。那意味着攻击者能够改写 sfp (即已保存的帧指针),然后改写 ret (返回地址)。之后,当 function1() 完成时,它将“返回” 不过不是返回到 main() ,而是返回到攻击者想要运行的任何代码。 通常攻击者会使用它想要运行的恶意代码来使缓冲区溢出,然后攻击者会更改返回值以指向它们已发送的恶意代码。这意味着攻击者本质上能够在一个操作中完成整个攻击!Aleph On 的文章(请参阅 参考资料)详细介绍了这样的攻击代码是如何创建的。例如,将一个 ASCII 0 字符

12、压入缓冲区通常是很困难的,而该文介绍了攻击者一般如何能够解决这个问题。 除了 smashing-stack 和更改返回地址外,还存在利用缓冲区溢出缺陷的其他途径。与改写返回地址不同,攻击者可以 smashing-stack(使堆栈上的缓冲区溢出),然后改写局部变量以利用缓冲区溢出缺陷。缓冲区根本就不必在堆栈上 它可以是堆中动态分配的内存(也称为“malloc”或“new”区域),或者在某些静态分配的内存中(比如“global”或“static”内存)。基本上,如果攻击者能够溢出缓冲区的边界,麻烦或许就会找上你了。 然而,最危险的缓冲区溢出攻击就是 stack-smashing 攻击,因为如果程

13、序对攻击者很脆弱,攻击者获得整个机器的控制权就特别容易 2.3缓冲区溢出分类 2.3.1在程序的地址空间里安排适当的代码 2.3.1.1殖入法 攻击者用被攻击程序的缓冲区来存放攻击代码。 攻击者向被攻击的程序输入一个字符串,程序会把这个字符串放到缓冲区里。这个字符串包含的数据是可以在这个被攻击的硬件平台上运行的指令序列。 2.3.1.2利用已经存在的代码 有时候,攻击者想要的代码已经在被攻击的程序中了,攻击者所要做的只是对代码传递一些参数,然后使程序跳转到指定目标。比如,在C语言中,攻击代码要求执行“exec(/bin/sh)”,而在libc库中的代码执行“exec(arg)”,其中arg是指

14、向一个字符串的指针参数,那么攻击者只要把传入的参数指针指向/bin/sh,就可以调转到libc库中的相应的指令序列。 2.3.2控制程序转移到攻击代码这种方法旨在改变程序的执行流程,使之跳转到攻击代码。最基本方法的就是溢出一个没有边界检查或者其他弱点的缓冲区,这样就扰乱了程序的正常的执行顺序。通过溢出一个缓冲区,攻击者可以用近乎暴力的方法改写相邻的程序空间而直接跳过了系统的检查。 2.3.2.1激活纪录(Activation Records) 每当一个函数调用发生时,调用者会在堆栈中留下一个激活纪录,它包含了函数结束时返回的地址。攻击者通过溢出这些自动变量,使这个返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为“stack smashing attack”,是目前常用的缓冲区溢出攻击方式。 2.3.2.2函数指针(Function Pointers) C语言中,“void (* foo)()”声明了一个返回值为void函数指针的变量foo。函数指针可以用来定位

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 商业计划书

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号