缓冲区溢出

合集下载

缓冲区溢出名词解释

缓冲区溢出名词解释

缓冲区溢出名词解释
缓冲区溢出(Buffer Overflow),指当程序向缓冲区中写入超过其容量的数据,导致多余的数据覆盖了紧邻缓冲区的内存空间,从而破坏了程序原有的调用栈和指针。

攻击者可以通过逆向工程或其他手段找出缓冲区溢出的漏洞,并在缓冲区中注入恶意代码,从而获取系统管理员权限,进行非法操作。

缓冲区溢出是最常见和最危险的安全漏洞之一,也是黑客攻击常用的手段之一。

因此,在软件开发过程中,一定要注意对缓冲区操作的合法性、正确性和安全性进行严格的检查和控制。

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

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

2024/3/29
网络入侵与防范技术
7
篮球比赛是根据运动队在规定的比赛 时间里 得分多 少来决 定胜负 的,因 此,篮 球比赛 的计时 计分系 统是一 种得分 类型的 系统
7.1 缓冲区溢出概述
隐蔽性:
第三,由于漏洞存在于防火墙内部的主机上,攻击者可 以在防火墙内部堂而皇之地取得本来不被允许或没有权 限的控制权;
2024/3/29
网络入侵与防范技术
1
篮球比赛是根据运动队在规定的比赛 时间里 得分多 少来决 定胜负 的,因 此,篮 球比赛 的计时 计分系 统是一 种得分 类型的 系统
7.1 缓冲区溢出概述
什么是缓冲区?它是包含相同数据类型实例的一个 连续的计算机内存块。是程序运行期间在内存中分 配的一个连续的区域,用于保存包括字符数组在内 的各种数据类型。
Windows系统中缓冲区溢出的事例更是层出不穷。 2001年“红色代码”蠕虫利用微软IIS Web Server中
的缓冲区溢出漏洞使300 000多台计算机受到攻击; 2003年1月,Slammer蠕虫爆发,利用的是微软SQL
Server 2000中的缺陷; 2004年5月爆发的“振荡波”利用了Windows系统的活
产生碎片不同 对堆来说,频繁的new/delete或者malloc/free势必会造成 内存空间的不连续,造成大量的碎片,使程序效率降低。 对栈而言,则不存在碎片问题,因为栈是先进后出的队列, 永远不可能有一个内存块从栈中间弹出。
生长方向不同 堆是向着内存地址增加的方向增长的,从内存的低地址向高 地址方向增长。 栈的生长方向与之相反,是向着内存地址减小的方向增长, 由内存的高地址向低地址方向增长。
1999年w00w00安全小组的Matt Conover写了基于 堆缓冲区溢出专著,对堆溢出的机理进行了探索。

缓冲区溢出原因及解决

缓冲区溢出原因及解决

第三讲缓冲区溢出n1 缓冲区溢出问题简介n2 几种典型的缓冲区溢出n3 防范措施缓冲区溢出1 缓冲区溢出问题简介缓冲区溢出是一种常见的漏洞.据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上.这种错误的状态发生在写入内存的数据超过了分配给缓冲区的大小的时候,就像一个杯子只能盛一定量的水,如果放到杯子中的水太多,多余的水就会一出到别的地方。

由于缓冲区溢出,相邻的内存地址空间被覆盖,造成软件出错或崩溃。

如果没有采取限制措施,可以使用精心设计的输入数据使缓冲区溢出,从而导致安全问题。

缓冲区溢出缓冲区溢出问题的历史很长一段时间以来,缓冲区溢出都是一个众所周知的安全问题, C程序的缓冲区溢出问题早在70年代初就被认为是C语言数据完整性模型的一个可能的后果。

这是因为在初始化、拷贝或移动数据时,C语言并不自动地支持内在的数组边界检查。

虽然这提高了语言的执行效率,但其带来的影响及后果却是深远和严重的。

•1988年Robert T. Morris的finger蠕虫程序.这种缓冲区溢出的问题使得Internet几乎限于停滞,许多系统管理员都将他们的网络断开,来处理所遇到的问题. •1989年Spafford提交了一份关于运行在VAX机上的BSD版UNIX的fingerd的缓冲区溢出程序的技术细节的分析报告,引起了部分安全人士对这个研究领域的重视•1996年出现了真正有教育意义的第一篇文章, Aleph One在Underground发表的论文详细描述了Linux系统中栈的结构和如何利用基于栈的缓冲区溢出。

缓冲区溢出Aleph One的贡献还在于给出了如何写开一个shell的Exploit的方法,并给这段代码赋予shellcode的名称,而这个称呼沿用至今,我们现在对这样的方法耳熟能详--编译一段使用系统调用的简单的C程序,通过调试器抽取汇编代码,并根据需要修改这段汇编代码。

•1997年Smith综合以前的文章,提供了如何在各种Unix变种中写缓冲区溢出Exploit更详细的指导原则。

Windows系统的常见系统安全漏洞及修复方法

Windows系统的常见系统安全漏洞及修复方法

Windows系统的常见系统安全漏洞及修复方法Windows系统作为广泛使用的操作系统,其安全性一直备受关注。

然而,由于其庞大复杂的代码和广泛的应用领域,Windows系统也存在一些常见的系统安全漏洞。

本文将介绍几个常见的漏洞,并提供相应的修复方法,以帮助用户提升系统的安全性。

一、系统漏洞1:缓冲区溢出漏洞缓冲区溢出是一类最常见的漏洞之一,通过向缓冲区写入超过其容量的数据,攻击者可以执行恶意代码或篡改系统数据。

修复方法包括:1. 更新系统补丁:微软定期发布安全补丁来修复已知的缓冲区溢出漏洞,用户应及时安装最新的系统更新。

2. 输入校验:开发人员应在编写代码时,对用户输入进行严格的合法性检查,以减少缓冲区溢出的潜在风险。

二、系统漏洞2:权限提升漏洞权限提升漏洞是指攻击者通过提升自己的访问权限,获取更高的系统权限。

修复方法包括:1. 最小权限原则:合理设置用户账户的权限,给予足够的权限以执行任务,但不要给予过高的权限。

2. 更新系统补丁:微软会针对已知的权限提升漏洞发布相应的安全补丁,用户应及时进行更新以修复漏洞。

三、系统漏洞3:弱密码漏洞弱密码是许多安全漏洞的源头,攻击者可以通过猜测密码或使用暴力破解技术来获取系统访问权限。

修复方法包括:1. 使用复杂密码:密码应包含大小写字母、数字和特殊字符,长度不少于8位,并且避免使用常见的字典词汇。

2. 多因素认证:启用多因素认证可以大大增加系统的安全性,即在输入密码后,还需要验证其他身份识别信息。

四、系统漏洞4:未及时更新软件漏洞许多应用程序和驱动程序也可能存在安全漏洞,攻击者可以利用这些漏洞来入侵系统。

修复方法包括:1. 定期检查更新:用户应定期检查软件和驱动程序的官方网站,下载并安装最新版本的软件以修复已知的漏洞。

2. 自动更新功能:许多软件和驱动程序提供自动更新功能,用户应及时启用该功能以便获取最新的安全修复。

总结:Windows系统的安全性对于用户和组织来说至关重要。

C语言中常见的安全漏洞及防范方法

C语言中常见的安全漏洞及防范方法

C语言中常见的安全漏洞及防范方法C语言作为一种广泛应用于系统开发和嵌入式设备的编程语言,虽然具有高效性和灵活性,但在安全性方面却存在一些常见的漏洞。

本文将介绍C语言中常见的安全漏洞,并提供相应的防范方法。

一、缓冲区溢出漏洞缓冲区溢出是C语言中最常见的安全漏洞之一。

当程序试图向一个已经装满数据的缓冲区写入更多的数据时,就会导致缓冲区溢出。

攻击者可以利用这个漏洞来修改程序的执行流,执行恶意代码或者获取敏感信息。

防范方法:1. 使用安全的函数:应该使用安全的函数,如`strncpy`、`snprintf`等,而不是不安全的函数`strcpy`、`sprintf`等。

安全的函数会检查数据长度,避免发生缓冲区溢出。

2. 输入验证:对于用户输入的数据,应该进行输入验证,确保输入的数据不会超出缓冲区的长度。

3. 使用堆栈保护技术:可以使用堆栈保护技术,如栈溢出检测、堆栈随机化等,在一定程度上提高程序对缓冲区溢出漏洞的防护能力。

二、格式化字符串漏洞格式化字符串漏洞是由于未正确使用格式化字符串函数(如`printf`、`sprintf`等)导致的安全问题。

当攻击者能够控制格式化字符串的参数时,就可能导致信息泄露或者任意代码执行。

防范方法:1. 限制格式化字符串的输入:应该限制用户输入的格式化字符串,确保输入的格式化字符串参数是合法且不含恶意代码。

2. 使用安全的格式化函数:使用安全的格式化函数,如`snprintf`等,这些函数会检查参数的有效性,避免格式化字符串漏洞的发生。

3. 程序审计:对于已经存在的代码,应进行定期的程序审计,识别和修复潜在的格式化字符串漏洞。

三、整数溢出漏洞整数溢出漏洞是由于未对输入数据进行正确的检查和验证,导致整数值超出其数据类型范围,从而引发安全问题。

攻击者可以利用这个漏洞来改变程序的行为,执行未经授权的操作。

防范方法:1. 输入验证:对于用户输入的数据,应该进行输入验证,确保输入的数据范围在合理的范围内。

简述缓冲区溢出攻击的原理

简述缓冲区溢出攻击的原理

简述缓冲区溢出攻击的原理
缓冲区溢出攻击是一种常见的网络攻击方式,其基本原理是利用程序在处理数据时,对数据的长度没有进行完全检查,导致过长的数据被写入程序的缓冲区中,从而覆盖了程序中原有的数据,甚至改变了程序的执行流程。

具体来说,当一个程序接收来自网络或用户的输入数据时,这些数据会被存放在一个特定的缓冲区中,程序会根据预设的规则和算法对这些数据进行处理。

如果输入的数据长度超出了缓冲区的容量,那么多余的数据就会被写入到相邻的内存空间中,这就是缓冲区溢出。

攻击者可以通过发送构造精细的恶意数据,将恶意代码写入程序的缓冲区中,从而修改程序的执行流程,实现恶意的攻击目的。

这些攻击方式包括堆栈溢出、格式化字符串攻击、整形溢出等。

为了避免缓冲区溢出攻击,程序开发者需要进行严格的输入验证,确保输入数据的长度不超过缓冲区的容量,还需要对程序中的缓冲区进行合理的内存管理和安全保障措施。

同时,用户也需要注意保护自己的计算机安全,不要轻信来路不明的数据,避免成为攻击者的下一个目标。

- 1 -。

缓冲区上溢和下溢

缓冲区上溢和下溢

看到这个才真正理解了上溢下溢的概念,不敢独享,分享给大家,希望大家少走一点弯路!缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。

溢出的数据覆盖在合法数据上。

理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。

但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。

操作系统所使用的缓冲区又被称为堆栈,在各个操作进程之间,指令被临时存储在堆栈当中,堆栈也会出现缓冲区溢出。

上溢是当一个超长的数据进入到缓冲区时,超出部分被写入上级缓冲区,上级缓冲区存放的可能是数据、上一条指令的指针,或者是其他程序的输出内容,这些内容都被覆盖或者破坏掉。

可见一小部分数据或者一套指令的溢出就可能导致一个程序或者操作系统崩溃。

下溢是当一个超长的数据进入到缓冲区时,超出部分被写入下级缓冲区,下级缓冲区存放的是下一条指令的指针,或者是其他程序的输出内容。

缓存(Cache memory)是硬盘控制器上的一块内存芯片,具有极快的存取速度,它是硬盘内部存储和外界接口之间的缓冲器。

由于硬盘的内部数据传输速度和外界介面传输速度不同,缓存在其中起到一个缓冲的作用。

缓存的大小与速度是直接关系到硬盘的传输速度的重要因素,能够大幅度地提高硬盘整体性能。

当硬盘存取零碎数据时需要不断地在硬盘与内存之间交换数据,如果有大缓存,则可以将那些零碎数据暂存在缓存中,减小外系统的负荷,也提高了数据的传输速度。

硬盘的缓存主要起三种作用:一是预读取。

当硬盘受到CPU指令控制开始读取数据时,硬盘上的控制芯片会控制磁头把正在读取的簇的下一个或者几个簇中的数据读到缓存中(由于硬盘上数据存储时是比较连续的,所以读取命中率较高),当需要读取下一个或者几个簇中的数据的时候,硬盘则不需要再次读取数据,直接把缓存中的数据传输到内存中就可以了,由于缓存的速度远远高于磁头读写的速度,所以能够达到明显改善性能的目的;二是对写入动作进行缓存。

缓冲区溢出

缓冲区溢出

网络安全实验教程
16
4.5 UAF类型缓冲区溢出实验
实验目的
✓ 了解UAF类型缓冲区溢出的原理; ✓ 掌握UAF类型缓冲区溢出的发生过程。
实验内容
✓ 使用VC 6.0的源码调试功能,观察内存块 p1的创建和释放过程,并观察p1释放后再 次使用的情况,以了解UAF类型缓冲区溢出 的原理。
网络安全实验教程
17
4.5 UAF类型缓冲区溢出实验
实验环境
✓ 操作系统:Windows XP SP3 32位; ✓ 编译工具:VC6.0。
网络安全实验教程
18
4.5 UAF类型缓冲区溢出实验
实验步骤
✓ 1.编译代码;
✓ 2.观察内存块p1->func仍然为未初始化的 0xcdcdcdcd;
✓ 3.观察内存块p1->func被赋值为myfunc函数 地址;
网络安全实验教程
20
4.6 覆盖返回地址实验
实验目的
✓ 了解通过覆盖返回地址进行缓冲区溢出利用 的原理;
✓ 掌握覆盖返回地址过程。
实验内容
✓ 在栈溢出实验的基础上,通过观察返回地址 被覆盖后的后续流程,了解和掌握通过覆盖 返回地址进行缓冲区溢出利用的技术。
网络安全实验教程
21
4.6 覆盖返回地址实验
✓ 1.编译代码; ✓ 2.使用VC6.0加载程序t1; ✓ 3.检查参数i大于10,不能通过条件判断; ✓ 4.修改参数i为65537; ✓ 5.观察上下文环境,i=0x00010001(65537)。
网络安全实验教程
14
4.4 整型溢出实验
✓ 6.发生宽度溢出:
➢ 注意到s=0x0001,i的高位被截断了。
EBP
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第4章缓冲区溢出内容提要缓冲区溢出是一种常见的软件漏洞形式,可被用于实现远程植入、本地提权、信息泄露、拒绝服务等攻击目的,具有极大的攻击力和破坏力。

学习缓冲区溢出原理和利用有助于巩固自身安全,加强系统防御。

本章包含六个实验,涵盖了缓冲区溢出原理和利用两部分内容,前者包括栈溢出、整型溢出、UAF(Use After Free)类型缓冲区溢出实验,后者通过覆盖返回地址、覆盖函数指针和覆盖SHE(Structured Exception Handler)链表实验学习溢出利用技术。

本章重点y缓冲区溢出原理及实践;y常见缓冲区溢出利用方式及实践。

·52·网络安全实验教程4.1 概述缓冲区一词在软件中指的是用于存储临时数据的区域,一般是一块连续的内存区域,如char Buffer[256]语句就定义了一个256 B的缓冲区。

缓冲区的容量是预先设定的,但是如果往里存入的数据大小超过了预设的区域,就会形成所谓的缓冲区溢出。

例如,memcpy(Buffer, p, 1024)语句,复制的源字节数为1024 B,已经超过了之前Buffer缓冲区定义的256 B。

由于缓冲区溢出的数据紧随源缓冲区存放,必然会覆盖到相邻的数据,从而产生非预期的后果。

从现象上看,溢出可能会导致:(1)应用程序异常;(2)系统服务频繁出错;(3)系统不稳定甚至崩溃。

从后果上看,溢出可能会造成:(1)以匿名身份直接获得系统最高权限;(2)从普通用户提升为管理员用户;(3)远程植入代码执行任意指令;(4)实施远程拒绝服务攻击。

产生缓冲区溢出的原因有很多,如程序员的疏忽大意,C语言等编译器不做越界检查等。

学习缓冲区溢出的重点在于掌握溢出原理和溢出利用两方面的内容。

4.2 缓冲区溢出原理及利用下面介绍缓冲区溢出原理和缓冲区溢出利用两部分内容。

4.2.1 缓冲区溢出原理栈溢出、整型溢出和UAF(Use After Free)类型缓冲区溢出是缓冲区溢出常见的三种溢出类型,下面分别介绍它们的原理。

1.栈溢出原理“栈”是一块连续的内存空间,用来保存程序和函数执行过程中的临时数据,这些数据包括局部变量、类、传入/传出参数、返回地址等。

栈的操作遵循后入先出(Last In First Out,LIFO)的原则,包括出栈(POP指令)和入栈(PUSH指令)两种。

栈的增长方向为从高地址向低地址增长,即新入栈数据存放在比栈内原有数据更低的内存地址,因此其增长方向与内存的增长方向正好相反。

有三个CPU寄存器与栈有关:(1)SP(Stack Pointer,x86指令中为ESP,x64指令中为RSP),即栈顶指针,它随着数据入栈出栈而变化;第4章 缓冲区溢出 ·53·(2)BP (Base Pointer ,x86指令中为EBP ,x64指令中为RBP ),即基地址指针,它用于标示栈中一个相对稳定的位置,通过BP ,可以方便地引用函数参数及局部变量;(3)IP (Instruction Pointer ,x86指令中为EIP ,x64指令中为RIP ),即指令寄存器,在调用某个子函数(call 指令)时,隐含的操作是将当前的IP 值(子函数调用返回后下一条语句的地址)压入栈中。

当发生函数调用时,编译器一般会形成如下程序过程: (1)将函数参数依次压入栈中;(2)将当前IP 寄存器的值压入栈中,以便函数完成后返回父函数;(3)进入函数,将BP 寄存器值压入栈中,以便函数完成后恢复寄存器内容至函数之前的内容;(4)将SP 值赋值给BP ,再将SP 的值减去某个数值用于构造函数的局部变量空间,其数值的大小与局部变量所需内存大小相关;(5)将一些通用寄存器的值依次入栈,以便函数完成后恢复寄存器内容至函数之前的内容,此时栈的布局如图4.1所示。

图4.1 栈布局图(6)开始执行函数指令;(7)函数完成计算后,依次执行程序过程(5)、(4)、(3)、(2)、(1)的逆操作,即先恢复通用寄存器内容至函数之前的内容,接着恢复栈的位置,恢复BP 寄存器内容至函数之前的内容,再从栈中取出函数返回地址之后返回父函数,最后根据参数个数调整SP 的值。

栈溢出指的是向栈中的某个局部变量存放数据时,数据的大小超出了该变量预设的空间大小,导致该变量之后的数据被覆盖破坏。

由于溢出发生在栈中,所以被称为栈溢出。

防范栈溢出需要从以下几方面入手: (1)编程时注意缓冲区的边界;(2)不使用strcpy 、memcpy 等危险函数,仅使用它们的替代函数; (3)在编译器中加入边界检查;(4)在使用栈中重要数据之前加入检查,如Security Cookie 技术。

内存低端内存高端ESP·54·网络安全实验教程2.整型溢出原理在数学概念中,整数指的是没有小数部分的实数变量;而在计算机中,整数包括长整型、整型和短整型,其中每一类又分为有符号和无符号两种类型。

如果程序没有正确的处理整型数的表达范围、符号或者运算结果时,就会发生整型溢出问题,这一般又分为三种类型。

(1)宽度溢出。

由于整型数都有一个固定的长度,存储其的最大值是固定的,如果该整型变量尝试存储一个大于这个最大值的数,将会导致高位被截断,引起整型宽度溢出。

(2)符号溢出。

有符号数和无符号数在存储的时候是没有区别的,如果程序没有正确地处理有符号数和无符号数之间的关系,比如将有符号数当做无符号数对待,或者将无符号数当做有符号数对待时,就会导致程序理解错误,引起整型符号溢出问题。

(3)运算溢出。

整型数在运算过程中常常发生进位,如果程序忽略了进位,就会导致运算结果不正确,引起整型运算溢出问题。

整型溢出是一种难以杜绝的漏洞形式,其大量存在于软件中。

要防范该溢出问题除了注意正确编程外,还可以借助代码审核工具来发现问题。

另外整型溢出本身并不会带来危害,只有当错误的结果被用到了如字符串复制、内存复制等操作中才会导致严重的栈溢出等问题,因此也可以从防范栈溢出、堆溢出的角度进行防御。

3.UAF类型缓冲区溢出原理UAF类型缓冲区溢出是目前较为常见的漏洞形式,它指的是由于程序逻辑错误,将已释放的内存当做未释放的内存使用而导致的问题,多存在于Internet Explorer等使用了脚本解释器的浏览器软件中,因为在脚本运行过程中内部逻辑复杂,容易在对象的引用计数等方面产生错误,导致使用已释放的对象。

4.2.2 缓冲区溢出的利用缓冲区溢出会造成程序崩溃,但要达到执行任意代码的目的,还需要做到如下两点:一是在程序的地址空间里安排适当的代码,这些代码可以完成攻击者所需的功能;二是控制程序跳转到第一步安排的代码去执行,从而完成指定的功能。

1)在程序的地址空间里安排适当的代码在程序的地址空间里安排适当的代码包括植入法和利用已经存在的代码两种方法。

(1)植入法:一般是向被攻击程序输入一个过长的字符串作为参数,而程序将该字符串不加检查地放入缓冲区。

这个字符串里包含了由攻击者精心构造的一段Shellcode。

Shellcode实质上就是机器指令序列,可以完成攻击者所需的功能。

(2)利用已经存在的代码:有时候攻击者所需要的代码已经在被攻击的程序中,攻击者可以不必自己再去写烦琐的Shellcode,而只需控制程序跳转至该段代码并执行,然后给相应的函数调用传递一些参数。

2)控制程序跳转的方法(1)覆盖返回地址:每当发生一个函数调用时,栈中都会保存函数结束后的返回地第4章缓冲区溢出·55·址。

攻击者通过改写返回地址使之指向攻击代码,这类缓冲区溢出被称做“stack smashing attack”。

(2)覆盖函数或者对象指针:函数指针可以用来定位任何地址空间,如果攻击者在能够溢出的缓冲区附近找到函数指针,那么就可以通过溢出该缓冲区来改变函数指针。

在之后的某一时刻,当程序调用该函数时,程序的流程就按照攻击者的意图跳转了。

(3)覆盖SEH链表:有的函数在使用函数指针和返回地址之前做了检测,一旦发现更改就会做相应的处理来避免遭受溢出攻击,从而使以上两种方法无法成功,而若通过覆盖Windows系统下的结构化异常处理(SEH)链表则可以较好地绕过防护完成攻击。

下面介绍这三种缓冲区溢出利用技术。

1.覆盖返回地址通过覆盖返回地址来控制程序流程是栈溢出最常见的利用技术。

从前面介绍的栈溢出原理可以看出,返回地址处于栈中较高内存的位置,很容易被超长的局部变量所覆盖,程序最终执行至被覆盖的地址处指令时发生错误。

由于该地址来自局部变量,而局部变量又来自用户输入即程序参数,因此只需要修改程序参数就可以控制程序的流程。

注意,当程序出错时,ESP寄存器的值正好指向程序参数中的某个位置,因此要利用该漏洞,可以将该处填充为shellcode,并将程序参数中被覆盖的返回地址的4个字节修改为内存的某个指令地址,该地址的指令为jmp esp(16进制为0xff 0xe4)。

此时覆盖返回地址时的栈布局如图4.2所示。

图4.2 覆盖返回地址时的栈布局2.覆盖函数或对象指针函数指针是一种特殊的变量,它用于保存函数的起始地址。

当调用函数指针时,程序会转向该起始地址执行代码。

如果函数指针被保存在缓冲区之后(更高地址),当发生缓冲区溢出时,函数指针就会被覆盖,之后如果调用了该函数指针,就可以控制程序的流程了。

·56·网络安全实验教程3.覆盖SEH链表首先简单介绍一下Windows结构化异常处理机制。

结构化异常处理是一种对程序异常的处理机制,它把错误处理代码与正常情况下所执行的代码分开。

当系统检测到软件发生异常时,执行线程立即被中断,并将控制权交给异常调度程序,它负责从结构化异常处理(SEH)链表中查找处理异常的方法。

SEH链表按照单链表的结构组织,链中所有节点都存储在栈空间。

每个链中的节点由两个字段组成,第一个字段是指向下一个节点的指针,第二个字段是异常处理回调函数的指针。

而最后一个节点的Next指针为0xFFFFFFFF,如图4.3所示。

图4.3 SEH链表结构图SEH链表的插入操作采用头插法,当有新的结构加入链中时,通常会看到下面的操作:pushxxxxxxxxmoveax,fs:[0]pusheaxmovdwordptrfs:[0],esp其中,fs:[0]始终指向链中的第一个节点,而push xxxxxxxx所做的工作就是把回调函数指针压入栈中。

接着通过后面三条汇编指令修改两个指针,完成节点的插入操作。

当线程中发生异常时,操作系统需要从头节点遍历SEH链表,调用第一个回调函数来处理异常;如果异常已被处理则停止遍历,否则调用下一个回调函数。

依此类推,如果所有回调函数都不能处理异常,则使用最后一个——默认的异常处理节点,弹出出错的对话框,然后中止进程的执行。

相关文档
最新文档