网站大量收购闲置独家精品文档,联系QQ:2885784924

《软件安全》课件第3章-典型的软件漏洞.pptx

《软件安全》课件第3章-典型的软件漏洞.pptx

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

典型的软件漏洞

缓冲区溢出漏洞

Web应用程序漏洞竞争条件

数据安全漏洞

目录

CONTENTS

章节Part

01

3.1缓冲区溢出漏洞

●函数栈帧结构●堆和栈

●函数调用原理

●缓冲区溢出漏洞原理

●栈溢出漏洞

●堆溢出漏洞

●格式化串漏洞

●弥补及防御

●著名漏洞

3.1.1函数栈帧结构

一个PE文件(可执行文件)运行过程中,通过层层调用相关函数实现特定功能。

C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。

同一个进程中的函数栈帧连续存放,这就为缓冲区溢出攻击提供了可能。

①ESP:栈指针寄存器(extendedstack

pointer),其存放的是当前栈帧的栈顶指针。

②EBP:基址指针寄存器(extededbase

pointer),其存放的是当前栈帧的栈底指针。

缓冲区

局部变量

前栈帧EBP

返回地址参数

缓冲区

局部变量

前栈帧EBP

返回地址参数

ESP寄存器

EBP寄存器

3.1.1函数栈帧结构

当前栈帧

原始栈帧

函数栈帧分布图

栈帧生长方向

低地址

高地址

3.1.2堆和栈

堆在内存中由下向上增长,而栈是向下增长。程序调用过程中,函数的栈帧就存放在栈中,因此函数栈帧是向下增长的。内存中,函数的数据存放在缓冲区中,缓冲区是函数栈帧中的一部分。

a)通用

b)UNIX

c)Win32

内存始址Code(代码)

Text(文本)

ReservedbyOS(操作系统保留)

Data(数据)

Data(数据)

Stack(栈)

Heap(堆)

BSS

Heap(堆)

Heap(堆)

Code(代码)

Constants(常量)

Staticvaiables(静态常量)

内存终址Stack(栈)

Stack(栈)

Uninitializedvariables(未初始化的变量)

3.1.2堆和栈

堆和栈在进程内存中的分布

3.1.3函数调用原理

进程执行过程中,为主函数分配栈帧,主函数调用其他函数,为它们申请栈帧并存放在主函数栈帧之后,函数再调用其他函数时,就作为母函数为子函数申请栈帧,子函数执行完后按照栈帧中保存的返回地址返回母函数,层层递进之后完成进程功能。

3.1.3函数调用原理

进程中的函数调用主要通过以下几个步骤实现:

a)参数入栈:将被调用函数的参数按照从右向左的顺序依次入栈。

b)返回地址入栈:将call指令的下一条指令的地址入栈。

c)代码区跳转:处理器从代码区的当前位置跳到被调用函数的入口处。

d)栈帧调整:这主要包括保存当前栈帧状态、切换栈帧和给新栈帧分配空间。

代码空间:执行到main代码区的call指令时,跳转到

funca的代码区继续执行

系统栈空间:为配合funca的执行,在系统栈中为其开辟新的栈帧并压入

代码空间:程序被装入,由main函数代码空间依次取指执行

系统栈空间:系统栈栈顶为当前正在执行的main函数栈帧

3.1.3函数调用原理

函数调用原理

3.1.4缓冲区溢出的原理

在栈帧中分配有固定的缓冲区空间,当用户输入的数据长度超出缓冲区范围,就有可能覆盖其他有用的数据,从而导致不可预测的情况发生。

如果输入的数据经过精心的设计,就可以达到特定的目的,比如植入恶意代码,将函数返回到特定的节点执行,或者执行其他的操作。

缓冲区

bufferdata

3.1.4缓冲区溢出的原理

data

返回地址

ebp

滥出区

数据

栈增长方向

拷贝

3.1.5栈溢出漏洞

函数栈中存放的一般是函数定义的变量等数据,通过对变量赋值可以实现栈溢出,通过栈溢出覆盖返回函数可使函数返回到特定节点。

上述过程虽然理论上能完成栈溢出攻击行为,但是实际上很难实现。操作系统每次加载可执行文件到进程空间的位置都是无法预测的,因此栈的位置实际是不固定的,通过硬编码覆盖新返回地址的方式并不可靠。

更普遍的做法是使用跳板。

操作系统

数据段

代码段

0shellcode

特殊地址

缓冲区

buffer

3.1.5栈溢出漏洞

0xffffffff

栈溢出攻击

PC

jmpesp

跳板

栈增长方向

3.1.6堆溢出漏洞

和栈不同,堆的数据结构并不是由系统(无论是机器系统还是操作系统)支持的,而是由函数库提供的。基本的malloc/realloc/free函数维护了一套内

文档评论(0)

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

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

1亿VIP精品文档

相关文档