- 1、本文档共52页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章缓冲区溢出.ppt
第五章 缓冲区溢出 本章内容 5.1 缓冲区溢出相关概念 5.2 缓冲区溢出原理 5.3 溢出保护技术 5.4 安全编程技术 本章要求 了解缓冲区溢出的相关概念 明确缓冲区溢出的危害 理解栈溢出、堆溢出、整型溢出、格式化字符串溢出及文件流溢出的原因 掌握安全编程技术 引子 1988 Morris蠕虫事件 CERT统计数据 5.1 缓冲区溢出相关概念 缓冲区 从程序的角度,缓冲区就是应用程序用来保存用户输入数据、程序临时数据的内存空间 缓冲区的本质 数组 存储位置 Stack Heap 数据段 5.1 缓冲区溢出相关概念 缓冲区溢出 如果用户输入的数据长度超出了程序为其分配的内存空间,这些数据就会覆盖程序为其它数据分配的内存空间,形成所谓的缓冲区溢出 简单溢出实例 #include stdio.h int main() { char name[8] = {0}; printf(“Your name:”); gets(name); printf(“Hello,%s!”,name); return 0; } 缓冲区溢出的危害 应用程序异常 系统不稳定甚至崩溃 程序跳转到恶意代码,控制权被窃 5.2 缓冲区溢出原理 预备知识 理解程序内存空间 理解堆栈 理解函数调用过程 理解缓冲区溢出的原理 Windows环境下的堆栈 程序空间由何构成? 堆栈是什么? 堆栈里面放的都是什么信息? 程序使用超过了堆栈默认的大小怎么办? 在一次函数调用中,堆栈是如何工作的? 程序在内存中的映像 栈 栈是一块连续的内存空间 先入后出 生长方向与内存的生长方向正好相反, 从高地址向低地址生长 每一个线程有自己的栈 提供一个暂时存放数据的区域 使用POP/PUSH指令来对栈进行操作 使用ESP寄存器指向栈顶,EBP指向栈帧底 栈内容 函数的参数 函数返回地址 EBP的值 一些通用寄存器(EDI,ESI…)的值 当前正在执行的函数的局部变量 三个重要的寄存器 SP(ESP) 即栈顶指针,随着数据入栈出栈而发生变化 BP(EBP) 即基地址指针,用于标识栈中一个相对稳定的位置。通过BP,可以方便地引用函数参数以及局部变量 IP(EIP) 即指令寄存器,在将某个函数的栈帧压入栈中时,其中就包含当前的IP值,即函数调用返回后下一个执行语句的地址 函数调用过程 把参数压入栈 保存指令寄存器中的内容,作为返回地址 放入堆栈当前的基址寄存器 把当前的栈指针(ESP)拷贝到基址寄存器,作为新的基地址 为本地变量留出一定空间,把ESP减去适当的数值 函数调用中栈的工作过程 调用函数前 压入栈 上级函数传给A函数的参数 返回地址(EIP) 当前的EBP 函数的局部变量 调用函数后 恢复EBP 恢复EIP 局部变量不作处理 例子 int AFunc(int i,int j) {int m = 3;int n = 4; ????m = i;n = j; ????BFunc(m,n); ????return 8; } int BFunc(int i,int j) { int m = 1; int n = 2; m = i; n = j; return m; } 函数调用中栈的工作过程 函数调用中栈的工作过程 当缓冲区溢出发生时…… int AFunc(int i,int j) {int m = 3;int n = 4; char szBuf[8] = {0}; strcpy(szBuf, “This is a overflow buffer!”); ????m = i; n = j; ????BFunc(m,n); ????return 8; } 5.3 缓冲区溢出原理及其利用 缓冲区溢出种类 栈溢出 堆溢出 整型溢出 格式化字符串溢出 其他溢出 栈溢出 特点 缓冲区在栈中分配 拷贝的数据过长 覆盖了函数的返回地址或其它一些重要数据结构、函数指针 栈溢出实例 int AFunc(int i,int j) {int m = 3;int n = 4; char szBuf[8] = {0}; *(int *)((int)szBuf+20) = BFunc; ????m = i; n = j; ????BFunc(m,n); ????return 8; } 堆溢出 堆和栈有何区别 内存的动态分配与静态分配 堆溢出特点 缓冲区在堆中分配 拷贝的数据过长 覆盖了堆管理结构 #define BUFLEN 32 int main(int argc, char* argv[ ]) { char *buf1; buf1 = (char*)malloc(B
文档评论(0)