05_CC++漏洞_Shellcode课件.ppt

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

天津农学院 计算机系 许晓华 第5讲 Shellcode 5.1 Shellcode 概述 5.1.1 shellcode 与 exploit shellcode : 缓冲区溢出攻击中植入进程的代码. exploit : 代码植入的过程,也叫漏洞利用. exploit 的作用: 淹没返回地址,劫持进程的控制权,之后跳转去执行shellcode. Shellcode具有一定的通用性. Exploit 往往针对特定漏洞. 利用VC++6.0制造ShellCode 三个步骤: 第一,首先利用VC++6.0写出实现自己想要的功能的代码 第二,利用VC++6.0的调试功能下断点并反汇编,得到上述代码的汇编指令。 第三,将汇编指令重新编译,再次利用VC++的调试功能,查看内存数据,获取最终的十六进制Shellcode代码。 第一步 运行VC++6.0,选择“文件”中的”新建”,建立一个”C++ Source File”,并将文件名设定为”shellcode”。 输入如下代码后,编译运行,结果如图所示。 第二步 在代码MessageBoxA的位置按F9键下一个断点。 按F5键进行调试,程序会在断点处中断 按Alt+8进行反汇编,可看到MessageBoxA函数调用所对应的5行汇编指令。 按住Alt键选中这5行汇编指令,按Ctrl+C进行复制。 Shift+F5结束调试 重新建立一个”C++ Source File”文件,取名为”assemcode”,输入如下代码 按F7键进行编译,提示出错,如图所示 重新打开Shellcode工程,还是在MessageBoxA一行下一个断点,然后按F5进行调试。 调试状态下会有个”Memory”窗口,意思是查看内存中数据的窗口,若没有这个窗口按Alt+6即可打开 在”Memory”地址一栏输入” 0042a2ac”,回车。 可看到” 0042a2ac”中保存的真实地址为“75D9EA11” 修改”assemcode”的代码如下,运行,发现他同样弹出了错误对话框。 第三步 下面需要将汇编指令转换为对应的十六进制机器码。 在call eax行下断点 然后F5、Alt+8 可以看到汇编指令的地址从0040103C到0040104A 在”Memory”窗口输入0040103C,记录从0040103C到0040104A对应的十六进制机器码 6A 00 6A 00 6A 00 6A 00 B8 11 EA D9 75 FF D0 调用十六进制机器码 5.2 定位Shellcode 4.4的代码植入实验,使用越界的字符完全控制返回地址后,需要将返回地址改写成shellcode在内存中的起始地址。 在实际的漏洞利用过程中,由于动态链接库的装入和卸载等原因,windows进程的函数栈帧很有可能会产生“移位”,即shellcode在内存中的地址是会动态变化的,因此像4.4那样将返回地址简单地覆盖成一个定值的作法往往不能让exploit奏效。 因此必须想办法在程序运行时动态定位栈中的shellcode。 回顾4.4实验在verify_password函数返回后栈中的情况: 绿色的线条体现了代码植入的流程:将返回地址淹没为手工查出的shellcode起始地址 0x0012FAF0 ,函数返回时这个地址被弹入EIP寄存器,处理器按照EIP寄存器中的地址取指令,最后栈中的数据被处理器当成指令得以执行。 红色的线条则点出了这样一个细节:在函数返回的时候,ESP恰好指向栈帧中返回地址的后一个位置! 一般情况下,ESP寄存器中的地址总是指向系统栈中且不会被溢出的数据破坏。函数返回时,ESP所指的位置恰好是我们所淹没的返回地址的下一个位置。 由于ESP寄存器在函数返回后不被溢出数据干扰,且始终指向返回地址之后的位置,可以使用上图所示的这种定位shellcode的方法来进行动态定位: 用内存中任意一个jmp?esp指令的地址覆盖函数返回地址,而不是原来用手工查出的shellcode起始地址直接覆盖 函数返回后被重定向去执行内存中的这条jmp?esp指令,而不是直接开始执行shellcode 由于esp在函数返回时仍指向栈区(函数返回地址之后),jmp?esp指令被执行后,处理器会到栈区函数返回地址之后的地方取指令执行。 重新布置shellcode。在淹没函数返回地址后,继续淹没一片栈空间。将缓冲区前边一段地方用任意数据填充,把shellcode恰好摆放在函数返回地址之后。这样jmp?esp指令执行过后会恰好跳进shellcode。 这种定位shellcode的方法使用进程空间里一条jmp?esp指令做“跳板”,不论栈帧怎么“移位”,都能够精确的跳回栈区,从而适应程序运行中shellcode内存地址的动态变化。

文档评论(0)

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

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

1亿VIP精品文档

相关文档