书签 分享 收藏 举报 版权申诉 / 127
上传文档赚钱

类型网络攻防原理与技术课件版第10章缓冲区溢出攻击.pptx

  • 上传人(卖家):晟晟文业
  • 文档编号:4091231
  • 上传时间:2022-11-10
  • 格式:PPTX
  • 页数:127
  • 大小:2.93MB
  • 【下载声明】
    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、析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例二、堆溢出堆溢出 当我们需要较大的缓冲区或在写代码时不知道包含在缓冲区中对象的大小,常常要使用堆。堆没有压栈和入栈

    19、操作,而是分配和回收内存。C语言中使用malloc()和free()函数实现内存的动态分配和回收,C+语言使用new()和delete()函数来实现相同的功能。堆的特点 堆的增长方向:从底到高(与栈相反)堆的分配和释放可以由用户自由控制 堆的空间不一定连续 堆申请函数返回指向堆内存的指针,后续对于内存的读写等操作需要通过此指针进行 不同的系统有着不同的堆管理机制HeapLinux堆Linux堆 堆表用来索引堆块,表中包含索引堆块的大小、位置、状态等信息 位于堆区的起始位置,堆表分为两种空闲双向链表Freelist(空表 128条)和快速单向链表Lookaside(快表最多只有四项)堆表 堆块分

    20、配可以分为三类:快表分配、普通空表分配和零号空表(free0分配)堆块分配 释放堆块的操作包括将堆块状态改为空闲,链入相应的堆表。堆块释放 当堆管理系统发现两个空闲堆块相邻时,就会进行堆块合并操作,包括,将堆块从链表中卸下、合并、调整新堆块块首信息、重新链入空表堆块合并 堆溢出是指程序向某个堆块中写入的字节数超过了堆块本身可使用的字节数(之所以是可使用而不是用户申请的字节数,是因为堆管理器会对用户所申请的字节数进行调整,这也导致可利用的字节数都不小于用户申请的字节数),因而导致了数据溢出,并覆盖到物理相邻的高地址的下一个堆块堆溢出 前提条件:程序向堆上写入数据 写入的数据大小没有被良好地控制

    21、利用策略 覆盖与其物理相邻的下一个 chunk 的内容 利用堆中的机制(如 unlink 等)来实现任意地址写入(Write-Anything-Anywhere)或控制堆块中的内容等效果,从而来控制程序的执行流堆溢出 用精心构造的数据去溢出下一个块的块首,改写块首中的前向指针和后向指针,这种能够向内存任意位置写入任意数据的机会叫DWORD SHOOT堆溢出-DWORD SHOOTint remove(ListNode*node)node-blink-flink=node-flink;node-flink-blink=node-blink;堆溢出-DWORD SHOOT堆溢出-DWORD SHO

    22、OT 触发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*buf2=(char*)malloc(BUFFER-SIZE);diff=(u-long)buf2-(u-long)buf1;printf(buf1=%p,buf2=%p,diff=0 x%x(%d)byt

    23、es 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 个b填充buf1*/memset(buf1,b,(u-int)(diff+OVERLAYSIZE);printf(after overflow:buf2=%s n,buf2);return 0;堆溢出实例 运行结果:buf1=0 x8049858,buf2=0 x8049870,diff=0 x18(

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

    25、随不同的系统环境而不同。buf1溢出后,buf2的前8字节也被改写为bbbbbbbb,buf2内部的部分内容也被修改为b。堆溢出实例 示意图:堆溢出n堆溢出不如栈溢出流行,原因在于:堆溢出不如栈溢出流行,原因在于:n比栈溢出难度更大比栈溢出难度更大n需要结合其他的技术需要结合其他的技术n对于内存中变量的组织方式有一定的要求对于内存中变量的组织方式有一定的要求堆溢出堆溢出三、BSS段溢出BSS溢出 BSS段存放全局和静态的未初始化变量,变量与变量之间是连续存放的,没有保留空间。这样定义的两个字符数组即是位于BSS段:static char buf116,buf216;如果事先向buf2中写入16

    26、个字符A,之后再往buf1中写入24个B,由于变量之间是连续存放的,静态字符数组buf1溢出后,就会覆盖其相邻区域字符数组buf2的值。利用这一点,攻击者可以通过改写BSS中的指针或函数指针等方式,改变程序原先的执行流程,使指针跳转到特定的内存地址并执行指定操作。四、格式化字符串溢出格式化串溢出 与前面三种溢出不同的是,这种溢出漏洞是利用了编程语言自身存在的安全问题。格式化串溢出源自*printf()类函数的参数格式问题(如printf、fprintf、sprintf等)。int printf(const char*format,arg1,arg2,);它们将根据format的内容(%s,%d

    27、,%p,%x,%n,),将数据格式化后输出。问题在于:*printf()函数并不能确定数据参数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,num,&num);pr

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

    29、溢出实例 如果将第二个printf语句修改为:printf(%.20d%n n,num);/注意,这里没有压num的地址入栈 则运行的结果为:Before:num=0 x61616161 Segmentation fault(core dumped)/执行第二个printf()时发生段错误了 原因:printf()将堆栈中main()函数的变量num当作了%n所对应的参数,因此会将0 x14保存到地址0 x61616161中去,而0 x61616161是不能访问的地址,因此系统提示发生段错误。如果可以控制num的内容,那么就意味着可以修改任意地址(当然是允许写入的地址)的内容。格式化串溢出n实

    30、际应用中,如果程序将用户的输入错误地放实际应用中,如果程序将用户的输入错误地放在格式化串的位置,就会造成溢出攻击。在格式化串的位置,就会造成溢出攻击。n如果攻击者可以事先构造好可以攻击的代码如果攻击者可以事先构造好可以攻击的代码shellcode,如果可以将返回地址覆盖成,如果可以将返回地址覆盖成shellcode的起始地址,当缓冲区溢出发生后,的起始地址,当缓冲区溢出发生后,程序就会跳到精心设计好的程序就会跳到精心设计好的shellcode处执行,处执行,达到攻击的目的。达到攻击的目的。五、整数溢出(扩展)整数溢出:当一个整数值大于或者小于其范围时,就会产生“回绕”,即溢出。整数:有符号整数

    31、(最高位用0表示正数,1表示负数)和无符号整数 当使用可能会发生溢出的整数变量来分配内存、限制字符串操作范围或作为指向缓冲区的指针时,可能会发生缓冲区溢出整数溢出 示例:下面的程序运行结果是什么?整数溢出上溢 示例:下面的程序运行结果是什么?整数溢出下溢 示例:下面的程序运行结果是什么?整数溢出截断 示例:当Len是一个负数时会发生什么?整数溢出符号问题内容提要缓冲区溢出概述1缓冲区溢出攻击原理2缓冲区溢出攻击防御措施3防御策略 系统管理上的防御策略 关闭不需要的特权程序 及时给程序漏洞打补丁 程序开发中的防御策略 编写正确的代码 非执行的缓冲区 数组边界检查 程序指针完整性检查 其它方法1、

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

    33、。已有这方面的一些高级的查错工具,如fault injection等。4、非执行的缓冲区 通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行被植入被攻击程序输入缓冲区的代码,称为非执行的缓冲区技术。信号传递:Linux通过向进程堆栈释放代码后引发中断来执行堆栈中的代码来实现向进程发送Unix信号。GCC的在线重用:gcc在堆栈区里放置了可执行的代码作为在线重用之用,关闭该功能不产生任何问题。非执行堆栈保护可有效地对付把代码植入自动变量的溢出攻击,而对于其他形式的攻击则没有效果。5、数组边界检查 数组边界检查能防止所有的缓冲区溢出的产生和攻击。方法包括:C的数组边界检查(Jone

    34、s&Kelly);内存存取检查(Purify 工具):使用“目标代码插入”技术来检查所有的内存存取;类型-安全语言:Java,C#等。6、指针完整性检查 程序指针完整性检查:阻止由于函数返回地址或函数指针的改变而导致的程序执行流程的改变。原理:在每次在程序指针被引用之前先检测该指针是否已被恶意改动过,如果发现被改动,程序就拒绝执行。因此即使一个攻击者成功地改变程序的指针,由于系统事先检测到了指针改变,因此这个指针不会被使用。三个方向:堆栈检测、堆栈保护、保护指针7、其它防御方法 改进标准库 比如改进C语言函数库,对具有缓冲区溢出攻击隐患的系统函数如gets(),sprintf(),strcpy

    35、(),strcat(),fscanf(),scanf(),vsprintf()等进行改进,开发出更安全的封装了若干已知易受堆栈溢出攻击的库函数。分割控制和数据堆栈 将堆栈分割为两个堆栈,一个用于存储控制信息(如返回地址),另一个用于控制其他所有数据。使堆栈向高地址增长 使用堆栈压入数据时向高地址方向前进,那么无论缓冲区如何溢出,都不可能覆盖低地址处的函数返回地址指针,也就避免了缓冲区溢出攻击。但这种方法仍然无法防范利用堆和静态数据段的缓冲区进行溢出的攻击。n两类防护技术两类防护技术n被动防护技术:典型代表有插入被动防护技术:典型代表有插入canary 值值、存储、存储RETADDR 值、指针前

    36、后加值、指针前后加guardzone 和低脂和低脂指针指针n主动防护技术:更换动态链接库、加密指针主动防护技术:更换动态链接库、加密指针型数据、随机化内存地址、去堆栈布局可预型数据、随机化内存地址、去堆栈布局可预测性测性.缓冲区溢出攻击防御技术缓冲区溢出攻击防御技术缓冲区溢出攻击防御技术缓冲区溢出攻击防御技术缓冲区溢出攻击防御技术DEP与ASLRIn systems software,if an attacker finds a memory safety vulnerability in code,the return address can be hijacked to target an

    37、 attacker defined address.It is difficult from here to directly execute a malicious payload in Windows thanks to existing mitigations including Data Execution Prevention(DEP)and Address Space Layout Randomization(ASLR),but control can be transferred to snippets of code(gadgets)in executable memory.Attackers can find gadgets that end with the RET instruction(or other branches),and chain multiple gadgets to perform a malicious action(turn off a mitigation),with the end goal of running arbitrary native code微软堆栈硬件保护微软堆栈硬件保护微软堆栈硬件保护本章小结作业

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:网络攻防原理与技术课件版第10章缓冲区溢出攻击.pptx
    链接地址:https://www.163wenku.com/p-4091231.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库