第4章-软件漏洞_第1页
第4章-软件漏洞_第2页
第4章-软件漏洞_第3页
第4章-软件漏洞_第4页
第4章-软件漏洞_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

第四章软件漏洞2023/2/4网络攻防技术2本章主要内容4.1概述4.2典型漏洞类型4.3溢出漏洞利用原理4.4漏洞利用保护机制4.1概述漏洞的定义:指信息系统硬件、软件、操作系统、网络协议、数据库等在设计上、实现上出现的可以被攻击者利用的错误、缺陷和疏漏。通俗一点说,漏洞就是可以被攻击利用的系统弱点。2023/2/4网络攻防技术34.1概述漏洞的分类:针对安全操作系统研究而提出的漏洞分类。将安全性漏洞和软件错误结合在一起的漏洞分类。多维度分类。广义漏洞分类。抽象分类。2023/2/4网络攻防技术44.1概述漏洞攻击通常包含3个步骤,分别是:漏洞发现(VulnerabilityDiscovery)、漏洞分析(VulnerabilityAnalysis)、漏洞利用(VulnerabilityExploit)。从导致的后果来看,漏洞可能会造成:以匿名身份直接获取系统最高权限;从普通用户提升为管理员用户;实施远程拒绝服务攻击等。2023/2/4网络攻防技术54.1概述漏洞的标准化研究:公共漏洞和暴露(CommonVulnerabilities&Exposures,CVE)通用缺陷枚举(CommonWeaknessEnumeration,CWE)2023/2/4网络攻防技术62023/2/4网络攻防技术7本章主要内容4.1概述4.2典型漏洞类型4.3溢出漏洞利用原理4.4漏洞利用保护机制4.2典型漏洞类型栈溢出(StackOverflow,CWE-121)堆溢出(HeapOverflow,CWE-122)格式化串(FormatString,CWE-134)整型溢出(IntegerOverflow,CWE-190)释放再使用(UseafterFree,CWE-416)2023/2/4网络攻防技术84.2.1栈溢出栈溢出攻击的相关概念最早要追述到1972年美国空军发表的一份研究报告《ComputerSecurityTechnologyPlanningStudy》。在这份报告中,通过溢出缓冲区来注入代码这一想法首次被提了出来。直到1986年才出现了首次真实的攻击,Morris蠕虫病毒利用了Unix操作系统中fingerd程序的gets()函数导致的栈溢出来实现远程代码执行。1996年,EliasLevy(a.k.aAlephOne)在大名鼎鼎的Phrack杂志上发表了文章《SmashingtheStackforFunandProfit》,从此栈溢出漏洞的利用技术被广泛知晓。2023/2/4网络攻防技术94.2.1栈溢出进程使用的操作系统内存一般可以划分为4部分,按照内存地址由低到高,依次是:栈(Stack)、堆、数据段、文本(代码)段。栈:由编译器自动分配释放,是用户存放程序临时创建的局部变量、函数参数等数据的地方。栈是一个寄存、交换临时数据的内存缓冲区。堆:一般由程序编写人员分配释放,若编写人员不释放,程序结束时可能由操作系统回收,分配方式类似于链表。数据段:用来存放程序中已初始化的全局变量的一块内存区域。代码段:用来存放程序执行代码的一块内存区域。这里存放着由处理器直接执行的二进制代码。2023/2/4网络攻防技术104.2.1栈溢出每个进程有一个栈,在这个进程中每个函数被调用时分别从这个栈占用一段区域,称为栈帧(StackFrame)。2023/2/4网络攻防技术114.2.1栈溢出2023/2/4网络攻防技术12main函数入口栈内存高端内存低端main函数的数据callfuncEIP寄存器func函数入口…

……

…004011C4004011CC004011D1return…

…参数004011D1buff00401210004011D1栈底栈顶内存方向:由低到高栈方向:由高到低Main函数栈底EBP函数调用与栈4.2.1栈溢出2023/2/4网络攻防技术13main函数入口栈内存高端内存低端main函数的数据callfuncfunc函数入口…

……

…return…

…参数004011D1buffMain函数栈底EBP在一次函数调用中实际会保存在栈中的数据包括:调用者参数、EIP的值(返回地址)、EBP的值函数调用与栈4.2.1栈溢出2023/2/4网络攻防技术14main函数入口栈内存高端内存低端main函数的数据callfuncfunc函数入口…

……

…return…

…参数004011D1buffMain函数栈底EBP如果在栈中发生缓冲区溢出,极可能使的栈所保存的EIP指针值被改变。也即程序原有流程被改变。函数调用与栈4.2.1栈溢出2023/2/4网络攻防技术15栈溢出实例4.2.1栈溢出2023/2/4网络攻防技术16在拷贝argv[1]指向的字符串之前,并没有检测该字符串的长度,如果该字符串的长度大于16,则复制时就会覆盖name数组下方的栈空间4.2.2堆溢出堆的特点:堆是程序运行时动态分配的内存。所需分配的内存大小在程序运行时由用户定义。堆在使用时需要使用专用的函数进行申请,如C语言中的malloc等函数、C++中的new函数等。一般用一个堆指针来使用申请的内存,读、写、释放都是通过这个指针来完成。使用完毕后要通过堆释放函数进行回收这片内存,否则会造成内存泄漏。如free、delete等。2023/2/4网络攻防技术17堆的数据结构2023/2/4网络攻防技术18堆表:堆表一般位于堆区的起始位置,用于检索堆区中所有堆块的总要信息。堆块:堆区内存按不同大小组织成块,以堆块为单位进行标识。一个堆块包括两个部分:块首和块身。块首用来标识块的自身的信息,例如,大小、空闲或占用状态。块身是最终分配给用户使用的数据区。Windows系统的堆表——空表

2023/2/4网络攻防技术19Windows系统的堆表——快表快表是Windows用来加速分配而采用的一种堆表。这类单向链表中不会发生堆块合并(其中空闲堆块块首被置为占用态防止堆块合并)。快表也有128条,组织结构与空表类似,只是堆块按单链表组织,而且每条快表最多只有4个节点。lookaside[6]2023/2/4网络攻防技术20堆的操作(1)堆的分配:快表分配、普通空表分配和零号空表(free[0])分配。快表分配:寻找大小匹配的空闲堆块,把它从堆表中卸下,给程序使用。普通空表分配:先寻找最优的空闲块分配,若失败,则寻找次优的空闲块分配。零号空表分配:按照大小升序链着大小不同的空闲块,找最优结果。当空表中找不到最优的堆块时,会发生次优分配,即从大块按照请求的大小精确割出一块进行分配,然后给剩下部分重新标注块首,链入空表。2023/2/4网络攻防技术21堆的操作(2)堆块释放将堆块状态改为空闲,链入相应的堆表。所有的释放块都链入堆表的末尾。(3)堆块合并堆块合并发生于空表。经过反复的申请与释放,堆区产生很多内存碎片。几个注意点:快表空闲堆块被置为占用态,所以不会发生堆块合并操作。快表只有精确分配时才会分配。分配优先使用快表,失败时才使用空表。2023/2/4网络攻防技术22堆溢出示例1 #defineBUFFSIZE322 intmain(intargc,char*argv[]){3 char*buf1;4 buf1=(char*)malloc(BUFFSIZE); //mallocablockofmemory5strcpy(buf1,argv[1]); //copyparametertobuf16 printf("%s\n",buf1); //printthebuf17 free(buf1); //freebuf18 return0;9 }

拷贝字符串之前没有对字符串的长度进行检查,所以会产生溢出,覆盖缓冲区后面的内容,也就是覆盖下一个堆块的块首,造成堆管理结构混乱。4.2.3格式化串所谓格式化串,就是在*printf()系列函数中按照一定的格式对数据进行输出,可以输出到标准输出,即printf(),也可以输出到文件句柄,字符串等。对应的函数有fprintf,sprintf,snprintf,vprintf,vfprintf,vsprintf,vsnprintf等。2023/2/4网络攻防技术24格式化串的栈结构2023/2/4网络攻防技术25

printf(“a=%d,b=%d\n”,a,b);格式化串溢出栈布局2023/2/4网络攻防技术26

因为参数的不固定,可能导致栈中数据泄露4.2.4整型溢出一个整数是一个固定的长度(32位或64位),它能存储的最大值是固定的,当尝试去存储一个大于这个固定的最大值时,将会导致一个整型溢出。存储溢出运算溢出符号溢出2023/2/4网络攻防技术27存储溢出长整型赋值给短整型intlen1=0x10000;

shortlen2=len1;//len2=0x0000短整型赋值给长整型

intlen1=-1;shortlen2=1;len1=len2;//len1=0xffffffff//len2=0x0001//len1=0xffff0001=-132023/2/4网络攻防技术28运算溢出boolfunc(char*userdata,shortdatalength)

{

char*buff;

...

if(datalength!=strlen(userdata))

returnfalse;

datalength=datalength*2;

buff=malloc(datalength);

strncpy(buff,userdata,datalength)

...

}

2023/2/4网络攻防技术29运算溢出boolfunc(char*userdata,shortdatalength)//datalength=0x8000

{

char*buff;

...

if(datalength!=strlen(userdata))

returnfalse;

datalength=datalength*2;//datalength=0x10000

buff=malloc(datalength);

strncpy(buff,userdata,datalength)

...

}2023/2/4网络攻防技术30符号溢出整型数是分为有符号整型数和无符号整型数的。一般对长度变量都要求使用无符号整型数,如果程序员忽略了符号的话,在进行安全检查判断的时候就可能出现错误。2023/2/4网络攻防技术31符号溢出ApacheWebServer分块(chunked)编码远程溢出漏洞出于安全考虑,在将分块数据拷贝到缓冲区之前,Apache会对分块长度进行检查。如果分块长度小<缓冲区,根据分块长度进行数据拷贝;如果分块长度>缓冲区,Apache将最多只拷贝缓冲区长度的数据。然而在进行上述检查时,没有将分块长度转换为无符号型进行比较。因此,如果攻击者将分块长度设置成一个负值,就会绕过上述安全检查,Apache会将一个超长的分块数据拷贝到缓冲区中,这会造成缓冲区溢出。2023/2/4网络攻防技术324.2.5释放再引用释放重引用漏洞(UseafterFree,UAF),就是使用到已被释放的内存,最终导致内存崩溃或任意代码执行的漏洞。UAF漏洞在浏览器中是最为常见的,比如IE、Chrome、Firefox等。2005年12月,第一个UAF漏洞CVE-2005-4360被发现。当时并没有直接命名为“UseAfterFree”,仅以远程拒绝服务归类。CVE数据库所记录的UAF漏洞的条目,自2008年开始以超过每年翻一番的速度增长。2023/2/4网络攻防技术33如果指针所指向的对象被释放或者回收,但是对该指针没有作任何修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称为悬垂指针。悬垂指针指向的内存空间被回收后会被添加进空闲堆表或位于栈顶之上,操作系统按需操作和使用这些内存空间。如果操作系统将这部分已经释放的内存重新分配给另一个指针,而原来悬垂指针因为没及时置空而被再次引用,其后果是难以预期的。2023/2/4网络攻防技术34悬垂指针悬垂指针—栈#include<iostream>#include<windows.h>usingnamespacestd;int*p=NULL;voidfun(){inti=10;p=&i;}voidmain(){fun();cout<<"*p="<<*p<<endl;//输出*p=10,因为p依然指向变量i的内存空间Sleep(1000);cout<<"*p="<<*p<<endl;//此时,fun函数执行后1秒,fun函数中的i变量的栈空间被释放,输出*p的值将不可预测}2023/2/4网络攻防技术35悬垂指针—堆#include<iostream>#include<windows.h>usingnamespacestd;voidmain(){inti=10;int*p=(int*)malloc(sizeof(int));

*p=i;cout<<"*p="<<*p<<endl;//输出*p=10

free(p);Sleep(1000);cout<<“*p=”<<*p<<endl;//此时,fun函数执行后1秒,指针p分配的堆块被回收,输出*p的值将不可预测}2023/2/4网络攻防技术36释放重引用原理生成悬垂指针使用悬垂指针2023/2/4网络攻防技术37#definesize32intmain(intargc,char**argv){

char*buf1;char*buf2; buf1=(char*)malloc(size);printf(“buf1:0x%p\n”,buf1);free(buf1);//释放buf1,使得buf1成为悬挂指针buf2=(char*)malloc(size);//分配buf2“占坑”buf1的内存位置printf(“buf2:0x%p\n\n”,buf2);memset(buf2,0,size);//对buf2进行内存清零printf(“buf2:%d\n”,*buf2);//重引用已释放的buf1指针,但却导致buf2值被篡改printf(“====UseAfterFree===\n”);strncpy(buf1,“hack”,5);printf(“buf2:%s\n\n”,buf2);free(buf2);}

UAF漏洞实例2023/2/4网络攻防技术382023/2/4网络攻防技术39本章主要内容4.1概述4.2典型漏洞类型4.3溢出漏洞利用原理4.4漏洞利用保护机制4.3溢出漏洞利用原理溢出攻击的基本流程溢出利用的关键技术2023/2/4网络攻防技术404.3.1溢出攻击的基本流程2023/2/4网络攻防技术41(1)在哪里注入“溢出”数据?(2)数据要多长才能覆盖返回地址?(3)使用什么内容覆盖返回地址?(4)执行什么样的攻击代码?注入恶意数据溢出缓冲区控制流重定向执行有效载荷4.3.2溢出利用的关键技术溢出点定位覆盖执行控制地址覆盖异常处理结构跳转地址的确定Shellcode定位和跳转2023/2/4网络攻防技术42一、溢出点定位技术如何确定溢出点位置?探测法反汇编分析?2023/2/4网络攻防技术43一、溢出点定位技术探测法构造数据,根据出错的情况来判断。如输入字符串:2023/2/4网络攻防技术44探测法intmain(intargc,char*argv[]){ charname[16];

strcpy(name,argv[1]); printf(“%s\n”,name); return0;}例1,栈溢出示例如果输入:01234567890123456789AAAABBBBCCCCDDDD2023/2/4网络攻防技术45反汇编分析反汇编分析strcpy(name,(constchar*)argv[1]);004113C8

moveax,dwordptr[ebp+0Ch]004113CB

movecx,dwordptr[eax+4]004113CEpushecx004113CFlea

edx,[ebp-10h]004113D2pushedx004113D3call@ILT+165(_strcpy)(4110AAh)2023/2/4网络攻防技术46二、覆盖执行控制地址执行控制地址可包括:覆盖返回地址覆盖函数指针变量覆盖异常处理结构2023/2/4网络攻防技术47三、覆盖异常处理结构异常处理是一种对程序异常的处理机制,它把错误处理代码与正常情况下所执行的代码分开。当程序发生异常时,系统中断当前线程,将控制权交给异常处理程序Windows的异常处理机制称为结构化异常处理(StructuredExceptionHandling)2023/2/4网络攻防技术48结构化异常处理与SEH通过异常处理结构链(SEH)管理SEH处于栈空间的单向链表局部变量异常处理结点EBP(基址指针)EIP(返回地址)Functionarguments(参数)内存低端内存高端2023/2/4网络攻防技术49

异常处理结构链TEB(fs:[0])EXCEPTION_REGISTRATION下一个回调函数b的地址0xFFFFFFFFToplevel函数的地址2023/2/4网络攻防技术50结构化异常处理与SEH通过异常处理结构链(SEH)管理SEH处于栈空间的单向链表加入新函数时采用头插法2023/2/4网络攻防技术51何时需要覆盖异常处理结构由于溢出时破坏了栈结构,可能在函数返回之前会产生错误,此时系统将控制权交给SEH2023/2/4网络攻防技术52覆盖异常处理结构TEB(fs:[0])EXCEPTION_REGISTRATION从这里开始覆盖我们可以控制的地址下一个回调函数2的地址0xFFFFFFFFToplevel函数的地址shellcode2023/2/4网络攻防技术53四、跳转地址的确定跳转指令的选取jmpesp、callebx、callecx等。跳转指令的搜索范围用户空间的任意地址、系统dll、进程代码段、PEB、TEB跳转指令地址的选择规律2023/2/4网络攻防技术54五、Shellcode的定位和跳转2023/2/4网络攻防技术55NopSled:类NOP指令填充,可以是NOP,也可以是inceax等无副作用指令。Decoder:解码部分,对Real_Shellcode解码。Real_Shellcode:真正有意义的shellcode部分,但是经过了编码处理。Shellcode的基本构成调用者的栈调用参数ReturnaddressEBP局部变量ShellcodeRNNNNNNNNEBPESPESPESPESPJMPESPSSSS内存高端五、Shellcode的定位和跳转2023/2/4网络攻防技术562023/2/4网络攻防技术57本章主要内容4.1概述4.2典型漏洞类型4.3溢出漏洞利用原理4.4漏洞利用保护机制4.3溢出利用保护机制GS编译保护机制SafeSEH机制DEP机制ASL

温馨提示

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

最新文档

评论

0/150

提交评论