缓冲区溢出攻击的原理与实践.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
缓冲区溢出攻击的原理与实践

课程设计任务书 计通 学院 网络工程 专业 课程名称 网络管理与安全课程设计 时间 2014~2015学年第一学期1~2周 学生姓名 指导老师 向凌云 题 目 主要内容: 要求: 按要求编写课程设计报告书 应当提交的文件: (1)课程设计。 (2)课程设计附件。 一、缓冲区溢出概念 1、缓冲区溢出指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区 又被称为堆栈. 在各个操作进程之间,指令会被临时储存在堆栈当中,堆栈也会出现缓冲区溢出。最常见的攻击手段是通过制造缓冲区溢出使程序运行一个用户shell,在通过shell执行其他命令. 若该程序输入root且有suid权限的话,攻击者就获得了一个有root权限的shell,此时就可以对系统进行随意操作了.下面我来介绍一下如何控制程序跳转到攻击代码   打开记录(Activation Records)   在程序中,每一个函数调用发生,在堆栈中会留下一个Activation Records,它包括函数结束时返回的地址,攻击者通过溢出这些自动变量,使地址指向攻击程序代码. 通过改变程序的返回地址,当调用结束时,程序就跳到攻击者设定的地址,而不是原地址.这类溢出被称为 stacks mashing attack.   函数指针(Function Pointers)   void(*foo)(1)定义一个返回函数指针的变量foo, Function Pointers可用来定位任何地址空间. 所以只需在任何空间内的Function Pointers附近找到一个能溢出的缓冲区,然后溢出它来改变Function Pointers. 在某时刻,当程序通过Function Pointers调用函数时,程序的流程就按黑客的意图实现了(典型的溢出程序有:Linux下的Superprobe程序).   长跳转缓冲区(Longjmpbuffers)   在C语言中,包含了一个简单的检验/恢复系统,称为setjmp/longjmp.即在检验点设定setjmp(buffer),用longjmp(buffer)恢复. 但若攻击者能够进入缓冲区空间,则longjmp(buffer)实际上跳转到攻击者的程序代码. 像Function Pointers, longjmp缓冲区能指向任何地方,所以攻击者要做的就是找到一个可供溢出的buffer即可.   最常见的是在一个字符串中综合了代码植入和打开记录. 攻击者定位或提供溢出的自动变量,然后向程序传一个超大字符串,在引发buffer溢出改变打开记录时植入程序代码,由此达到入侵系统的目的.指令寄存器#include stdio.h #include string.h #include windows.h char name[]= \x41\x41\x41\x41 //name[0]-name[3] \x41\x41\x41\x41 //name[4]-name[7] \x6a\x6b\x6c\x6d //EBP \x6e\x6f\x71\x72 //EIP \x73\x74\x75\x76 \x77\x78\x7a\x7b; int main() { char output[8]; LoadLibrary(user32.dll); strcpy(output,name); for(int i=0;i8output[i];i++) printf(\\0x%x,output[i]); return 0; } 调试结果如下图: 图3.1 以上是运行结构,图中所示地址(0x6f6e6d6c)是代码中的部分,所以这里是EIP,所以程序就显而易见了 步骤2、 我找到了漏洞所在的地址,但是我们还需找到本机的JMP ESP的地址,每一台机子的JMP ESP都不一样,所以,我用了一个小程序找它的地址,这个程序是在网上找的,具体什么意思也没有仔细分析。 程序如下:程序二 #includewindows.h #includeiostream.h #includetchar.h int main() { int nRetCode=0; bool we_load_it=false; //定义一个bool类型的,赋值false HINSTANCE h; TCHAR dllname[]=_T(ntdll); h=GetModuleHandle(dllname); //动态链接库

文档评论(0)

haihang2017 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档