
缓冲区溢出攻击原理及防范.docx
33页缓冲区溢出攻击原理及防范作者姓名:XXX 班级:计算机网络XXX学号:2200951XXX 指导教师:XXX教授摘要缓冲区简单来说是一块连续的计算机内存区域,可以保存相同数据类型的多 个实例, 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲 区本身的容量溢出的数据覆盖在合法数据上 ,理想的情况是程序检查数据长 度并不允许输入超过缓冲区长度的字符 ,但是绝大多数程序都会假设数据长 度总是与所分配的储存空间相匹配 ,这就为缓冲区溢出埋下隐患 .操作系统 所使用的缓冲区 又被称为 "堆栈". 在各个操作进程之间 ,指令会被临时储存 在"堆栈"当中,"堆栈"也会出现缓冲区溢出缓冲区溢出是最常见的安全漏洞, 针对缓冲区溢出的漏洞进行攻击,是很常见的攻击手段,可以使本地用户获得超 级用户权限,也可以使外部攻击者通过网络直接进入系统本文详细分析了缓冲区溢出的基本原理,描述了利用缓冲区溢出漏洞进行攻 击的基本方式,并通过对一段实例程序的溢出和构建攻击语句直观的演示了缓冲 区溢出的形成过程及其攻击原理,最后提出了防范缓冲区溢出的有效措施关键词:缓冲区溢出 堆栈 漏洞AbstractSimply ,buffer is a continuous computer memory area, can keep the same data types of multiple instances, buffer overflow is when computer to the buffer filled with data f igures within the capacity of the buffer itself more than the data covered in legal spill data, the ideal situation is not allowed to check the data length program more than the length of the input buffer characters, but most of the program will be always with the assumption that data length distribution of storage space match, this is the buffer overf low buried hidden trouble. Operating system used by buffer is known as the "stack". I n between each operation process, the instructions will be temporarily stored in the "st ack" of "stack" also can appear buffer overflow. Buffer overrun is the most common s ecurity flaws in the buffer overflow vulnerability to attack, it is very common attack method, can make local users get super user permissions, also can make the external a ttackers through the network directly into the system.This paper analyzes the basic principle of buffer overflow, describes the use of buf fer overrun vulnerabilities to attack the basic way of, and through the example of a pr ogram and the construction of overflow attack statement intuitive demonstrates buffer overflow the forming process and the principle of attack, finally puts forward the cou ntermeasures of buffer overflow effective measures.Keywords: buffer overflow Stack shellcod目录摘 要 1Abstract 2绪论 1第一章 缓冲区溢出基本原理 21.1 栈缓冲区溢出 21・2 HEAP/BSS缓冲区溢出 41.2.1 重要性 41・2・2相关概念介绍 41.2.3Heap/BSS 溢出攻击 5第二章 缓冲区溢出攻击 82.1 shellcode 基础 92.2 可注入 shellcode 的编写 112.3 远程缓冲区溢出威胁 15第三章 缓冲区溢出攻击防御 173.1 给有漏洞的程序打补丁 173.2 编写安全的代码 173.3 静态分析 173.4 动态测试 173.5软件开发过程中的防范策略 183.6 缓冲区溢出攻击的抵御 23第四章 缓冲区溢出攻击与防御实例设计 254.1 缓冲区溢出攻击实例 25总结与展望 27致谢 28参考文献 29绪论随着计算机技术、现代通信技术和网络技术的发展,尤其是Internet的广泛 使用,计算机网络与人们的工作和生活的联系越来越密切、越来越深入,同时也 使网络系统的安全问题日益复杂和突出。
计算机的应用使机密和财富集中于计算 机,计算机网络的应用使这些机密和财富随时受到联网用户的攻击威胁计算机 病毒的肆虐、黑客的非法入侵、重要资料被破坏或丢失,都会造成网络系统的瘫 痪网络安全问题也应此越来越受重视解决网络安全问题的一个有效途径是对网络的安全性进行分析网络安全性 分析按照其分析目的可以分为两类:一类是利用协议检测和错误注入等方法对网 络协议和应用程序的安全性进行分析,其目的是要发现新弱点;另一类是对已知 弱点进行形式化描述之后,研究已知弱点之间的依赖关系,其目的是要发现攻击 者可能采取的攻击路径自最早的有文档记载的恶意缓冲区攻击“ Morris Worm"⑴事件以来,缓冲 区溢出攻击已成为目前最主要最具威胁性的网络攻击之一. 根据 MITRE Corpor- ation的报告《Vulnerability Type Distributions in CV助 ⑵统计,缓冲区溢出漏洞占 了 2001-2006 年所有已确认漏洞的 20%当向一个有限大小的缓冲区填入超过其 大小的数据后,就发生了缓冲区溢出,缓冲区溢出攻击正是利用了软件中存在的 缓冲区溢出漏洞,与缓冲区溢出密切相关的程序语言包括 C/C++, 因为它们没有 内置的缓冲区边界检查机制。
而目前大量的应用软件和操作系统都是利用 C/C++ 编写,因此缓冲区溢出漏洞仍然会在以后相当长的时间内存在适当地应用 Java、C#、Lisp、等类型安全的编程语言可以有效地减少使用C/C++时的安全风 险,然而即使是类型安全的编程语言也无法提供绝对的安全[3,]性与时间效率始 终是对立量在提供了安全的同时,安全编程语言也损失了执行效率缓冲区溢出攻击通常会带来以下两点后果: 第一,过长的字符串覆盖了相邻 的存储单元而造成程序异常, 严重的会造成死机、系统或进程重启等;第二可让 攻击者执行恶意代码或特定指令, 甚至获得超级权限等, 从而引发其他的攻击 因此,深入研究缓冲区溢出攻击原理及其防范措施,对于探索如何防御溢出攻击 具有重要的意义第一章缓冲区溢出基本原理III缓冲区溢出是一类形式隐秘、危害严重的网络安全威胁,目前网络上有的攻 击或多或少最终与缓冲区溢出有关缓冲区溢出的直接后果可能是程序运行失 败、系统死机重新启动、执行非授权指令和取得系统特权等,对系统的可用性、 完整性和机密性都可能产生危害缓冲区溢出的根本原因来自C语言(以及其后代C++)本质的不安全性: 没有边界来限制数组和指针的引用;标准C库中还存在许多非安全字符串操作, 如 strcpy()、sprintf()、gets()等。
当前,存在两种基本的缓冲区溢出:栈溢出和HEAP/BSS溢出1.1栈缓冲区溢出任何一个源程序通常都包括代码段,这些代码和数据本身都是静态的为了 运行程序,首先要由操作系统负责为其创建进程,并在进程的虚拟地址空间中为 其代码段和数据段建立映射但是只有静态的代码段和数据段是不够的,进程在 运行过程中还要有其动态环境一般说来,默认的动态存储环境通过堆栈(简称 栈)机制建立所有局部变量以及所以按值传递的函数参数都通过堆栈机制自动 的进行内存空间的分配分配同一数据类型相邻块的内存区域称为缓冲区图hi 冒 1 address1-1为Linux下进行进程间的地址空间布局}c-n mn i and-Lj ne arginncnls and variablesstackheapkiwuniniiirili/cxl delta(fees)text! tor zero by(?xecrcaci fmm> ram fileby图1-1 Linux进程的地址空间布局从逻辑上讲,进程的堆栈是由多个堆栈帧构成的,其中每个堆栈都对应一个 函数调用,当函数调用发生时,新的堆栈帧被压入堆栈;当函数返回时,相应的 堆栈帧从堆栈中弹出。
尽管堆栈帧结构的引入为在高级语言中实现函数或过程这 样的概念提供了直接的硬件支持,但是由于将函数返回地址这样的重要数据保存 在程序员可见的堆栈中,当程序写入超过缓冲区的边界时,就会产生所谓的“缓 冲区溢出”发生缓冲区溢出时,就会覆盖下一个相邻的内存块,导致一些不可 预料的结果:也许程序可以继续,也许程序的执行出现奇怪现象,也许程序完全 失败下面的程序是一个缓冲区溢出的实例includevstdio.h>int main(){char name[5];printf( “Please input your name:");gets(name);printf( “you are % s",name);}运行这个程序可以发现,当输入的字符数少时,程序运行正常;当输入的字符数 太多(超过8)时,程序就不能正常结束这就是缓冲区溢出所造成典型的堆栈帧结构如图1-2所示堆視蚊指针找顶指针加gument nArg umen+ 1Return addressPrevious frame poin+erLocal variable 1Local variable 2Local variable 3Local variable n函数的实参恢复前一个堆栈验 所必需的数据函数的局韶变壘图1-2典型的堆栈帧结构堆栈帧的顶部为函数的实参,下面是函数的返回地址以及前一个堆栈帧的指针, 最下面是分配给函数的局部变量使用的空间。
一个堆栈帧通常都有两个指针,其 中一个称为堆栈帧指针,另一个称为栈顶指针前者所指向的位置是固定的,而 后者所指向的位置在函数的运行过程中可变因此在函数中访问实参和局部变量 时都是以堆栈帧指针为基址,再加上一个偏移,由图 1-2 可知,实参的偏移为正, 局部变量的偏移为负当发生数据栈溢出时,多余的内容就会越过栈底。






![河南新冠肺炎文件-豫建科[2020]63号+豫建科〔2019〕282号](http://img.jinchutou.com/static_www/Images/s.gif)





