C4-1-2 缓冲区溢出漏洞-堆溢出_第1页
C4-1-2 缓冲区溢出漏洞-堆溢出_第2页
C4-1-2 缓冲区溢出漏洞-堆溢出_第3页
C4-1-2 缓冲区溢出漏洞-堆溢出_第4页
C4-1-2 缓冲区溢出漏洞-堆溢出_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1软件安全

C4典型软件漏洞机理分析2提纲4.1缓冲区溢出漏洞缓冲区与内存分布栈溢出堆溢出格式化串漏洞4.2Web应用程序漏洞Web应用安全概述SQL注入漏洞34.1.3堆溢出

上一节介绍了栈溢出的原理及利用方法。但近年来,另一种基于缓冲区溢出的攻击逐渐成为主流。这种新兴的攻击手法的目标从栈转移到了Windows的堆管理器。尽管基于堆的攻击要比栈攻击困难很多,但是相对于栈上的攻击更加难以防范,所以基于堆的攻击仍然持续增长。程序在内存中的映像……文本(代码)段数据段堆栈段内存低地址内存高地址内存递增方向初始化数据段非初始化数据段(BSS)堆(Heap)栈(stack)堆的增长方向栈的增长方向内核数据代码0x800000000x7FFFFFFFPEB&TEB系统DLL代码段54.1.3.1堆的基本知识堆与栈的区别栈变量包含函数内部的普通变量、数组等。使用时不需额外的申请操作,由系统维护。堆是在程序运行时动态分配的内存。堆需要使用专有的函数进行申请。(如C语言中的malloc函数和C++中的new函数等)一般用一个堆指针来使用申请得到的内存。使用完毕后需要将堆指针传给堆释放函数回收这片内存,否则会造成内存泄露。64.1.3.1堆与栈的区别74.1.3.1堆的结构堆块与堆表堆块:堆区的内存按不同大小组织成块,以堆块为单位进行标识。一个堆块包括两个部分:块首和块身。块首是一个堆块头部的几个字节,用来标识这个堆块自身的信息(大小、空闲或占用等)。块身是紧跟在块首后面的部分,也是最终分配给用户使用的数据区。84.1.3.1堆的结构堆块与堆表堆表:位于堆区的起始位置,用于索引堆区中所有堆块的重要信息(包括位置、大小、空闲与否等)。堆表的数据结构决定了整个堆区的组织方式,是快速检索空闲块、保证堆分配效率的关键。堆表可能会采用平衡二叉树等高级数据结构用于优化查找效率(往往不止一种数据结构)。94.1.3.1堆的结构堆块空闲态:堆块被链入空链表中,由系统管理。占有态:堆块会返回一个由程序员定义的句柄,由程序员管理。104.1.3.1堆的结构空闲堆块比占有堆块多出了两个4字节的指针,这两个指针用于链接系统中的其他空闲堆块。114.1.3.1堆的结构堆表在Windows中,占用态的堆块被使用它的程序索引;而堆表只检索所有空闲块的堆块。最重要的堆表有两种:空闲双向链表freelist(简称空表)快速单向链表lookaside(简称快表)124.1.3.1堆的结构空表空闲堆块的块首中包含一对重要的指针,这对指针用于将空闲堆块组织成双向链表。根据大小不同,空表总共被分成128条134.1.3.1堆的结构空表堆表区中有一个128项的数组,称作空表索引(每项包含两个指针,标识一条空表)空闲堆块的大小=索引项×8(字节)144.1.3.1堆的结构快表Windows用来加速堆块分配而采用的一种堆表。也有128条,组织结构与空表类似,只是其中的堆块按照单链表组织。由于在堆溢出中一般不利用快表,故不作详述。154.1.3.2堆溢出的利用基本原理与DWORDSHOOT堆管理系统的三类操作堆块分配(将堆块从空表中“卸下”)堆块释放(把堆块“链入”空表)堆块合并(将若干块先从空表中“卸下”,修改块首信息,把更新后的块“链入”空表)这三类操作归根到底都是对空表链的修改164.1.3.2堆溢出的利用堆溢出利用的精髓

用精心构造的数据去溢出覆盖下一个堆块的块首,使其改写块首中的前向指针(flink)和后向指针(blink),然后在分配、释放、合并等操作发生时伺机获得一次向内存任意地址写入任意数据的机会(ArbitraryDwordReset,又称DwordShoot)。通过这个机会,可以控制设计的目标(任意地址),选择适当的目标数据,从而劫持进程,运行shellcode。174.1.3.2堆溢出的利用举例:如何通过节点的拆卸产生DwordShoot

拆卸节点node时发生如下操作:

node->blink->flink=node->flink;

node->flink->blink=node->blink;

当精心构造的数据淹没前向指针和后向指针时,如果在flink放入4字节的任意恶意数据内容,在blink放入目标地址,当执行以上操作时,导致目标地址的内容被修改为该4字节的恶意数据。184.1.3.2堆溢出的利用举例:如何通过节点的拆卸产生DwordShoot

194.1.3.2堆溢出的利用根据攻击目标和4字节恶意数据内容的不同,常见的攻击组合方式有以下几种:

204.1.4格式化串漏洞格式化串漏洞并不算缓冲区溢出漏洞。为了能够将字符串、变量、地址等数据按照指定格式输出,通常使用包含格式化控制符的常量字符串作为格式化串,然后指定用相应变量来代替格式化串中的格式化控制符。printf(“a=%d,b=%d”,a,b);printf(“a=%d,b=%d”);214.1.4格式化串漏洞224.1.4格式化串漏洞格式符除了常见的d、f、u、o、x之外,还有一些指针型的格式符:s----参数对应的是指向字符串的指针;

n----参数对应的是一个整数型指针,将这个参数之前输出的字符的数量写入该格式符对应参数指向的地址中。inta=0;printf(”1234567890%n”,&a);234.1.4格式化串漏洞适当利用%p、%s、%n等格式符,一个精心构造的格式化串即可实现对程序内存数据的任意读、任意写,从而造成信息泄露、数据篡改和程序流程的非法控制这类威胁。该系列函数可能产生格式化串漏洞:printf,fprintf,sprintf,snprintf,v

温馨提示

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

评论

0/150

提交评论