缓冲区溢出-Read.ppt

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

缓冲区溢出 曲晶莹 基本问题 缓冲区溢出:向一个有限空间的缓冲区拷贝了过长的字符串,覆盖相邻的存储单元,会引起程序运行异常。 历史上最著名的例子是:1988 年,因特网蠕虫Morris Worm利用UNIX系统中finger程序的缓冲区溢出漏洞,获得访问权限,得到了一个shell,感染了因特网中的数万台机器,给用户带来了很大危害。 有关缓冲区溢出的数据 1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。 1998年CERT的13份建议中,有9份是与缓冲区溢出有关的;1999年,至少有半数的建议是和缓冲区溢出有关的。 在Bugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是一个很严重的安全问题。 为什么会缓冲区溢出 在C语言中,指针和数组越界不保护是Buffer overflow的根源。 在C语言标准库中就有许多能提供溢出的函数,如strcat(), strcpy(), sprintf(), gets()和scanf()。 通过指针填充数据 不好的编程习惯 缓冲区溢出的分类 基于栈 基于堆 基于格式化字符串 Next 缓冲区溢出的原理 典型的寄存器 EIP:扩展指令指针,用于存放下一条指令的地址。 EBP:扩展基指针,用于指向基本基栈的信息。 ESP:扩展堆栈指针。指向堆栈的当前位置,允许push和pop操作等对堆栈中内容添加和删除。 典型的堆栈帧结构 函数调用时所建立的栈帧包含了下面的信息: ?????i)???为被调用函数的参数分配的空间 ii)??函数的返回地址.? iii)?调用函数的栈帧信息,?即栈顶和栈底. ????? iv)??为函数的局部变量分配的空间 典型的堆栈帧结构 展示堆栈的示例 example1 void?function(int?a,?int?b,?int?c)?{ ??? char?buffer1[5]; ??? char?buffer2[10]; } void?main()?{ ?? function(1,2,3); } 展示堆栈的示例 example1 (gdb) disass main 0main+28: push $0x3 0x0804835a main+30: push $0x2 0x0804835c main+32: push $0x1 0x0804835e main+34: call 0x8048334 function 0main+39: add $0xc,%esp (gdb) disass function 0function+0: push %ebp 0function+1: mov %esp,%ebp 0function+3: sub $0x28,%esp 展示堆栈的示例 example1 (gdb) i reg ebp 0xbffd0f5c esp 0xbffd0f34 (gdb) print /x buffer1 0xbffd0f44 (gdb) print /x buffer2 0xbffd0f34 3 2 1 RET 0主函数的基栈帧 buffer1 buffer2 没有受到控制的堆栈溢出 Example2 int bof() { char buffer[4]; strcpy(buffer, “AAAAAAAAAAAA”); } int main(int argc, char **argv) { bof(); printf(“Not gonna do it!\n”); return 1; } Segmentation fault 利用缓冲区溢出漏洞的攻击 随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentation fault),而不能达到攻击的目的。 如果覆盖缓冲区的是一段精心设计的机器指令序列,它可能通过溢出,改变返回地址,将其指向自己的指令序列,从而改变该程序的正常流程。 可利用的堆栈溢出 example3 void fun () { printf (test,being hacked!!!\n); } int main (int argc, char **argv) { char buf[10]; strcpy (buf, argv[1]);

文档评论(0)

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

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

1亿VIP精品文档

相关文档