第7章:缓冲区溢出攻击及防御技术ppt课件.ppt

上传人:飞****2 文档编号:78716700 上传时间:2023-03-19 格式:PPT 页数:134 大小:837KB
返回 下载 相关 举报
第7章:缓冲区溢出攻击及防御技术ppt课件.ppt_第1页
第1页 / 共134页
第7章:缓冲区溢出攻击及防御技术ppt课件.ppt_第2页
第2页 / 共134页
点击查看更多>>
资源描述

《第7章:缓冲区溢出攻击及防御技术ppt课件.ppt》由会员分享,可在线阅读,更多相关《第7章:缓冲区溢出攻击及防御技术ppt课件.ppt(134页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统第第7 7章章 缓冲区溢出攻击及防御技术缓冲区溢出攻击及防御技术张玉清张玉清国家计算机网络入侵防范中心国家计算机网络入侵防范中心篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术2本章内容安排本章内容安排o7.1 缓冲区溢出概述缓冲区溢出概述 o7.2 缓冲区溢出原理缓冲区溢出原理 o7.3 缓冲区溢出的过程缓冲区溢出的过程 o7.4 代码植入技术代码植入技术o7.5 实例:实例:ida溢出漏洞

2、攻击溢出漏洞攻击o7.6 缓冲区溢出的防御缓冲区溢出的防御 o7.7 小结小结 篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术37.1 缓冲区溢出概述缓冲区溢出概述o什么是什么是缓冲区缓冲区?它是包含相同数据类型实例的一个?它是包含相同数据类型实例的一个连续的计算机内存块。是程序运行期间在内存中分连续的计算机内存块。是程序运行期间在内存中分配的一个连续的区域,用于保存包括字符数组在内配的一个连续的区域,用于保存包括字符数组在内的各种数据类型。的各种数据类型。o所谓所谓溢出溢出,其实就是所填充的数据

3、超出了原有的缓,其实就是所填充的数据超出了原有的缓冲区边界。冲区边界。o两者结合进来,所谓两者结合进来,所谓缓冲区溢出缓冲区溢出,就是向固定长度,就是向固定长度的缓冲区中写入超出其预告分配长度的内容,造成的缓冲区中写入超出其预告分配长度的内容,造成缓冲区中数据的溢出,从而覆盖了缓冲区周围的内缓冲区中数据的溢出,从而覆盖了缓冲区周围的内存空间。黑客借此精心构造填充数据,导致原有流存空间。黑客借此精心构造填充数据,导致原有流程的改变,让程序转而执行特殊的代码,最终获取程的改变,让程序转而执行特殊的代码,最终获取控制权。控制权。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比

4、赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术47.1 缓冲区溢出概述缓冲区溢出概述o利用缓冲区溢出漏洞进行攻击最早可追溯到利用缓冲区溢出漏洞进行攻击最早可追溯到1988年年Morris蠕虫,它所利用的就是蠕虫,它所利用的就是fingerd程序的缓冲区溢出程序的缓冲区溢出漏洞。漏洞。o1989年,年,Spafford提交了一份分析报告,描述了提交了一份分析报告,描述了VAX机机上上BSD版版Unix的的Fingerd的缓冲区溢出程序的技术细节,的缓冲区溢出程序的技术细节,引起了一部分安全人士对这个研究领域的重视。引起了一部分安全人士对这个研究领域的重视。o1996年,

5、年,Aleph One发表了题为发表了题为“Smashing the stack for fun and profit”的文章后,首次详细地介绍的文章后,首次详细地介绍了了Unix/Linux下栈溢出攻击的原理、方法和步骤,揭示下栈溢出攻击的原理、方法和步骤,揭示了缓冲区溢出攻击中的技术细节。了缓冲区溢出攻击中的技术细节。o1999年年w00w00安全小组的安全小组的Matt Conover写了基于写了基于堆缓冲区溢出专著,对堆溢出的机理进行了探索。堆缓冲区溢出专著,对堆溢出的机理进行了探索。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型

6、的系统7.1 缓冲区溢出概述缓冲区溢出概述oWindows系统中缓冲区溢出的事例更是层出不穷。系统中缓冲区溢出的事例更是层出不穷。o2001年年“红色代码红色代码”蠕虫利用微软蠕虫利用微软IIS Web Server中中的缓冲区溢出漏洞使的缓冲区溢出漏洞使300 000多台计算机受到攻击;多台计算机受到攻击;o2003年年1月,月,Slammer蠕虫爆发,利用的是微软蠕虫爆发,利用的是微软SQL Server 2000中的缺陷;中的缺陷;o2004年年5月爆发的月爆发的“振荡波振荡波”利用了利用了Windows系统的活系统的活动目录服务缓冲区溢出漏洞;动目录服务缓冲区溢出漏洞;o2005年年8

7、月利用月利用Windows即插即用缓冲区溢出漏洞的即插即用缓冲区溢出漏洞的“狙击波狙击波”被称为历史上最快利用微软漏洞进行攻击的恶意代被称为历史上最快利用微软漏洞进行攻击的恶意代码。码。o2008年底至年底至2009年的年的Conficker蠕虫利用的是蠕虫利用的是Windows处理远程处理远程RPC请求时的漏洞(请求时的漏洞(MS08-067)。)。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术67.1 缓冲区溢出概述缓冲区溢出概述o目前,利用缓冲区溢出漏洞进行的攻击已经占所有系统目前,利用缓冲

8、区溢出漏洞进行的攻击已经占所有系统攻击总数的攻击总数的80%以上。以上。o缓冲区溢出攻击之所以日益普遍,其原因在于各种操作缓冲区溢出攻击之所以日益普遍,其原因在于各种操作系统和应用软件上存在的缓冲区溢出问题数不胜数,而系统和应用软件上存在的缓冲区溢出问题数不胜数,而其带来的影响不容小觑。其带来的影响不容小觑。o对缓冲区溢出漏洞攻击,可以导致程序运行失败、系统对缓冲区溢出漏洞攻击,可以导致程序运行失败、系统崩溃以及重新启动等后果。崩溃以及重新启动等后果。o更为严重的是,可以利用缓冲区溢出执行非授权指令,更为严重的是,可以利用缓冲区溢出执行非授权指令,甚至取得系统特权,进而进行各种非法操作。甚至取

9、得系统特权,进而进行各种非法操作。o如何防止和检测出利用缓冲区溢出漏洞进行的攻击,就如何防止和检测出利用缓冲区溢出漏洞进行的攻击,就成为防御网络入侵以及入侵检测的重点之一。成为防御网络入侵以及入侵检测的重点之一。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.1 缓冲区溢出概述缓冲区溢出概述o与其他的攻击类型相比,缓冲区溢出攻击与其他的攻击类型相比,缓冲区溢出攻击n不需要太多的先决条件n杀伤力很强n技术性强o缓冲区溢出比其他一些黑客攻击手段更具有缓冲区溢出比其他一些黑客攻击手段更具有破坏力破坏力和和隐蔽性隐蔽性。这也是利用缓冲区溢

10、出漏。这也是利用缓冲区溢出漏洞进行攻击日益普遍的原因。洞进行攻击日益普遍的原因。2023/1/20网络入侵与防范技术7篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术87.1 缓冲区溢出概述缓冲区溢出概述o破坏性:破坏性:n它极容易使服务程序停止运行,服务器死机甚至删除服务器上的数据。o隐蔽性:隐蔽性:n首先,漏洞被发现之前,程序员一般是不会意识到自己的程序存在漏洞的(事实上,漏洞的发现者往往并非编写者),于是疏于监测;n其次,被植入的攻击代码一般都很短,执行时间也非常短,很难在执行过程中被发现,而

11、且其执行并不一定会使系统报告错误,并可能不影响正常程序的运行;篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.1 缓冲区溢出概述缓冲区溢出概述o隐蔽性:隐蔽性:n第三,由于漏洞存在于防火墙内部的主机上,攻击者可以在防火墙内部堂而皇之地取得本来不被允许或没有权限的控制权;n第四,攻击的随机性和不可预测性使得防御变得异常艰难,没有攻击时,被攻击程序本身并不会有什么变化,也不会存在任何异常的表现;n最后,缓冲区溢出漏洞的普遍存在,针对它的攻击让人防不胜防(各种补丁程序也可能存在着这种漏洞。篮球比赛是根据运动队在规定的比赛时间里得分多少来

12、决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2 缓冲区溢出原理缓冲区溢出原理o7.2.1 栈溢出栈溢出o7.2.2 堆溢出堆溢出o7.2.3 BSS溢出溢出o7.2.4 格式化串溢出格式化串溢出篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术117.2 缓冲区溢出原理缓冲区溢出原理o当程序运行时,计算机会在内存区域中开当程序运行时,计算机会在内存区域中开辟一段连续的内存块,包括代码段、数据辟一段连续的内存块,包括代码段、数据段和堆栈段三部分。段和堆栈段三部分。篮球比赛是根据运动队

13、在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2 缓冲区溢出原理缓冲区溢出原理o程序在内存中的存放形式程序在内存中的存放形式篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2 缓冲区溢出原理缓冲区溢出原理o代码段代码段(.text),也称文本段,也称文本段(Text Segment),存放着程序的机器码和只读数据,可执行指令就,存放着程序的机器码和只读数据,可执行指令就是从这里取得的。如果可能,系统会安排好相同程是从这里取得的。如果可能,系统会安排好相同程序的多个运行实体共享这些实例代

14、码。这个段在内序的多个运行实体共享这些实例代码。这个段在内存中一般被标记为只读,任何对该区的写操作都会存中一般被标记为只读,任何对该区的写操作都会导致段错误(导致段错误(Segmentation Fault)。)。o数据段,包括已初始化的数据段数据段,包括已初始化的数据段(.data)和未初始和未初始化的数据段(化的数据段(.bss),前者用来存放保存全局的和),前者用来存放保存全局的和静态的已初始化变量,后者用来保存全局的和静态静态的已初始化变量,后者用来保存全局的和静态的未初始化变量。数据段在编译时分配。的未初始化变量。数据段在编译时分配。篮球比赛是根据运动队在规定的比赛时间里得分多少来决

15、定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2 缓冲区溢出原理缓冲区溢出原理o堆栈段分为堆和栈。堆栈段分为堆和栈。o堆(堆(Heap):位于):位于BSS内存段的上边,用来存储内存段的上边,用来存储程序运行时分配的变量。程序运行时分配的变量。o堆的堆的大小并不固定,可动态扩张或缩减。大小并不固定,可动态扩张或缩减。其分配由其分配由malloc()、new()等这类实时内存分配函数来实现。等这类实时内存分配函数来实现。当当进程调用进程调用malloc等函数分配内存时,新分配的内等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用存就被动态添加到堆上(堆被扩张);

16、当利用free等函数释放内存时,被释放的内存从堆中被剔除等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。(堆被缩减)。o堆的内存释放由应用程序去控制,通常一个堆的内存释放由应用程序去控制,通常一个new()就要对应一个就要对应一个delete(),如果程序员没有释放,如果程序员没有释放掉,那么在程序结束后操作系统会自动回收。掉,那么在程序结束后操作系统会自动回收。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2 缓冲区溢出原理缓冲区溢出原理o栈(栈(Stack)是一种用来存储函数调用时的临时信)是一种用来存储函数调用时的

17、临时信息的结构,如函数调用所传递的参数、函数的返回息的结构,如函数调用所传递的参数、函数的返回地址、函数的局部变量等。地址、函数的局部变量等。o在程序运行时由编译器在需要的时候分配,在不需在程序运行时由编译器在需要的时候分配,在不需要的时候自动清除。要的时候自动清除。o栈的特性栈的特性:最后一个放入栈中的物体总是被最先拿最后一个放入栈中的物体总是被最先拿出来,这个特性通常称为出来,这个特性通常称为先进后出先进后出(FILO)队列。队列。o栈的基本操作:栈的基本操作:nPUSH操作:向栈中添加数据,称为压栈,数据将放置在栈顶;nPOP操作:POP操作相反,在栈顶部移去一个元素,并将栈的大小减一,

18、称为弹栈。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统堆和栈的区别堆和栈的区别o分配和管理方式不同分配和管理方式不同n堆是动态分配的,其空间的分配和释放都由程序员控制。n栈由编译器自动管理。栈有两种分配方式:静态分配和动态分配。静态分配由编译器完成,比如局部变量的分配。动态分配由alloca()函数进行分配,但是栈的动态分配和堆是不同的,它的动态分配是由编译器进行释放,无须手工控制。o产生碎片不同产生碎片不同n对堆来说,频繁的new/delete或者malloc/free势必会造成内存空间的不连续,造成大量的碎片,使程序效率降低。

19、n对栈而言,则不存在碎片问题,因为栈是先进后出的队列,永远不可能有一个内存块从栈中间弹出。o生长方向不同生长方向不同n堆是向着内存地址增加的方向增长的,从内存的低地址向高地址方向增长。n栈的生长方向与之相反,是向着内存地址减小的方向增长,由内存的高地址向低地址方向增长。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术177.2 缓冲区溢出原理缓冲区溢出原理o在这里,我们假设现在有一个程序,在这里,我们假设现在有一个程序,它的函数它的函数调用顺序如下。调用顺序如下。main()-;func_1()-;

20、func_2()-;func_3()即:主函数main调用函数func_1;函数func_1调用函数func_2;函数func_2调用函数func_3。其详细结构图如下页图所示。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术18篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统程序在内存中的影像程序在内存中的影像o随着函数调用层数的增加,函数栈帧是一块块随着函数调用层数的增加,函数栈帧是一块块地向内存低地址方向延伸的。地向内存低地址方向延伸

21、的。o随着进程中函数调用层数的减少,即各函数调随着进程中函数调用层数的减少,即各函数调用的返回,栈帧会一块块地被遗弃而向内存的用的返回,栈帧会一块块地被遗弃而向内存的高址方向回缩。高址方向回缩。o各函数的栈帧大小随着函数的性质的不同而不各函数的栈帧大小随着函数的性质的不同而不等,由函数的局部变量的数目决定。等,由函数的局部变量的数目决定。o在缓冲区溢出中,在缓冲区溢出中,我们主要关注数据区和堆栈我们主要关注数据区和堆栈区区。2023/1/20网络入侵与防范技术19篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入

22、侵与防范技术20程序所使用的栈程序所使用的栈o在使用栈时,引用栈帧需要借助两个寄存器。在使用栈时,引用栈帧需要借助两个寄存器。o一个是一个是SP(ESP),即,即栈顶指针栈顶指针,它随着数据入,它随着数据入栈出栈而发生变化。栈出栈而发生变化。o另一个是另一个是BP(EBP),即,即基地址指针基地址指针,它用于标,它用于标识栈中一个相对稳定的位置,通过识栈中一个相对稳定的位置,通过BP,再加上,再加上偏移地址,可以方便地引用函数参数以及局部变偏移地址,可以方便地引用函数参数以及局部变量。量。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系

23、统2023/1/20网络入侵与防范技术21程序所使用的栈程序所使用的栈o函数被调用的时候,栈中的压入情况如下:函数被调用的时候,栈中的压入情况如下:FuncFuncFuncFunc函数中的局部变量函数中的局部变量函数中的局部变量函数中的局部变量调用调用调用调用FuncFuncFuncFunc函数前的函数前的函数前的函数前的EBPEBPEBPEBP退出退出退出退出FuncFuncFuncFunc函数后的返回地址函数后的返回地址函数后的返回地址函数后的返回地址传递给传递给传递给传递给FuncFuncFuncFunc的实参的实参的实参的实参内存低地址内存低地址内存低地址内存低地址内存高地址内存高地址

24、内存高地址内存高地址最先压入栈最先压入栈最后压入栈最后压入栈篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术22程序所使用的栈程序所使用的栈o在局部变量的下面,是前一个调用函数的在局部变量的下面,是前一个调用函数的EBP,接下来就是返回地址。,接下来就是返回地址。o如果局部变量发生溢出,很有可能会覆盖掉如果局部变量发生溢出,很有可能会覆盖掉EBP甚至甚至RET(返回地址返回地址),这就是缓冲区,这就是缓冲区溢出攻击的溢出攻击的“奥秘奥秘”所在。所在。篮球比赛是根据运动队在规定的比赛时间里得分多少来决

25、定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术237.2 缓冲区溢出原理缓冲区溢出原理o如果在堆栈中压入的数据超过预先给堆栈分如果在堆栈中压入的数据超过预先给堆栈分配的容量时,就会出现堆栈溢出,从而使得配的容量时,就会出现堆栈溢出,从而使得程序运行失败;如果发生溢出的是大型程序程序运行失败;如果发生溢出的是大型程序还有可能会导致系统崩溃。还有可能会导致系统崩溃。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2.1 栈溢出栈溢出o程序中发生函数调用时,计算机做如下操作:程序中发生函数

26、调用时,计算机做如下操作:首先把指令寄存器首先把指令寄存器EIP(它指向当前(它指向当前CPU将要将要运行的下一条指令的地址)中的内容压入栈,运行的下一条指令的地址)中的内容压入栈,作为程序的返回地址(下文中用作为程序的返回地址(下文中用RET表示);表示);之后放入栈的是基址寄存器之后放入栈的是基址寄存器EBP,它指向当前,它指向当前函数栈帧(函数栈帧(stack frame)的底部;然后把当)的底部;然后把当前的栈指针前的栈指针ESP拷贝到拷贝到EBP,作为新的基地址,作为新的基地址,最后为本地变量的动态存储分配留出一定空间,最后为本地变量的动态存储分配留出一定空间,并把并把ESP减去适当

27、的数值。减去适当的数值。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2.1 栈溢出实例栈溢出实例o我们来看一段简单程序的执行过程中对栈的操作和我们来看一段简单程序的执行过程中对栈的操作和溢出的产生过程。溢出的产生过程。#include int main()char name16;gets(name);for(int i=0;i16&namei;i+)printf(“%c”,namei);篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技

28、术267.2.1 栈溢出实例栈溢出实例o编译上述代码,输入编译上述代码,输入hello world!结果会输出结果会输出hello world!o在调用在调用main()函数时,程序对栈的操作函数时,程序对栈的操作是这样的:是这样的:n先在栈底压入返回地址n接着将栈指针EBP入栈,并把EBP修改为现在的ESPn之后ESP减16,即向上增长16个字节,用来存放name数组篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术277.2.1 栈溢出实例栈溢出实例o现在栈的布局如图所示。现在栈的布局如图所示。篮

29、球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术287.2.1 栈溢出实例栈溢出实例o执行完执行完gets(name)之后,栈中的内容如之后,栈中的内容如下图所示下图所示篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术297.2.1 栈溢出实例栈溢出实例o接着执行接着执行for循环,逐个打印循环,逐个打印name数组中的字符,数组中的字符,直到碰到直到碰到0 x00字符字符o最后,从最后,从main返回,将

30、返回,将ESP增加增加16以回收以回收name数组占用的空间,此时数组占用的空间,此时ESP指向先前保存的指向先前保存的EBP值。值。程序将这个值弹出并赋给程序将这个值弹出并赋给EBP,使,使EBP重新指向重新指向main()函数调用者的栈的底部。然后再弹出现在位于栈顶的函数调用者的栈的底部。然后再弹出现在位于栈顶的返回地址返回地址RET,赋给,赋给EIP,CPU继续执行继续执行EIP所指向所指向的命令。的命令。o说明说明1:EIP寄存器的内容表示将要执行的下一条指令寄存器的内容表示将要执行的下一条指令地址。地址。o说明说明2:当调用函数时,:当调用函数时,nCall指令会将返回地址(Call

31、指令下一条指令地址)压入栈nRet指令会把压栈的返回地址弹给EIP篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术307.2.1 栈溢出实例栈溢出实例o如果输入的字符串长度超过如果输入的字符串长度超过16个字节,例如输入:个字节,例如输入:hello world!AAAAAAAA,则当执行完,则当执行完gets(name)之后,栈的情况如图所示。之后,栈的情况如图所示。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入

32、侵与防范技术317.2.1 栈溢出实例栈溢出实例o由于输入的字符串太长,由于输入的字符串太长,name数组容纳不数组容纳不下,只好向栈的底部方向继续写下,只好向栈的底部方向继续写A。这些。这些A覆盖了堆栈的老的元素,从上页图可以看覆盖了堆栈的老的元素,从上页图可以看出,出,EBP,Ret 都已经被都已经被A覆盖了。覆盖了。o从从main返回时,就必然会把返回时,就必然会把AAAA的的ASCII码码0 x41414141视作返回地址,视作返回地址,CPU会试图执行会试图执行0 x41414141处的指令,结处的指令,结果出现难以预料的后果,这样就产生了一次堆果出现难以预料的后果,这样就产生了一次

33、堆栈溢出。栈溢出。o在在Windows XP下用下用VC6.0运行程序,结果运行程序,结果如下页图所示。如下页图所示。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术32篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2.2 堆溢出堆溢出o当我们需要较大的缓冲区或在写代码时不知道包含当我们需要较大的缓冲区或在写代码时不知道包含在缓冲区中对象的大小,常常要使用堆。在缓冲区中对象的大小,常常要使用堆。o堆溢出的工作方式几乎与栈溢出的工作方式

34、完全相堆溢出的工作方式几乎与栈溢出的工作方式完全相同,唯一不同的是,堆没有压栈和入栈操作,而是同,唯一不同的是,堆没有压栈和入栈操作,而是分配和回收内存。分配和回收内存。oC语言中使用语言中使用malloc()和和free()函数实现内存的函数实现内存的动态分配和回收,动态分配和回收,C+语言使用语言使用new()和和delete()函数来实现相同的功能。函数来实现相同的功能。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2.2 堆溢出实例堆溢出实例#include#include#include#include#define

35、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)bytes n,buf1,buf2,diff,diff);/*将将buf2 用用a填充填充*/memset(buf2,

36、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;篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2.2 堆溢出实例堆溢出实例o运行结果:运行结果:/users/test 41%./heap

37、1 buf1=0 x8049858,buf2=0 x8049870,diff=0 x18(24)bytes before overflow:buf2=aaaaaaaaaaaaaaa after overflow:buf2=bbbbbbbbaaaaaaao我们看到,我们看到,buf2的前八个字节被覆盖了,的前八个字节被覆盖了,这是因为往这是因为往buf1中填写的数据超出了它的中填写的数据超出了它的边界进入了边界进入了buf2的范围。由于的范围。由于buf2的数据的数据仍然在有效的仍然在有效的Heap区内,程序仍然可以正区内,程序仍然可以正常结束。常结束。篮球比赛是根据运动队在规定的比赛时间里得分

38、多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2.2 堆溢出实例堆溢出实例o虽然虽然buf1和和buf2是相继分配的,但它们并是相继分配的,但它们并不是紧挨着的,而是有八个字节的间距。这不是紧挨着的,而是有八个字节的间距。这是因为,使用是因为,使用malloc()动态分配内存时,动态分配内存时,系统向用户返回一个内存地址,实际上在这系统向用户返回一个内存地址,实际上在这个地址前面通常还有个地址前面通常还有8字节的内部结构,用字节的内部结构,用来记录分配的块长度、上一个堆的字节数以来记录分配的块长度、上一个堆的字节数以及一些标志等。这个间距可能随不同的系统及一些标志等。这

39、个间距可能随不同的系统环境而不同。环境而不同。buf1溢出后,溢出后,buf2的前的前8字字节也被改写为节也被改写为bbbbbbbb,buf2内部的部内部的部分内容也被修改为分内容也被修改为b。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2.2 堆溢出实例堆溢出实例o示意图:示意图:篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2.2 堆溢出堆溢出o堆溢出不如栈溢出流行,原因在于堆溢出不如栈溢出流行,原因在于n比栈溢出难度更大n需要结合其他的技术n对于内存中变量

40、的组织方式有一定的要求2023/1/20网络入侵与防范技术38篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2.3 BSS溢出溢出o.bss段存放全局和静态的未初始化变量,其分配比段存放全局和静态的未初始化变量,其分配比较简单,变量与变量之间是连续存放的,没有保留较简单,变量与变量之间是连续存放的,没有保留空间。空间。o下面这样定义的两个字符数组即是位于下面这样定义的两个字符数组即是位于BSS段:段:static char buf116,buf216;o如果事先向如果事先向buf2中写入中写入16个字符个字符A,之后再往,之后再

41、往buf1中写入中写入24个个B,由于变量之间是连续存放的,由于变量之间是连续存放的,静态字符数组静态字符数组buf1溢出后,就会覆盖其相邻区域溢出后,就会覆盖其相邻区域字符数组字符数组buf2的值。利用这一点,攻击者可以通的值。利用这一点,攻击者可以通过改写过改写BSS中的指针或函数指针等方式,改变程序中的指针或函数指针等方式,改变程序原先的执行流程,使指针跳转到特定的内存地址并原先的执行流程,使指针跳转到特定的内存地址并执行指定操作。执行指定操作。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2.4 格式化串溢出格式化串溢出

42、o与前面三种溢出不同的是,这种溢出漏洞是利用了编程与前面三种溢出不同的是,这种溢出漏洞是利用了编程语言自身存在的安全问题。格式化串溢出源自语言自身存在的安全问题。格式化串溢出源自*printf()类函数的参数格式问题(如类函数的参数格式问题(如printf、fprintf、sprintf等)。等)。oint printf(const char*format,arg1,arg2,);它们将根据它们将根据format的内容(的内容(%s,%d,%p,%x,%n,),将数据格式化后输出。),将数据格式化后输出。o问题在于:问题在于:*printf()函数并不能确定数据参数函数并不能确定数据参数arg

43、1,arg2,究竟在什么地方结束,即函数本身不知道参究竟在什么地方结束,即函数本身不知道参数的个数,而只会根据数的个数,而只会根据format中打印格式的数目依次中打印格式的数目依次打印堆栈中参数打印堆栈中参数format后面地址的内容。后面地址的内容。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2.4 格式化串溢出实例格式化串溢出实例/*程序说明:程序说明:%#x:按:按16进制输出,并在前面加上进制输出,并在前面加上0 x%.20d:按:按10进制输出,输出进制输出,输出20位,并在前面补位,并在前面补0%n:将显示内容的

44、长度输出到一个变量中去:将显示内容的长度输出到一个变量中去*/#include main()int num=0 x61616161;printf(Before:num=%#x n,num);printf(%.20d%n n,num,&num);printf(After:num=%#x n,num);篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2.4 格式化串溢出实例格式化串溢出实例o当程序执行第二个当程序执行第二个printf语句时,参数压栈语句时,参数压栈之后的内存布局如下:之后的内存布局如下:篮球比赛是根据运动队在规定的比

45、赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2.4 格式化串溢出实例格式化串溢出实例o根据根据C函数调用约定,参数从右向左依次压栈,所以参函数调用约定,参数从右向左依次压栈,所以参数数&num比参数比参数num先压入栈中。也就是说,程序中先压入栈中。也就是说,程序中将将&num(num的地址的地址)压入栈作为压入栈作为printf()的第三的第三个参数,而使用打印格式个参数,而使用打印格式%n会将打印总长度保存到对会将打印总长度保存到对应参数应参数(&num)的地址中去,从而改变了的地址中去,从而改变了num的值。的值。o整个程序的输出结果为:整个程序的输

46、出结果为:Before:num=0 x61616161 00000000001633771873 After:num=0 x14o变量变量num的值已经变成了的值已经变成了0 x14(20)。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.2.4 格式化串溢出实例格式化串溢出实例o如果将第二个如果将第二个printf语句修改为:语句修改为:printf(%.20d%n n,num);/注意,这里没有压注意,这里没有压num的地址入栈的地址入栈 o则运行的结果为则运行的结果为:Before:num=0 x61616161 Segme

47、ntation fault(core dumped)/执行第二个执行第二个printf()时发生段错误了时发生段错误了o原因:原因:printf()将堆栈中将堆栈中main()函数的变量函数的变量num当当作了作了%n所对应的参数,因此会将所对应的参数,因此会将0 x14保存到地址保存到地址0 x61616161中去,而中去,而0 x61616161是不能访问的是不能访问的地址,因此系统提示发生段错误。如果可以控制地址,因此系统提示发生段错误。如果可以控制num的内容,那么就意味着可以修改任意地址(当然是允许的内容,那么就意味着可以修改任意地址(当然是允许写入的地址)的内容。写入的地址)的内容

48、。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统2023/1/20网络入侵与防范技术457.2.4 格式化串溢出格式化串溢出o在实际应用中,如果遇到脆弱的程序,将用在实际应用中,如果遇到脆弱的程序,将用户的输入错误地放在格式化串的位置,就会户的输入错误地放在格式化串的位置,就会造成缓冲区溢出的攻击。造成缓冲区溢出的攻击。o如果攻击者可以事先构造好可以攻击的代码如果攻击者可以事先构造好可以攻击的代码shellcode,如果可以将返回地址覆盖成,如果可以将返回地址覆盖成shellcode的起始地址,当缓冲区溢出发生的起始地址,当缓冲区溢

49、出发生后,程序就会跳到精心设计好的后,程序就会跳到精心设计好的shellcode处执行,达到攻击的目的。处执行,达到攻击的目的。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.3 缓冲区溢出攻击的过程缓冲区溢出攻击的过程o7.3.1 在程序的地址空间安排适当代码在程序的地址空间安排适当代码o7.3.2 使控制流跳转到攻击代码使控制流跳转到攻击代码篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统7.3 缓冲区溢出攻击的过程缓冲区溢出攻击的过程o缓冲区溢出攻击的目的在于扰乱某

50、些工作在缓冲区溢出攻击的目的在于扰乱某些工作在特殊权限状态下的程序,使攻击者取得程序特殊权限状态下的程序,使攻击者取得程序的控制权,借机提高自己的权限,控制整个的控制权,借机提高自己的权限,控制整个主机。主机。o一般来说,攻击者要实现缓冲区溢出攻击,一般来说,攻击者要实现缓冲区溢出攻击,必须完成两个任务,一是必须完成两个任务,一是在程序的地址空间在程序的地址空间里安排适当的代码里安排适当的代码;二是通过适当的初始化;二是通过适当的初始化寄存器和存储器,让寄存器和存储器,让程序跳转程序跳转到安排好的地到安排好的地址空间执行。址空间执行。篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com