第4章缓冲区溢出讲解.ppt

  1. 1、本文档共52页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
栈溢出实例 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; } 用BFunc的地址替换正常的AFunc返回地址,使程序运行至BFunc 堆溢出 堆和栈有何区别 内存的动态分配与静态分配 堆溢出特点 缓冲区在堆中分配 拷贝的数据过长 覆盖了堆管理结构 #define BUFLEN 32 int main(int argc, char* argv[ ]) { char *buf1; buf1 = (char*)malloc(BUFLEN); strcpy(buf1,argv[1]); printf(%s\n,buf1); free(buf1); return 0; } 整型溢出 宽度溢出(Widthness Overflow) 尝试存储一个超过变量表示范围的大数到变量中 运算溢出(Arithmetic Overflow) 如果存储值是一个运算操作,稍后使用这个结果的程序的任何一部分都将错误的运行,因为这个计算结果是不正确的。 符号溢出(Signedness Bug) 一个无符号的变量被看作有符号,或者一个有符号的变量被看作无符号 宽度溢出示例 void main(int argc,char* argv[]) { unsigned short s; int i; char buf[80]; i = atoi(argv[1]); s = i; if(s = 80) return; memcpy(buf,argv[2],i); } 运算溢出示例 void CopyIntArray(int *array,int len) { int* myarray,i; myarray = malloc(len*sizeof(int)); if(myarray == NULL) return; for(i=0;ilen;i++) myarray[i] = arrary[i]; } 符号溢出示例 void CopySomething(char *buf,int len) { char kbuf[800]; int size = sizeof(kbuf); if(len size) return; memcpy(kbuf,buf,len); } 格式化字符串溢出 关键字 “%n” 产生原因 printf()是不定参数输入 printf()不会检查输入参数的个数 其他溢出类型 .data section溢出 PEB/TEB溢出 文件流溢出 归纳 溢出的共性 大object向小object复制数据(字符串或整型),容纳不下造成溢出 溢出会覆盖一些关键性数据(返回地址、管理数据、异常处理或文件指针等) 利用程序的后续流程,得到程序的控制权 缓冲区溢出的利用 char szBuf[8] = {0}; strcpy(szBuf,argv[2]); argv[2]的内容: 对EIP的填充 Shellcode 6 szBuf 5 EIP EBP EDI ESI EBX 3(m=3) 4(n=4) Shellcode Shellcode Shellcode其实就是一段可以完成某种特定功能的二进制代码 Shellcode的功能 基本功能 添加administrator or root组用户 远程可用shell 下载程序(Trojan or Rootkit)执行 高级功能 抗NIDS检测 穿透防火墙 Shellcode不通用 Shellcode为什么不通用 不同硬件平台 IBM PC、Alpha,PowerPC 不同系统平台 Unix、Windows 不同内核与补丁版本 不同漏洞对字符串限制不同 4.3 溢出保护技术 人—代码作者 编译器 语言 RunTime保护 操作系统 硬件 人—代码作者 编写正确的代码 方法 学习安全编程 软件质量控制 源码级纠错工具 编译器 数组边界检查 编译时加入条件 例如canary保护 语言 为什么会出现缓冲区溢出? C/C++出于效率的考虑,不检查数组的边界(语言固有缺陷) 类型非安全语言?类型安全语言 C,C++?C#,Java? RunTime保护 二进制地址重写 Hook危险函数技术 操作系统 非执行缓冲区 缓冲区是存放数据地方,我们可以在硬件或操作系统层次上强制缓冲区的内容不得执行 许多内核补丁用来阻止缓冲区执行 操作系统 堆栈不可执行内核补丁 Solar design

文档评论(0)

美洲行 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档