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

第二章缓冲区溢出..ppt

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二章 缓冲区溢出 出现缓冲区溢出的主要原因是不良的编程习惯。其他原因包括C语言和C++语言为程序设计人员提供了许多不安全的编程方法,缺乏安全可靠、简便易行的字符串处理函数,对错误的实际后果的忽略。 堆栈溢出(也称静态缓冲区溢出)(*) 如果向一个在栈的缓冲区复制数据,但是复制的数据量又比缓冲区大的时候,就会发生静态缓冲区溢出。在栈上声明的各种变量的位置就紧靠着函数调用程序的返回地址。通常出现的错误是用户输入的数据未经验证,就传递给strcpy这样的函数,产生的后果就是调用函数的返回地址将被攻击者选择的某个地址覆盖。在一个常规的攻击下,攻击者可以通过一个缓冲区溢出的应用程序来执行对他们有用的操作,比如在他们选择的端口上绑定一个命令解释程序。 第二章 缓冲区溢出 堆栈溢出 IA32架构的堆栈。栈中除其他内容外,还存储了参数、缓冲区和函数的返回地址。在IA32的系统中,栈是向下增长的,变量按LIFO的方式压入栈里,最后压入站的数据最先弹出。 Frame Pointer (EBP) Instruction Pointer (EIP) 本地变量、缓冲区、其他寄存器等 第二章 缓冲区溢出 堆栈溢出 下图显示的是压入两个缓冲区后的栈。首先,缓冲区buf1进栈,然后,缓冲区buf2进栈。在向buf2缓冲区中写入的数据量超过了程序预期的大小,buf1会被buf2的数据覆盖。甚至栈的其他部分,包括指令指针(EIP)的值也会被覆盖。EIP寄存器保存了函数的返回地址。所以恶意的用户可以通过调用这个函数选择任意一个想要的返回地址。 Buf2[512] Buf1[512] Frame Pointer (EBP) Instruction Pointer (EIP) 本地变量、缓冲区、其他寄存器等 第二章 缓冲区溢出 堆栈溢出 代码1 /* StackOverrun.c This program shows an example of how a stack-based buffer overrun can be used to execute an arbitrary code. Its objective is to find an input string that executes the function bar. */ #include stdio.h #include string.h void foo(const char* input) { char buf[10]; printf(“My stack looks like:\n%p\n%p\n%p\n%p\n%p\n%p\n\n”); strcpy(buf,input); printf(“%s\n”,buf); printf(“Now the stack looks like :\n%p\n%p\n%p\n%p\n%p\n%p\n\n”); } 第二章 缓冲区溢出 堆栈溢出 代码1(续) void bar(void) { printf(“Augh! I’ve been hacked!\n”); } int main(int argc, char* argv[]) { printf(“Address of foo=%p\n”,foo); printf(“Address of bar=%p\n”,bar); if(argc!=2) { printf(“Please supply a string as an argument!\n”); return -1; } foo(argv[1]); return 0; } 第二章 缓冲区溢出 堆栈溢出 运行 C:\Secureco2\Chapter03Stackoverrun.exe Hello Address of fooAddress of barMy stack looks like:00000000 7FFDF000 0012FF80 0040108A?We want to overwrite the return address for foo. 00410EDE Hello Now the stack looks like: 6C6C6568?You can see where “Hello” was copied in. 0000006F 7FFDF000 0012FF80 0040108A 00410EDE 第二章 缓冲区溢出 堆栈溢出 运行前后堆栈变化情况00000000 7FFDF000 0012FF80 0040108A 00410EDE …… foo的buf EBP,main的栈底指针 EIP,foo的

文档评论(0)

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

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

1亿VIP精品文档

相关文档