网络攻防原理与技术课件版第10章缓冲区溢出攻击.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《网络攻防原理与技术课件版第10章缓冲区溢出攻击.pptx》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 攻防 原理 技术 课件 10 缓冲区 溢出 攻击
- 资源描述:
-
1、第 十 章 缓冲区溢出攻击内容提要缓冲区溢出概述缓冲区溢出概述1缓冲区溢出攻击原理缓冲区溢出攻击原理2缓冲区溢出缓冲区溢出攻击防御措施攻击防御措施3概念 缓冲区或缓存(Buffer):用户为程序运行时在计算机中申请得的一段连续的内存,它保存了给定类型的数据。缓冲区溢出(Buffer Overflow):计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。缓冲区溢出攻击:(一般情况下,缓冲区溢出引起程序运行错误,但是在攻击者的设计下)向程序的缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的正常执行流程,使程序转而执行其他的指令,以达到攻击的目的。缓冲
2、区溢出的根源 溢出的根源在于编程:如果缓冲区被写满,而程序没有去检查缓冲区边界,也没有停止接收数据,这时缓冲区溢出就会发生。Unix和MS Windows系统由于要实现更好的性能和功能,往往在数据段中动态地放入可执行的代码。C/C+语言问题:对数组下标访问边界不做检查或者少做检查。程序员的编程习惯:忽略对输入数据进行严格的边界检查。发展历史 1988年,Morris蠕虫攻击VAX 和 Sun机器,使当时Internet的大约10%崩溃。1996年,Elias Levy发表文章“Smashing the stack for fun and profit”,显示了很多程序都存在缓冲区溢出的危险。缓
3、冲区溢出攻击被广泛关注。1999年,Dark spyrit AKA Barnaby jack提出使用系统核心dll中的“jmp esp”指令完成shellcode跳转的想法,开创了Win32平台下缓冲区溢出的新思路,大量windows平台下缓冲区溢出漏洞被利用。2001年8月,“红色代码”利用微软IIS漏洞产生缓冲区存溢出,成为攻击企业网络的“罪魁祸首”。发展历史 2003年1月,Slammer蠕虫利用微软SQL漏洞产生缓冲区溢出对全球互联网产生冲击。同年,“冲击波”蠕虫病毒利用微软RPC远程调用存在的缓冲区漏洞对Windows 2000/XP、Windows Server 2003进行攻击,
4、波及全球网络 2004年5月爆发的“振荡波”利用了Windows系统的活动目录服务缓冲区溢出漏洞。2005年8月利用Windows即插即用缓冲区溢出漏洞的“狙击波”被称为史上最快利用微软漏洞进行攻击的恶意代码 2008年底至2009年的Conficker蠕虫利用的是Windows处理远程RPC请求时的漏洞(MS08-067)。危害性和普遍性 缓冲区溢出漏洞可以使一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权。缓冲区溢出攻击占了远程网络攻击的绝大多数,操作系统中超过50%的安全漏洞都是由内存溢出引起的。任何平台、任何程序都可能存在缓冲区溢出的漏洞。1998年Lincoln实
5、验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。而在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,至少有半数的建议是和缓冲区溢出有关的。危害性和普遍性 普遍性1999年,CERT安全建议中50%以上同它有关。严重性获得系统最高权限。没有有效预防措施 C语言问题 程序员编程习惯,安全意识薄弱安全漏洞数量(CERT)05101520253035401988 1989 1990 1991199219931994 1995199719981999 2000200220011996Other errorsBuffer overflow危害性和普遍性危害性和普遍
6、性 近年来,虽然缓冲区溢出漏洞的数量占比有所减少,但仍然是一类危害性极大的、数量众多的安全漏洞危害性和普遍性内容提要缓冲区溢出概述1缓冲区溢出攻击原理2缓冲区溢出缓冲区溢出攻击防御措施攻击防御措施3三种内存分配模式(1)静态分配:在进程创建时由系统一次性分配的整块静态内存,这块空间在进程运行期间保持不变。包括:正文(TEXT)段:指令 数据(DATA)段:初始化的全局静态数据 BSS段:未初始化的全局数据 栈空间三种内存分配模式(2)堆栈(Stack)分配:调用程序的地址信息,函数参数的内存分配。整个堆栈空间已在进程创建时分配好。进程刚启动时,堆栈空间是空的,里面无实体。在进程运行期间,对实体
7、的堆栈分配是进程自行生成(压栈)和释放(弹出)实体,系统并不参与。只要压入的实体的总长度不超过堆栈空间大小,堆栈分配就与系统无关。若超过,就会引发堆栈溢出错误。三种内存分配模式(3)堆(Heap)分配:当进程需要生成实体时,向系统申请分配空间;不再需要该实体时,可以向系统申请回收这块空间。堆分配使用特定的函数:malloc();new()。堆分配的空间利用率最高。三种内存分配模式比较静态分配静态分配 栈分配栈分配 堆分配堆分配 空间的生成空间的生成 进程创建时进程创建时进程创建时进程创建时用一点分配用一点分配一点一点 实体生成时间实体生成时间 进程创建时进程创建时 进程运行时进程运行时 进程运
8、行时进程运行时 实体生成者实体生成者 操作系统操作系统 进程进程 进程申请进程申请/系系统实施统实施 生命期生命期 永久永久 临时临时 完全可控完全可控 访问方式访问方式标识标识标识标识指针指针内存布局16内存布局不同区域:堆栈堆栈保存调用程序的地址信息,所需要的变量,其它保存调用程序的地址信息,所需要的变量,其它帧指针等帧指针等:HEAP动态内存分配,本地变量动态内存分配,本地变量:BSS符号块起始地址符号块起始地址:未初始化全局数据段:未初始化全局数据段,即:即:int foo;float baz;:DATA初始化全局静态数据,即:初始化全局静态数据,即:int shit=9,char h
9、ead=”ugh”;:TEXT机器指令机器指令=操作码操作码+操作数;操作数;read-only编译时编译时分配分配执行时执行时分配分配内存布局ArgumentsVariablesenvironmentstackHeapBSSDatatext(code)Adresses hautesAdresses bassesuserstackframe代码区代码区数据区数据区栈栈堆堆缓冲区溢出攻击原理 缓冲区溢出的目的在于扰乱具有某些特权的运行程序的执行流程,让攻击者取得程序的控制权,两个步骤:(1)在程序的地址空间(堆栈、堆、BSS段等)里植 入攻击代码,或植入攻击代码所需的攻击参数(如果攻击代码已存在
10、于目标程序中);()改变程序的执行流程,转去执行攻击代码缓冲区溢出攻击原理 代码注入攻击 攻击者向缓冲区写入的数据包含了攻击代码(可执行的二进制代码,通常称为“shellcode”),当发生缓冲区溢出时,溢出的数据覆盖掉一个可执行程序的入口地址(如函数的返回地址,函数指针变量等等),使得该地址指向shellcode,从而当程序试图通过该入口地址执行代码时,就会执行攻击者的shellcode缓冲区溢出攻击原理 ROP 攻击 攻击代码已经在被攻击的程序中了(通常是一些系统函数,如system(),exec()等),攻击者所要做的只是为攻击代码传递它所需要的参数,然后用一个系统函数的地址覆盖可执行代
11、码的入口地址,通过巧妙的构造可以使程序用预设的参数调用系统函数,比如用“cmd”作为参数调用system()函数,也称为ret2libc(Return-to-libc)主要分为:堆栈溢出 堆溢出 BSS段溢出 格式化字符串溢出攻击缓冲区溢出攻击分类一、堆栈溢出堆栈的相关概念 SP:堆栈指针,指向堆栈的顶部;堆栈的增长方向:向下增长(向内存低地址)FP:帧指针,指向堆栈的帧头。堆栈布局堆栈的相关概念函数调用过程最先压入栈最先压入栈最后压入栈最后压入栈 函数调用时堆栈处理规定函数调用过程C语言默认方法函数调用的栈帧变化 假设过程P调用过程Q:Q的参数放在P的栈帧中;当P调用Q时,P中的返回地址被压
12、入栈中,形成P的栈帧的末尾;返回地址就是当程序从Q返回时应继续执行的地方;Q的栈帧从保存的帧指针的值开始,后面是保存的其他寄存器的值。假设有一个程序,其函数调用顺序如下:main()-func_1()-func_2()-func_3()栈布局C语言函数调用例子void function(int a,int b,int c)char buffer15;char buffer210;void main()function(1,2,3);C语言函数调用过程 按c、b、a的顺序将参数压栈;把指令指针(IP)压栈,IP也称为返回地址(RET);把FP压栈,被保存的FP称为SFP;将当前的SP复制到FP,
13、成为新的帧指针;将SP的值减小,为局部变量保留空间。C语言函数调用过程buffer1cbaretsfpbuffer2堆栈顶部堆栈顶部(内存低端内存低端)堆栈底部堆栈底部(内存高端内存高端)缓冲区溢出攻击的原理 攻击的原理:通过往程序缓冲区写入超过其边界的内容,造成缓冲区溢出,使得程序转而执行攻击者指定的代码,通常是为攻击者打开远程连接的ShellCode。关键点:存在能够被攻击的数据缓存 要有被执行的攻击代码堆栈溢出原理堆栈溢出代码1/函数定义void function(char*str)char buffer16;strcpy(buffer,str);/主函数主函数void main()ch
14、ar large_string256;int i;for(i=0;i 1)copy(argv1);堆栈溢出示例代码2buffer0buffer0buffer511buffer511previous fpprevious fpReturn Return addressaddressargv1argv1spfpattackcodeStack growthMemory growth 改变函数指针变量堆栈溢出示例代码3堆栈溢出示例代码3int good(const char*str)copy(char*msg)int(*fptr)(const char*str);char buffer512;fptr
15、=(int(*)(const char*str)good;strcpy(buffer,msg);(void)(*fptr)(buffer);main(int argc,char*argv)if(argc1)copy(argv1);堆栈溢出示例代码3buffer0buffer0buffer511buffer511fptrfptrprevious fpprevious fpReturn Return addressaddressargv1argv1spfpattackcodeStack growthMemory growthShell Code 改变程序流程后希望得到Shell 首先把想要执行的代
16、码放到我们想使其溢出的缓冲区里;然后覆盖函数的返回地址,使其指向这个缓冲区(希望执行的代码,通常是shell Code)Shell Codevoid main()char*str2=”/bin/sh”,0;exec(“/bin/sh”,str,0);char shellcode=“xebx2ax5ex89x76x08xc6x46x07x00 xc7x46x0cx00 x00 x00”“x00 xb8x0bx00 x00 x00 x89xf3x8dx4ex08x8dx56x0cxcdx80”“xb8x01x00 x00 x00 xbbx00 x00 x00 x00 xcdx80 xe8xdlxf
17、fxff”“xffx2fx62x69x6ex2fx73x68x00 x89xecx5dxc3”;编译后反编译编译后反编译堆栈溢出过程分析示例 示例环境:操作系统:Windows 7 Professional Service Pack 1 编译器:VC+6.0 目的:掌握动态调试方法,理解函数调用过程中堆栈和关键寄存器的变化以及堆栈溢出原理堆栈溢出分析示例 源代码:堆栈溢出分析示例运行结果是什么?溢出过程分析堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 溢出过程分析堆栈溢出分
18、析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例二、堆溢出堆溢出 当我们需要较大的缓冲区或在写代码时不知道包含在缓冲区中对象的大小,常常要使用堆。堆没有压栈和入栈
展开阅读全文