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

06-溢出攻击全解.ppt

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

信息对抗技术 韩 宏 缓冲区溢出攻击 什么是缓冲区溢出攻击 网络中占60%-70%的攻击是缓冲区溢出攻击。 攻击的目的是什么?获得系统的控制权限。而不是破坏。 基本攻击方式 通过向有漏洞的程序发送特别数据,使得程序将这段特别数据当作代码并跳转过去运行。而这段被当作的代码,可以和攻击者交互,从而实现了对被攻击机器的控制。 如何控制别人的程序流向 怎样使程序跳转到指定的代码呢?有以下三种方式: jmp 地址; call 地址; ret; 如果要想程序跳转到攻击者给定的内存执行,需要有对应的代码执行这个跳转过程。比如 jmp 0x1234;就将程序跳转到0x1234地址运行。但被攻击的程序中不可能存在这样的语句跳转到攻击者指定的位置。 同理,call 0x1234这种也不行。 只剩下ret了。 请回忆前边反汇编基础部分讲解的ret指令的用处和工作过程 这个ret进行了如下操作: 将返回地址从栈顶中弹出,并放入EIP寄存器,使得程序下一步执行EIP指向的地址。也就是说,ret将使程序执行栈顶保存的那个地址 我们来尝试修改ret地址 procedure Func1(); begin end; procedure TForm1.Button1Click(Sender: TObject); begin Func1(); end; procedure Func1(); begin end; 的end处打断点,然后执行到此处。 到esp指向的内存0x12f3e4,该地址指向的是0x44dbb5地址,即返回地址 好,我们修改这个地址中存的地址 修改后,执行一个单步动作,执行ret指令,代码窗口指向了0x11111地址 正常的代码中不可能有这样的修改语句存在,但在一些特定的条件下,可能修改那个保存的地址。 请回忆C语言中的strcpy,以及str作为前缀的函数有什么限制条件。 Str系列的函数要求空字符结尾,也就是0这个byte值结尾。 Strcpy会分析从源地址开始的每一个字节看是否是0,如果是表示源字符串已经结束,否则会一直拷贝下去。它并不关心目标地址是否有足够的空间保存被复制的内容。以下是一个strcpy的示意实现 strcpy(char * des, char * src) { char * cursrc, curdes; cursrc = src; curdes = des; while (*cursrc != 0){ *des = *src; src++; des++; } } 该实现中没有也无法判定目标地址指向的内存 是否有足够的空间存放被复制的内容。以下是strcpy的一般用法 { Char buf[100]; ... Strcpy(buf, src); ... { 请注意,这个buf的大小,是程序员估计出来的比正常使用还多的空间。 如果src的字符串长度大于buf,strcpy并不会在100处停止复制,而是会继续往后复制。那这时拷贝的内容就会依次覆盖后边的内容 如果前图中多余的复制的那部分蓝色的部分正好存放的是ret的返回地址,那么我们就可以改变程序的流向了!!!! 而这只需要在给strcpy的源地址的内容(0字符前的部分)长度大于目标缓存预先分配的地址。 这里一个关键是,需要保存ret地址的内存紧接在目标缓存的后面,可能吗? 我们需要分析反汇编基础中对一个函数调用过程的分析了。 首先,函数的局部变量和函数的返回地址都是保存在栈上,因此他们具备了相互比邻的可能。 后图中,return address保存在比局部变量sum高8个字节的地方,很容易被strcpy拷贝的过长部分覆盖 请观察一下代码和其 对应的栈布局 Void func(char *src) { char buf[10]; strcpy(buf, src); } 请观察一下代码和其 对应的栈布局 Void func(char *src) { char buf[10]; strcpy(buf, src); } 请观察一下代码和其 对应的栈布局 Void func(char *src) { char buf[10]; strcpy(buf, src); } strcpy(char * des, char * src) { char * cursrc, curdes; cursrc = src; curdes = des; while (*cursrc != 0){ *des = *src; src++; des++; } } 当调用strcpy的函数返回时,程序就会

文档评论(0)

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

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

1亿VIP精品文档

相关文档