网络攻防原理与技术课件版第10章缓冲区溢出攻击_第1页
网络攻防原理与技术课件版第10章缓冲区溢出攻击_第2页
网络攻防原理与技术课件版第10章缓冲区溢出攻击_第3页
网络攻防原理与技术课件版第10章缓冲区溢出攻击_第4页
网络攻防原理与技术课件版第10章缓冲区溢出攻击_第5页
已阅读5页,还剩122页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第 十 章 缓冲区溢出攻击第 十 章 缓冲区溢出攻击内容提要缓冲区溢出概述1缓冲区溢出攻击原理2缓冲区溢出攻击防御措施3内容提要缓冲区溢出概述1缓冲区溢出攻击原理2缓冲区溢出攻击防概念缓冲区或缓存 (Buffer):用户为程序运行时在计算机中申请得的一段连续的内存,它保存了给定类型的数据。缓冲区溢出(Buffer Overflow):计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。缓冲区溢出攻击:(一般情况下,缓冲区溢出引起程序运行错误,但是在攻击者的设计下)向程序的缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的正常执行流程,使程序转而执行其

2、他的指令,以达到攻击的目的。概念缓冲区或缓存 (Buffer):用户为程序运行时在计算机缓冲区溢出的根源溢出的根源在于编程:如果缓冲区被写满,而程序没有去检查缓冲区边界,也没有停止接收数据,这时缓冲区溢出就会发生。Unix和MS Windows系统由于要实现更好的性能和功能,往往在数据段中动态地放入可执行的代码。C/C+语言问题:对数组下标访问边界不做检查或者少做检查。程序员的编程习惯:忽略对输入数据进行严格的边界检查。缓冲区溢出的根源溢出的根源在于编程:如果缓冲区被写满,而程序发展历史1988年,Morris蠕虫攻击VAX 和 Sun机器,使当时Internet的大约10%崩溃。1996年,

3、Elias Levy发表文章“Smashing the stack for fun and profit”,显示了很多程序都存在缓冲区溢出的危险。缓冲区溢出攻击被广泛关注。1999年,Dark spyrit AKA Barnaby jack提出使用系统核心dll中的“jmp esp”指令完成shellcode跳转的想法,开创了Win32平台下缓冲区溢出的新思路,大量windows平台下缓冲区溢出漏洞被利用。2001年8月,“红色代码”利用微软IIS漏洞产生缓冲区存溢出,成为攻击企业网络的“罪魁祸首”。 发展历史1988年,Morris蠕虫攻击VAX 和 Sun机发展历史2003年1月,Slam

4、mer蠕虫利用微软SQL漏洞产生缓冲区溢出对全球互联网产生冲击。同年,“冲击波”蠕虫病毒利用微软RPC远程调用存在的缓冲区漏洞对Windows 2000/XP、Windows Server 2003进行攻击,波及全球网络2004年5月爆发的“振荡波”利用了Windows系统的活动目录服务缓冲区溢出漏洞。2005年8月利用Windows即插即用缓冲区溢出漏洞的“狙击波”被称为史上最快利用微软漏洞进行攻击的恶意代码2008年底至2009年的Conficker蠕虫利用的是Windows处理远程RPC请求时的漏洞(MS08-067) 。发展历史2003年1月,Slammer蠕虫利用微软SQL漏洞危害性

5、和普遍性缓冲区溢出漏洞可以使一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权。缓冲区溢出攻击占了远程网络攻击的绝大多数,操作系统中超过50%的安全漏洞都是由内存溢出引起的。 任何平台、任何程序都可能存在缓冲区溢出的漏洞。1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。而在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,至少有半数的建议是和缓冲区溢出有关的。危害性和普遍性缓冲区溢出漏洞可以使一个匿名的Internet危害性和普遍性普遍性1999年,CERT安全建议中50%以上同它有关。严重性获得系统最高权限。

6、没有有效预防措施C语言问题程序员编程习惯,安全意识薄弱危害性和普遍性普遍性1999年,CERT安全建议中50%以安全漏洞数量(CERT)危害性和普遍性安全漏洞数量(CERT)危害性和普遍性近年来,虽然缓冲区溢出漏洞的数量占比有所减少,但仍然是一类危害性极大的、数量众多的安全漏洞危害性和普遍性近年来,虽然缓冲区溢出漏洞的数量占比有所减少,但仍然是一类危内容提要缓冲区溢出概述1缓冲区溢出攻击原理2缓冲区溢出攻击防御措施3内容提要缓冲区溢出概述1缓冲区溢出攻击原理2缓冲区溢出攻击防三种内存分配模式(1)静态分配:在进程创建时由系统一次性分配的整块静态内存,这块空间在进程运行期间保持不变。包括:正文(

7、 TEXT)段:指令数据( DATA)段:初始化的全局静态数据BSS段:未初始化的全局数据栈空间三种内存分配模式(1)静态分配:在进程创建时由系统一次性分配三种内存分配模式(2)堆栈(Stack)分配:调用程序的地址信息,函数参数的内存分配。整个堆栈空间已在进程创建时分配好。进程刚启动时,堆栈空间是空的,里面无实体。 在进程运行期间,对实体的堆栈分配是进程自行生成(压栈)和释放(弹出)实体,系统并不参与。 只要压入的实体的总长度不超过堆栈空间大小,堆栈分配就与系统无关。若超过,就会引发堆栈溢出错误。三种内存分配模式(2)堆栈(Stack)分配:调用程序的地址三种内存分配模式(3)堆(Heap)

8、分配:当进程需要生成实体时,向系统申请分配空间;不再需要该实体时,可以向系统申请回收这块空间。堆分配使用特定的函数:malloc();new()。 堆分配的空间利用率最高。三种内存分配模式(3)堆(Heap)分配:当进程需要生成实体三种内存分配模式比较静态分配 栈分配 堆分配 空间的生成 进程创建时进程创建时用一点分配一点 实体生成时间 进程创建时 进程运行时 进程运行时 实体生成者 操作系统 进程 进程申请/系统实施 生命期 永久 临时 完全可控 访问方式标识标识指针三种内存分配模式比较静态分配 栈分配 堆分配 空间的生成 进内存布局16内存布局16内存布局不同区域: 堆栈保存调用程序的地址

9、信息,所需要的变量,其它帧指针等: HEAP动态内存分配,本地变量: BSS符号块起始地址 :未初始化全局数据段,即:int foo; float baz;: DATA初始化全局静态数据,即:int shit=9,char head=”ugh”;: TEXT机器指令 = 操作码 + 操作数;read-only编译时分配执行时分配内存布局不同区域: 堆栈保存调用程序的地址信息,所需内存布局ArgumentsVariablesenvironmentstackHeapBSSDatatext(code)Adresses hautesAdresses bassesuserstackframe代码区数据区

10、栈堆内存布局ArgumentsstackHeapBSSDatat缓冲区溢出攻击原理缓冲区溢出的目的在于扰乱具有某些特权的运行程序的执行流程,让攻击者取得程序的控制权,两个步骤:(1)在程序的地址空间(堆栈、堆、BSS段等)里植 入攻击代码,或植入攻击代码所需的攻击参数(如果攻击代码已存在于目标程序中);()改变程序的执行流程,转去执行攻击代码缓冲区溢出攻击原理缓冲区溢出的目的在于扰乱具有某些特权的运行缓冲区溢出攻击原理代码注入攻击攻击者向缓冲区写入的数据包含了攻击代码(可执行的二进制代码,通常称为“shellcode”),当发生缓冲区溢出时,溢出的数据覆盖掉一个可执行程序的入口地址(如函数的返

11、回地址,函数指针变量等等),使得该地址指向shellcode,从而当程序试图通过该入口地址执行代码时,就会执行攻击者的shellcode缓冲区溢出攻击原理代码注入攻击缓冲区溢出攻击原理ROP 攻击 攻击代码已经在被攻击的程序中了(通常是一些系统函数,如system(), exec()等),攻击者所要做的只是为攻击代码传递它所需要的参数,然后用一个系统函数的地址覆盖可执行代码的入口地址,通过巧妙的构造可以使程序用预设的参数调用系统函数,比如用“cmd”作为参数调用system()函数,也称为ret2libc(Return-to-libc)缓冲区溢出攻击原理ROP 攻击 主要分为:堆栈溢出堆溢出B

12、SS段溢出格式化字符串溢出攻击缓冲区溢出攻击分类主要分为:缓冲区溢出攻击分类一、堆栈溢出一、堆栈溢出堆栈的相关概念SP:堆栈指针,指向堆栈的顶部;堆栈的增长方向:向下增长(向内存低地址)FP:帧指针,指向堆栈的帧头。 堆栈的相关概念SP:堆栈指针,指向堆栈的顶部;堆栈布局堆栈的相关概念堆栈布局堆栈的相关概念函数调用过程Func函数中的局部变量调用Func函数前的EBP退出Func函数后的返回地址传递给Func的实参内存低地址内存高地址最先压入栈最后压入栈函数调用过程Func函数中的局部变量调用Func函数前的EB函数调用时堆栈处理规定函数调用过程C语言默认方法函数调用时堆栈处理规定函数调用过程

13、C语言默认方法函数调用的栈帧变化假设过程P调用过程Q:Q的参数放在P的栈帧中;当P调用Q时,P中的返回地址被压入栈中,形成P的栈帧的末尾;返回地址就是当程序从Q返回时应继续执行的地方;Q的栈帧从保存的帧指针的值开始,后面是保存的其他寄存器的值。函数调用的栈帧变化假设过程P调用过程Q:假设有一个程序,其函数调用顺序如下: main() - func_1() - func_2() - func_3() 栈布局假设有一个程序,其函数调用顺序如下: 栈布局C语言函数调用例子void function(int a, int b, int c) char buffer15; char buffer210;

14、 void main() function(1,2,3); C语言函数调用例子void function(int a, C语言函数调用过程按c、b、a的顺序将参数压栈;把指令指针(IP)压栈,IP也称为返回地址(RET);把FP压栈,被保存的FP称为SFP;将当前的SP复制到FP,成为新的帧指针;将SP的值减小,为局部变量保留空间。C语言函数调用过程按c、b、a的顺序将参数压栈;C语言函数调用过程buffer1cbaretsfpbuffer2堆栈顶部(内存低端)堆栈底部(内存高端)C语言函数调用过程buffer1cbaretsfpbuffe缓冲区溢出攻击的原理攻击的原理:通过往程序缓冲区写入超

15、过其边界的内容,造成缓冲区溢出,使得程序转而执行攻击者指定的代码,通常是为攻击者打开远程连接的ShellCode。关键点:存在能够被攻击的数据缓存要有被执行的攻击代码缓冲区溢出攻击的原理攻击的原理:堆栈溢出原理堆栈溢出原理堆栈溢出代码1/ 函数定义void function(char *str) char buffer16;strcpy(buffer,str);/ 主函数void main() char large_string256;int i;for( i = 0; i 1) copy(argv1); 堆栈溢出示例代码2copy (char* msg)堆栈溢出示例代码2buffer0buf

16、fer511previous fpReturn addressargv1spfpattackcodeStack growthMemory growth堆栈溢出示例代码2buffer0previous fpR改变函数指针变量堆栈溢出示例代码3改变函数指针变量堆栈溢出示例代码3堆栈溢出示例代码3int good (const char* str) copy(char* msg) int (*fptr)(const char* str); char buffer512; fptr = (int(*)(const char* str)good; strcpy(buffer, msg); (void)(

17、*fptr)(buffer);main(int argc, char* argv)if(argc1) copy(argv1);堆栈溢出示例代码3int good (const char*堆栈溢出示例代码3buffer0buffer511fptrprevious fpReturn addressargv1spfpattackcodeStack growthMemory growth堆栈溢出示例代码3buffer0fptrpreviousShell Code改变程序流程后希望得到Shell首先把想要执行的代码放到我们想使其溢出的缓冲区里;然后覆盖函数的返回地址, 使其指向这个缓冲区(希望执行的代码

18、,通常是shell Code)Shell Code改变程序流程后希望得到ShellShell 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 xe8xdlxffxff”“xffx2fx6

19、2x69x6ex2fx73x68x00 x89xecx5dxc3”; 编译后反编译Shell Codevoid main()char shel堆栈溢出过程分析示例网络攻防原理与技术课件最新版第10章缓冲区溢出攻击示例环境:操作系统:Windows 7 Professional Service Pack 1编译器:VC+ 6.0目的:掌握动态调试方法,理解函数调用过程中堆栈和关键寄存器的变化以及堆栈溢出原理堆栈溢出分析示例示例环境:堆栈溢出分析示例源代码:堆栈溢出分析示例运行结果是什么?源代码:堆栈溢出分析示例运行结果是什么?溢出过程分析堆栈溢出分析示例溢出过程分析堆栈溢出分析示例溢出过程分析堆

20、栈溢出分析示例溢出过程分析堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例溢出过程分析堆栈溢出分析示例溢出过程分析堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例溢出过程分析堆栈溢出分析示例溢出过程分析堆栈溢出分析示例溢出过程分析堆栈溢出分析示例溢出过程分析堆栈溢出分析示例溢出过程分析堆栈溢出分析示例溢出过程分析堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例溢出过程分析堆栈溢出分析示例溢出过程分析堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例堆栈变化过程堆栈溢出分析示

21、例堆栈变化过程堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例溢出过程分析堆栈溢出分析示例溢出过程分析堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例溢出过程分析堆栈溢出分析示例溢出过程分析堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例溢出过程分析堆栈溢出分析示例溢出过程分析堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例溢出过程分析堆栈溢出分析示例溢出过程分析堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例溢出过程分析堆栈溢出分析示例溢出过程分析堆栈溢出分析示例堆栈变化过程堆栈溢出分析示例堆栈变化过

22、程堆栈溢出分析示例二、堆溢出二、堆溢出堆溢出当我们需要较大的缓冲区或在写代码时不知道包含在缓冲区中对象的大小,常常要使用堆。 堆没有压栈和入栈操作,而是分配和回收内存。C语言中使用malloc()和free()函数实现内存的动态分配和回收,C+语言使用new()和delete()函数来实现相同的功能。 堆溢出当我们需要较大的缓冲区或在写代码时不知道包含在缓冲区中堆的特点堆的增长方向:从底到高(与栈相反)堆的分配和释放可以由用户自由控制堆的空间不一定连续堆申请函数返回指向堆内存的指针,后续对于内存的读写等操作需要通过此指针进行不同的系统有着不同的堆管理机制Heap堆的特点HeapLinux堆Li

23、nux堆Linux堆Linux堆堆表用来索引堆块,表中包含索引堆块的大小、位置、状态等信息位于堆区的起始位置,堆表分为两种空闲双向链表Freelist(空表 128条)和快速单向链表Lookaside(快表最多只有四项)堆表堆表用来索引堆块,表中包含索引堆块的大小、位置、状态等信息堆堆块分配可以分为三类:快表分配、普通空表分配和零号空表(free0分配)堆块分配堆块分配可以分为三类:快表分配、普通空表分配和零号空表(fr释放堆块的操作包括将堆块状态改为空闲,链入相应的堆表。堆块释放释放堆块的操作包括将堆块状态改为空闲,链入相应的堆表。堆块释当堆管理系统发现两个空闲堆块相邻时,就会进行堆块合并操

24、作,包括,将堆块从链表中卸下、合并、调整新堆块块首信息、重新链入空表堆块合并当堆管理系统发现两个空闲堆块相邻时,就会进行堆块合并操作,包堆溢出是指程序向某个堆块中写入的字节数超过了堆块本身可使用的字节数(之所以是可使用而不是用户申请的字节数,是因为堆管理器会对用户所申请的字节数进行调整,这也导致可利用的字节数都不小于用户申请的字节数),因而导致了数据溢出,并覆盖到物理相邻的高地址的下一个堆块堆溢出堆溢出是指程序向某个堆块中写入的字节数超过了堆块本身可使用的前提条件:程序向堆上写入数据写入的数据大小没有被良好地控制利用策略覆盖与其物理相邻的下一个 chunk 的内容利用堆中的机制(如 unlin

25、k 等 )来实现任意地址写入( Write-Anything-Anywhere)或控制堆块中的内容等效果,从而来控制程序的执行流堆溢出前提条件:堆溢出用精心构造的数据去溢出下一个块的块首,改写块首中的前向指针和后向指针,这种能够向内存任意位置写入任意数据的机会叫DWORD SHOOT堆溢出- DWORD SHOOT用精心构造的数据去溢出下一个块的块首,改写块首中的前向指针和int remove (ListNode * node) node - blink - flink = node - flink; node - flink - blink = node - blink; 堆溢出- DWOR

26、D SHOOTint remove (ListNode * node)堆溢堆溢出- DWORD SHOOT堆溢出- DWORD SHOOT触发unlink绕过系统保护堆溢出利用触发unlink堆溢出利用堆溢出实例# include # include # include # include # define BUFFER-SIZE 16# define OVERLAYSIZE 8 /* 将覆盖buf2 的前OVERLAYSIZE 个字节 */int main()u-long diff ;char * buf1 = (char * )malloc (BUFFER-SIZE) ;char * bu

27、f2 = (char * )malloc (BUFFER-SIZE) ;diff = (u-long) buf2 - (u-long) buf1 ;printf (buf1 = %p, buf2 = %p, diff = 0 x %x ( %d) bytes n, buf1, buf2, diff, diff) ;/* 将buf2 用a填充 */memset (buf2, a, BUFFER-SIZE - 1); buf2BUFFER-SIZE - 1 = 0;printf (before overflow: buf2 = %s n, buf2) ;/* 用diff + OVERLAYSIZE

28、 个b填充buf1 */memset (buf1, b, (u-int) (diff + OVERLAYSIZE) ) ;printf (after overflow: buf2 = %s n, buf2) ;return 0 ; 堆溢出实例# include 堆溢出实例运行结果: buf1 = 0 x8049858 , buf2 = 0 x8049870 , diff = 0 x18 (24) bytes before overflow: buf2 = aaaaaaaaaaaaaaa after overflow: buf2 = bbbbbbbbaaaaaaabuf2的前8个字节被覆盖了,这

29、是因为往buf1中填写的数据超出了它的边界进入了buf2的范围。由于buf2的数据仍然在有效的Heap区内,程序仍可正常结束。 堆溢出实例运行结果:堆溢出实例虽然buf1和buf2是相继分配的,但它们并不是紧挨着的,而是有8个字节的间距。这是因为,使用malloc()动态分配内存时,系统向用户返回一个内存地址,实际上在这个地址前面通常还有8字节的内部结构,用来记录分配的块长度、上一个堆的字节数以及一些标志等。这个间距可能随不同的系统环境而不同。buf1溢出后,buf2的前8字节也被改写为bbbbbbbb,buf2内部的部分内容也被修改为b。 堆溢出实例虽然buf1和buf2是相继分配的,但它们

30、并不是紧堆溢出实例示意图:堆溢出实例示意图:堆溢出堆溢出不如栈溢出流行,原因在于:比栈溢出难度更大需要结合其他的技术对于内存中变量的组织方式有一定的要求堆溢出堆溢出不如栈溢出流行,原因在于:堆溢出堆溢出三、BSS段溢出三、BSS段溢出BSS溢出BSS段存放全局和静态的未初始化变量,变量与变量之间是连续存放的,没有保留空间。这样定义的两个字符数组即是位于BSS段: static char buf116,buf216;如果事先向buf2中写入16个字符A,之后再往buf1中写入24个B,由于变量之间是连续存放的,静态字符数组buf1溢出后,就会覆盖其相邻区域字符数组buf2的值。利用这一点,攻击者

31、可以通过改写BSS中的指针或函数指针等方式,改变程序原先的执行流程,使指针跳转到特定的内存地址并执行指定操作。 BSS溢出BSS段存放全局和静态的未初始化变量,变量与变量之四、格式化字符串溢出四、格式化字符串溢出格式化串溢出与前面三种溢出不同的是,这种溢出漏洞是利用了编程语言自身存在的安全问题。格式化串溢出源自*printf()类函数的参数格式问题(如printf、fprintf、sprintf等)。int printf (const char *format, arg1, arg2, ); 它们将根据format的内容(%s,%d,%p,%x,%n,),将数据格式化后输出。问题在于:*pri

32、ntf()函数并不能确定数据参数arg1,arg2,究竟在什么地方结束,即函数本身不知道参数的个数,而只会根据format中打印格式的数目依次打印堆栈中参数format后面地址的内容。 格式化串溢出与前面三种溢出不同的是,这种溢出漏洞是利用了编程格式化串溢出实例/*程序说明:%#x:按16进制输出,并在前面加上0 x%.20d:按10进制输出,输出20位,并在前面补0%n:将显示内容的长度输出到一个变量中去*/# include main()int num= 0 x61616161 ;printf (Before : num = %#x n, num) ;printf (%.20d %n n,

33、 num, &num) ;printf (After : num = %#x n, num) ; 格式化串溢出实例/*程序说明:格式化串溢出实例当程序执行第2个printf语句时,参数压栈之后的内存布局如下:格式化串溢出实例当程序执行第2个printf语句时,参数压栈格式化串溢出实例根据C函数调用约定,参数从右向左依次压栈,所以参数&num比参数num先压入栈中。也就是说,程序中将&num (num的地址)压入栈作为printf()的第三个参数,而使用打印格式%n会将打印总长度保存到对应参数(&num)的地址中去,从而改变了num的值。 整个程序的输出结果为: Before : num = 0

34、 x6161616100000000001633771873 After : num = 0 x14变量num的值已经变成了0 x14(20)。格式化串溢出实例根据C函数调用约定,参数从右向左依次压栈,所格式化串溢出实例如果将第二个printf语句修改为: printf (%.20d %n n, num) ; /注意,这里没有压num的地址入栈 则运行的结果为: Before : num= 0 x61616161 Segmentation fault (core dumped) /执行第二个printf()时发生段错误了原因:printf()将堆栈中main()函数的变量num当作了%n所对应

35、的参数,因此会将0 x14保存到地址0 x61616161中去,而0 x61616161是不能访问的地址,因此系统提示发生段错误。如果可以控制num的内容,那么就意味着可以修改任意地址(当然是允许写入的地址)的内容。格式化串溢出实例如果将第二个printf语句修改为:格式化串溢出实际应用中,如果程序将用户的输入错误地放在格式化串的位置,就会造成溢出攻击。如果攻击者可以事先构造好可以攻击的代码shellcode,如果可以将返回地址覆盖成shellcode的起始地址,当缓冲区溢出发生后,程序就会跳到精心设计好的shellcode处执行,达到攻击的目的。 格式化串溢出实际应用中,如果程序将用户的输入

36、错误地放在格式化五、整数溢出(扩展)五、整数溢出(扩展)整数溢出:当一个整数值大于或者小于其范围时,就会产生“回绕”,即溢出。整数:有符号整数(最高位用0表示正数,1表示负数)和无符号整数当使用可能会发生溢出的整数变量来分配内存、限制字符串操作范围或作为指向缓冲区的指针时,可能会发生缓冲区溢出整数溢出整数溢出:当一个整数值大于或者小于其范围时,就会产生“回绕”示例:下面的程序运行结果是什么?整数溢出上溢示例:下面的程序运行结果是什么?整数溢出上溢示例:下面的程序运行结果是什么?整数溢出下溢示例:下面的程序运行结果是什么?整数溢出下溢示例:下面的程序运行结果是什么?整数溢出截断示例:下面的程序运

37、行结果是什么?整数溢出截断示例:当Len是一个负数时会发生什么?整数溢出符号问题示例:当Len是一个负数时会发生什么?整数溢出符号问题内容提要缓冲区溢出概述1缓冲区溢出攻击原理2缓冲区溢出攻击防御措施3内容提要缓冲区溢出概述1缓冲区溢出攻击原理2缓冲区溢出攻击防防御策略系统管理上的防御策略关闭不需要的特权程序及时给程序漏洞打补丁程序开发中的防御策略编写正确的代码非执行的缓冲区数组边界检查程序指针完整性检查其它方法防御策略系统管理上的防御策略1、关闭不需要的特权程序缓冲区溢出只有在获得更高的特权时才有意义;关闭一些不必要的特权程序就可以降低被攻击的风险。1、关闭不需要的特权程序缓冲区溢出只有在获

38、得更高的特权时才有2、及时给程序漏洞打补丁大部分的入侵是利用一些已被公布的漏洞达成的;如能及时补上这些漏洞,无疑极大的增强了系统抵抗攻击的能力。2、及时给程序漏洞打补丁大部分的入侵是利用一些已被公布的漏洞3、编写正确的代码在所有拷贝数据的地方进行数据长度和有效性的检查,确保目标缓冲区中数据不越界并有效;很多不安全程序的出现是由于调用了一些不安全的库函数。这些函数有strcpy()、sprintf()、strcat()等,用更安全的函数代替,比如用strncpy()替换strcpy() ;漏洞探测。利用一些工具,人为随机地产生一些缓冲区溢出来寻找代码的安全漏洞。已有这方面的一些高级的查错工具,如

39、fault injection等。3、编写正确的代码在所有拷贝数据的地方进行数据长度和有效性的4、非执行的缓冲区通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行被植入被攻击程序输入缓冲区的代码,称为非执行的缓冲区技术。信号传递:Linux通过向进程堆栈释放代码后引发中断来执行堆栈中的代码来实现向进程发送Unix信号。GCC的在线重用:gcc在堆栈区里放置了可执行的代码作为在线重用之用,关闭该功能不产生任何问题。非执行堆栈保护可有效地对付把代码植入自动变量的溢出攻击,而对于其他形式的攻击则没有效果。4、非执行的缓冲区通过使被攻击程序的数据段地址空间不可执行,5、数组边界检查数组边界检查能防止所有的缓冲区溢出的产生和攻击。方法包括:C的数组边界检查(Jones & Kelly );内存存取检查(Purify 工具):使用“目标代码插入”技术来检查所有的内存存取;类型-安全语言:Java,C#等。5、数组边界检查数组边界检查能防止所有的缓冲区溢出的产生和攻6、指针完整性检查程序指针完整性检查:阻止由于函数返回地址或函数指针的改变而导致的程序执行流程的改变。原理:在每次在程序指针被引用之前先检测该指针是否已被恶意改动过,如果发现被改动,程序就拒绝执行。因此即使一个攻击者成功地改变程序的指针,由于系统事先检测到了指针改变,因

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论