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

第2讲-1-内存漏洞详解-栈部分.ppt

  1. 1、本文档共49页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
内存漏洞详解 (一)栈漏洞 中国科学院 信息工程研究所 陈李维 主要内容 内存漏洞基础知识 内存漏洞详细介绍 缓冲区溢出漏洞 堆漏洞 内存信息泄露漏洞 其他内存漏洞 总结 主要内容 内存漏洞基础知识 内存漏洞详细介绍 缓冲区溢出漏洞 堆漏洞 内存信息泄露漏洞 其他内存漏洞 总结 冯诺依曼体系结构的特点 计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。 计算机处理的数据和指令一律用二进制数表示; 指令和数据不加区别混合存储在同一个存储器中; 顺序执行程序的每一条指令; 程序运行简单模型 一个程序是如何在计算机系统上运行的? 硬件 处理器每次从内存中读取一条指令,按照指令内容执行,然后取下一条指令执行,一直循环运行。 软件 程序经过编译器编译链接,最后变成了由指令和数据组成的可执行二进制文件。 处理器读取二进制文件中的指令和数据,运行程序。 计算机系统的运行,就是一条一条的指令在处理器上的执行。 程序运行简单模型 一个程序是如何在计算机系统上运行的? 程序运行简单模型 一个程序是如何在计算机系统上运行的? 程序运行简单模型 硬件 处理器 指令处理模块(取指,译码,执行,提交,写回) 寄存器堆 通用寄存器,用于暂存少量当前待处理的数据。 特殊寄存器,如指令寄存器和栈寄存器等。用于保存一些特殊的数据,如指令指针。 内存(硬盘) 存储所有指令和数据。 程序运行简单模型 软件:程序+数据,指令+数据 程序,即可执行二进制文件,保存在内存中 指令 程序内含数据 中间数据,程序运行过程中生成的中间数据,保存在内存中 静态数据 动态数据 输入数据,先存入内存,再进行处理 系统内部文件 系统外部输入数据(用户输入,网络数据等) 程序运行简单模型 指令来源:系统内部程序,系统外部输入(如安装程序、脚本等) 数据来源:系统内部程序和文件,系统外部输入,程序动态生成 基本假设 假设场景 假设计算机系统是正常的。也就是说,计算机系统没有后门,计算机系统硬件是正确的,计算机在最开始是正常的,用户对计算机的操作也是正确的。 假设计算机系统上的软件存在漏洞,攻击者也知道这些漏洞,并且能够利用这些漏洞进行攻击。 研究目标 基于以上假设条件,研究如何设计更加安全的计算机系统,能够尽可能的防御针对软件漏洞的攻击。 实际情况 通常我们认为最初始的计算机是可信的,系统内部程序和系统内部数据文件都是可信的,但是其中不可避免会存在一些漏洞。 随着外部数据的输入,计算机变得不可信。 外部可执行文件输入变成系统内部程序(病毒,木马,SQL注入,恶意脚本注入等) 外部数据输入,控制计算机系统的运行。 运行时攻击 从程序运行角度,软件控制硬件运行,系统运行=指令+数据。 运行时攻击:为了让系统执行攻击者预期的操作,攻击者需要控制系统的运行。 控制硬件:不考虑。 控制输入(指令+数据):病毒木马,流氓软件,SQL注入,恶意脚本等等,也不考虑。 控制输入(数据):利用内存漏洞进行攻击。 利用输入数据进行攻击 只利用输入数据进行攻击的根本原理: 在计算机系统中(冯诺依曼结构),指令和数据没有本质的区别。系统无法区分哪些是指令,哪些是数据。 内存:所有的指令和数据都保存在内存中。也就是说,只要控制了内存,就能实现任何操作,也就控制了整个计算机系统。 内存漏洞 内存漏洞:由于软件设计或实现的错误,导致攻击者能够构造特定的输入数据,非法修改或读取内存中的数据,从而实现攻击者预期的攻击操作。 内存漏洞不包括SQL注入等能够直接向内存中注入指令的软件漏洞。 32位环境下典型内存布局 简化的内存空间布局 代码段:存储指令(Text,Code) 数据段:存储程序中内含的数据(静态) 初始化数据段(Data) 未初始化数据段(BSS) 堆栈段:存储程序运行过程中产生的中间数据(动态) 栈(Stack) 堆(Heap) 栈 栈(Stack),是一块连续的内存空间 先入后出 生长方向与内存的生长方向正好相反, 从高地址向低地址生长 栈用于保存程序运行的中间数据 函数的参数 函数返回地址 一些通用寄存器(EDI,ESI…)的值 当前正在执行的函数的局部变量 堆 堆(Heap),也是位于数据段之上的一段内存区域。 堆允许程序在运行时动态的申请一块内存空间,用于存放用户自定义的数据。 堆的使用比栈更加灵活。 栈和堆的比较 栈: 由系统自动分配,先进后出 存放函数的参数、局部变量的值等 向低地址扩展,是一段连续的内存空间 方便快捷,自由度低 堆: 需要程序员自己管理,链表结构,顺序随意 存放程序员自定义的数据 向高地址扩展,存放区域可能不连续 灵活可控,自由度高 小结 介绍程序运行基本模型,并且从中引出内存漏洞,让大家理解内存漏洞的内涵。 简单介绍了内存布局,栈和堆的概念。 主要内容 内存漏洞基

文档评论(0)

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

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

1亿VIP精品文档

相关文档