关于堆栈溢出介绍.docVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
堆栈溢出实验 原理: 堆栈是一种数据结构,物理上是一段连续分配的内存空间。当我们在一个程序中声明各种变量时,静态全局变量将位于数据段并且在程序开始运行的时候被加载,而程序的动态局部变量则分配在堆栈里面。 在堆栈的分配中,在地址上其从高向低分配空间,并且遵循“后进先出”的原则。堆栈涉及进栈和出栈的操作,堆栈的栈顶位置由寄存器ESP指定,进栈时,ESP=ESP-4,同时在ESP处存放需要压入堆栈的数据;出栈时,ESP=ESP+4,原来的栈顶数据将不再属于堆栈的范围。 当程序在进行函数调用时,往往是先通过push指令压入参数,然后通过call指令来调用相关具体函数。对于一般的函数来说,如果函数有局部变量,接下来,就在堆栈中开辟相应的空间以构造变量。函数执行结束,这些局部变量的内容将被丢失,但是不清除。在函数返回的时候,弹出ESP,恢复堆栈到函数的调用地址,弹出返回地址到EIP,恢复堆栈到函数调用的地址,弹出返回地址到EIP以继续执行程序。 常见利用方式: 一、利用JMP ESP的方式 其利用格式是NNNNNNRSSSSS,这里N=NOP,R=RET(jmp esp的地址),S=ShellCode。就是把缓冲区一直覆盖成NOP(空指令,什么都不做),直到原来的EIP位置时,我们填入系统中某个核心dll中的jmp esp的地址,紧跟后面才是我们的ShellCode。 正常情况下,函数返回时,执行RET指令,这等于POP EIP,会把保存的原来程序的EIP的值恢复,从而完成中断的返回。但在这里,我们把保存的EIP的值覆盖了,改写成了jmp esp的地址。这样,POP EIP后,EIP = jmp esp的地址,而堆栈指针ESP会往下走,指向ShellCode的开始。程序继续执行,此时EIP里的内容是jmp esp,系统执行jmp esp,就正好就跳到我们的ShellCode的地方了. 如果ShellCode是开个端口,那我们就可以远程连上去;如果ShellCode是下载执行,那我们就可以让目标机在网页上下个文件并执行……只要你想到达的功能,都可以想办法实现。 二、利用JMP EBX的方式 其利用格式是NNNNN JESSSSSS。这里N = NOP, J = Jmp 04,E = jmp ebx的地址,S = ShellCode。 这里的J和E的位置是关键,E是在出错处理的入口位置,而J在其前面。 在第一种方式中,我们知道将返回地址覆盖成另一个地址。但如果是个无效的地址呢?那里指向的数据或许不能读,或许不能执行,那会怎么样呢?其实相信大家都遇到过,那就是系统会弹出个对话框报错,我们点确定,就会终止运行。 这是因为作为一个系统级的程序,内部有健全的出错处理机制。简单的说,如果运行时有错误产生,windows就会跳到一个专门处理错误的地方,对应不同的错误,执行不同的代码。上面执行的代码就是弹出个对话框报错。 所以这里我们故意把返回的地址覆盖成一个错误的地址。这样出错时,windows就会跳到处理错误的入口,而ebx指向入口前4个字节的地方!那我们把错误入口处覆盖为jmp ebx的地址,就会跳到前4个字节,怎么跳到ShellCode呢?在这里我们写入jmp 04,哈哈,往后跳4个字节,正好跳过覆盖值,达到我们的ShellCode。 实验(jmp esp的利用和保护): 编写一个最简单的有漏洞的程序 #includestdio.h #includestring.h void fun(char* overchar) { char output[8]; strcpy(output,overchar); return; } int main() { char overchar[1024]; memset(overchar,0,1024); FILE * fp; fp=fopen(d:\\\\overchar.txt,r); fread(overchar,1,1024,fp); fun(overchar); fclose(fp); printf(overchar); return 0; } 在项目属性的代码生成中,将缓冲区安全检查关闭,编译生成。 在D盘下新建一个文本文档,命名为overchar.txt 当文本内容较短时,运行程序,发现程序无异常。 当文本内容较长时,如AAAABBBBCCCCDDDDEEEEFFFFHHHH, 运行程序,发现有错误。用Ollydbg打开,运行结果如下:      此时EIP的值为0即EEEE的ASCII码,如果把EEEE改为jmp ESP的地址,就可以利用这个漏洞了。 然后将缓冲区安全检查打开,看看具体是怎么进行保护的 直接在VC的环境下看一下这个程序

文档评论(0)

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

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

1亿VIP精品文档

相关文档