网络攻防原理与技术 第3版 教案 -第9讲 缓冲区溢出攻击.docx

网络攻防原理与技术 第3版 教案 -第9讲 缓冲区溢出攻击.docx

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

内容

备注

《网络攻防原理与技术》课程教案

讲课题目:第九讲缓冲区溢出攻击

目的要求:了解缓冲区溢出攻击的基本概念;掌握缓冲区溢出攻击的基本原理;了解shellcode的构造方法;了解缓冲区溢出攻击的主要防护方法。

重点难点:缓冲区溢出攻击的基本原理。

方法步骤:理论讲授。

器材保障:电脑、投影仪。

主要教学内容:

一、缓冲区溢出攻击概述

缓冲区溢出的根源在于程序员没有对输入数据进行严格的边界检查。如果缓冲区被写满,而程序没有去检查缓冲区边界,也没有停止接收数据,这时就会发生缓冲区溢出。在非恶意情况下,缓冲区溢出一般会造成进程的状态紊乱,执行流程失去控制,最终进程通常会因为内存读写问题被操作系统杀死。如果攻击者精心构造写入数据,则当溢出发生后,攻击者可以精确执行其预定的代码,实现攻击的目的。

缓冲区溢出的缺陷普遍存在并且容易挖掘,而且利用成功后常常可以直接获得进程特权,甚至控制整台主机,因此缓冲区溢出攻击在安全攻击中占有很大的比重。缓冲区溢出不仅仅局限于非安全类型编程语言C/C++,安全类型的编程语言代码(如Java,Perl)的底层基础同样面临缓冲区溢出攻击的威胁。

二、缓冲区溢出攻击原理

(一)进程的内存结构

在大多数操作系统中,系统在创建一个进程时,会一次性给该进程分配一块内存(通常称为“静态分配”),这块内存在进程运行期间保持不变,主要由四部分组成:

1)文本(Text)段,保存程序的所有指令(操作码+操作数)。这个内存区域通常被标记为只读。

2)数据(Data)段,保存初始化的全局静态数据。

3)BSS(BlockStartedbySymbol)段,保存未初始化的全局数据。

4)堆栈(Stack),保存动态变量和函数调用的现场数据(主要包括函数的返回地址、函数参数、栈帧指针等),简称为“栈”。进程刚启动时,栈空间是空的,里面没有实体。在进程运行期间,对具体实体的栈分配是进程自行生成(压栈)和释放(弹出)实体,系统并不参与。只要压入的实体的总长度不超过栈空间尺寸,栈分配就与系统无关。如果超过了,就会引发栈异常。

除了上述一次性分配的内存外,进程还可以动态申请内存,这就是堆(Heap)分配。当进程需要生成实体时,向系统申请分配空间;不再需要该实体时,可以向系统申请回收这块空间。用户进程使用特定的函数,如malloc(),calloc(),realloc(),new()等申请堆块。由于是按需分配,因此堆的空间利用率最高。

缓冲区溢出攻击一般包含两个主要步骤。首先在程序中植入攻击代码或植入攻击代码所需的攻击参数(如果攻击代码已存在于目标程序中),然后改变程序的执行流程,转去执行攻击代码。根据是否需要植入攻击代码,可将缓冲区溢出攻击分为两种攻击模式。

第一种模式称为代码注入攻击。在这种模式下,攻击者向缓冲区写入的数据包含了攻击代码(可执行的二进制代码,通常称为“shellcode”),当发生缓冲区溢出时,溢出的数据覆盖掉一个可执行程序的入口地址(如函数的返回地址,函数指针变量等等),使得该地址指向shellcode,从而当程序试图通过该入口地址执行代码时,就会执行攻击者的shellcode。

第二种模式下,攻击者想要的攻击代码已经在被攻击的程序中了,攻击者所要做的只是为攻击代码传递它所需要的参数,然后用一个系统函数的地址覆盖可执行代码的入口地址,通过巧妙的构造可以使程序用预设的参数调用系统函数。

第二种攻击模式的出现是因为第一种模式需要栈或堆内存具有可执行属性,而随着缓冲区溢出攻击日益猖獗,出现了不可执行的堆或栈的概念,有些操作系统(比如Linux)采取了对应的补丁策略使得代码注入攻击不可行,而第二种攻击模式不受此限制。

一般来说,根据缓冲区溢出发生的位置可以将缓冲区溢出漏洞分成:栈溢出,堆(Heap)溢出,静态数据段(BSS)溢出。

栈溢出

一个堆栈包括:一块连续的内存块,一个堆栈指针(SP)指向堆栈的栈顶,一个基址指针(BP)保存具有固定偏移的局部变量和函数参数的基地址。在Intel处理器中,SP保存在寄存器esp中,BP保存在寄存器ebp中。

栈支持两种操作,压栈(PUSH)和弹出(POP)。PUSH是将数据放到栈的顶端,POP是将栈顶的数据取出。压栈和弹出操作均会自动改变esp的值,即栈顶发生变化。

在高级语言中,程序函数调用和函数中的临时变量都用到栈,参数的传递和返回值也通过栈来实现,通常对局部变量的引用是通过给出它们相对BP的偏移量来实现的。当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;其次把指令寄存器(IP,在Intel处理器中称为eip)中的内容压栈,作为返回地址(ret);第三个放入栈的是基址寄存

您可能关注的文档

文档评论(0)

xiaobao + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档