网络攻防原理第06讲-缓冲区溢出攻击
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
缓冲区溢出的根源
溢出的根源在于编程:如果缓冲区被写满,而 程序没有去检查缓冲区边界,也没有停止接收 数据,这时缓冲区溢出就会发生。
Unix和MS Windows系统由于要实现更好的性 能和功能,往往在数据段中动态地放入可执行 的代码。
C/C++语言问题:对数组下标访问边界不做检 查或者少做检查。
概念
缓冲区:用户为程序运行时在计算机中申请得的一 段连续的内存,它保存了给定类型的数据。
缓冲区溢出:计算机程序向缓冲区内填充的数据位 数超过了缓冲区本身的容量,溢出的数据覆盖在合 法数据上。
缓冲区溢出攻击:(一般情况下,缓冲区溢出引起 程序运行错误,但是在攻击者的设计下)向程序的 缓冲区写入超出其长度的内容,造成缓冲区的溢出, 从而破坏程序的堆栈,使程序转而执行其他的指令, 以达到攻击的目的。
基础知识回顾
什么是程序?
程序是指令的集合,告诉计算机如何完成指定的任务。 程序 = 算法 + 数据结构
什么是进程?
可并发执行的程序在一个数据集合上的运行过程。 动态性;并发性;独立性;异步性;结构特征(程序
段、数据段及进百度文库控制块)
内容提要
1 缓冲区溢出概述 2 缓冲区溢出攻击原理 3 缓冲区溢出攻击类型 4 缓冲区溢出攻击防御措施
堆栈中两个最重要的操作是PUSH和POP:PUSH 在堆栈的顶部加入一个元素, POP从堆栈顶部 移去一个元素, 同时改变堆栈的大小。
帧指针等
执行时
: HEAP 动态内存分配,本地变量
分配
: BSS
符号块起始地址 :未初始化全局数据段,即:int foo; float baz;
: DATA 初始化全局静态数据,即: int shit=9,char head[]=”ugh”;
编译时 分配
: TEXT 机器指令 = 操作码 + 操作数; read-only
内存布局
栈 堆 数据区
代码区
Arguments Variables environment
stack
Heap BSS Data text(code)
Adresses hautes user stack frame
Adresses basses
堆栈
堆栈是一种数据结构。堆栈中的对象具有一个 特性:最后一个放入堆栈中的物体总是被最先 拿出来,这个特性通常称为后进先出(LIFO)队 列。
2003年1月,Slammer蠕虫利用微软SQL漏洞产生缓冲区溢出对 全球互联网产生冲击。。同年,“冲击波”蠕虫病毒利用微软 RPC远程调用存在的缓冲区漏洞对Windows 2000/XP、 Windows Server 2003进行攻击,波及全球网络系统。
危害性和普遍性
缓冲区溢出漏洞可以使一个匿名的Internet用户有机会 获得一台主机的部分或全部的控制权。
缓冲区溢出攻击占了远程网络攻击的绝大多数,操作系 统中超过50%的安全漏洞都是由内存溢出引起的。
任何平台、任何程序都可能存在缓冲区溢出的漏洞。
1998年Lincoln实验室用来评估入侵检测的的5种远程攻 击中,有2种是缓冲区溢出。而在1998年CERT的13份 建议中,有9份是是与缓冲区溢出有关的,在1999年, 至少有半数的建议是和缓冲区溢出有关的。
正文( TEXT)段:指令 数据( DATA)段:初始化的全局静态数据 BSS段:未初始化的全局数据 栈空间
三种内存分配模式(2)
栈(Stack)分配:调用程序的地址信息,函数 参数的内存分配。
整个栈空间已在进程创建时分配好。进程刚启 动时,栈空间是空的,里面没有实体。
在进程运行期间,对具体实体的栈分配是进程 自行生成(压栈)和释放(弹出)实体,系统 并不参与。
Buffer Overflow
普遍性1999年,CERT安全建议中50%以上同 它有关。
严重性获得系统最高权限。 没有有效预防措施
C语言问题 程序员编程习惯,安全意识薄弱
安全漏洞数量(CERT)
40
35
Other errors
30
Buffer overflow
25
20
15
10
5
1999年,Dark spyrit AKA Barnaby jack提出使用系统核心dll中 的“jmp esp”指令完成shellcode跳转的想法,开创了Win32平 台下缓冲区溢出的新思路,大量windows平台下缓冲区溢出漏 洞被利用。
2001年8月,“红色代码”利用微软IIS漏洞产生缓冲区存溢出, 成为攻击企业网络的“罪魁祸首”。
程序员的编程习惯:忽略对输入数据进行严格 的边界检查。
发展历史
1988年,Morris蠕虫攻击VAX 和 Sun机器,使当时Internet的 大约10%崩溃。
1996年,Elias Levy发表文章“Smashing the stack for fun and profit”,显示了很多程序都存在缓冲区溢出的危险。缓冲区溢 出攻击被广泛关注。
0 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002
内容提要
1 缓冲区溢出概述 2 缓冲区溢出攻击原理 3 缓冲区溢出攻击类型 4 缓冲区溢出攻击防御措施
三种内存分配模式(1)
静态分配:在进程创建时由系统一次性分配的 整块静态内存,这块空间在进程运行期间保持 不变。包括:
三种内存分配模式比较
静态分配 栈分配
堆分配
空间的生成 进程创建时 实体生成时间 进程创建时
进程创建时 进程运行时
用一点分配 一点
进程运行时
实体生成者 操作系统
生命期
永久
进程 临时
进程申请/系 统实施
完全可控
访问方式
标识
标识
指针
内存布局—不同区域
: 堆栈 保存调用程序的地址信息,所需要的变量,其它
只要压入的实体的总长度不超过栈空间尺寸, 栈分配就与系统无关。如果超过了,就会引发 栈溢出错误。
三种内存分配模式(3)
堆(Heap)分配:当进程需要生成实体时,向系 统申请分配空间;不再需要该实体时,可以向 系统申请回收这块空间。
堆分配使用特定的函数:malloc();new()。 堆分配的空间利用率最高。