1、Exploit开发

  发现漏洞只是一个开始,在你完成利用程序之前,还有很长一段路要走。不过Immunity专门为了这项任务做了许多专门设计,相信能帮你减少不少痛苦。接下来我们开发一些PyCommands以加速exploit的开发。

  这些PyCommands要完成的功能包括:找到特定的指令将执行权限转移到shellcode,当编码shellcode的时候判断是否有需要过滤有害的字符。我们还将用PyCommand命令!findantidep绕过DEP(软件执行保护)。

 2、找到友好的利用指令

  在获得EIP的控制器之后,你就要将执行权限转移到shellcode。典型的方式就是,你用一个寄存器指向你的shellcode。你的工作就是在执行的代码里或者在加载的模块里找到跳转到寄存器的代码。

  Immunity提供的搜索接口使这项工作变得很简单,它将贯穿整个程序寻找需要的代码。

#findinstruction.py(测试了下有问题,自己可以按照pycommands里面search.py可以参考修改)

from immlib import *
def main(args):
imm = Debugger()
search_code = " ".join(args)
search_bytes = imm.Assemble(search_code)
search_results = imm.Search(search_bytes)
for hit in search_results:
#Retrieve the memory page where this hit exists
#and make sure it's executable
code_page = imm.getMemoryPagebyAddress(hit)
access = code_page.getAccess(human=True)
if "execute" in access.lower():
imm.log("[*] Found: %s (0x%08x)" % (search_code,hit), address=hit)
return "[*] Finished search for instructions, check the Log window."

  我们先转化要搜索的代码(记得内存中可是没有汇编指令),然后同Search方法在真个程序的内存空间中包含这个指令的地址。在返回的地址列表中,找到每个地址所属的页。接着确认页面时可执行的。每找到一个符合上面条件的就打印到记录窗口。在调试器的命令栏里执行如下格式的命令:

  !findinstruction <instruction to search for> :  ---->    !findinstruction jmp esp

  现在我们已经有了一个地址列表,这些地址都能使我们的shellcode运行起来(前提是你的shellcode地址放在ESP中)。

每个利用程序都有些许的差别,但是我们现在已经有了一个能够快速寻找指令地址的工具。

3、过滤有害字符

  当你发送一段漏洞利用代码到目标系统,由于字符关系,shellcode也许没有办法执行。例如,如果我们从yi一个strcpy()调用中发现了缓冲区溢出,我们的利用代码就不能包含NULL字符(0x00)。因为strcpy()一遇到NULL字符就会停止拷贝数据。因此,就需要将shellcode编码,在目标内存执行后再解码。然而,始终有各种原因导致exploit编写失败。比如程序中有多重的字符编码,或者被漏洞程序进行了各种意想不到的处理。

  一般情况下,如果获得了EIP的控制权限,然后shellcode抛出访问违例或者crash目标,接着完成自己的伟大使命(反弹后门),最重要的事就是确认shellcode被准确的复制到内存。Immunity使得这项工作更容易。

Figure 5-3: 溢出之后 Immunity 栈窗口

如你所见,EIP 当前的值和 ESP 的一样。4 个字节的 0xCC 将使调试器简单的停止工作, 就像设置了在这里设置了断点( 0xCC 和 INT3 的指令一样)。紧接着 4 个 INT3 指令,在 ESP+0x4 是 shellcode 的开始。我们将 shellcode 进行简单的 ASCII 编码,然后一个字节一个 字节的比较内存中的 shellcode 和我们发送 shellcode 有无差别,如果有一个字符不一样,说 明它没有通过软件的过滤。在之后的攻击总就必须将这个有害的字符加入 shellcode 编码中。

你能够从 CANVAS,Metasploit,或者你自己的制造的 shellcode。新建 badchar.py 文件, 输入以下代码。

#badchar.py
from immlib import *
def main(args):
imm = Debugger()
bad_char_found = False
# First argument is the address to begin our search
address = int(args[0],16)
# Shellcode to verify
shellcode = "<<COPY AND PASTE YOUR SHELLCODE HERE>>"
shellcode_length = len(shellcode)
debug_shellcode = imm.readMemory( address, shellcode_length ) debug_shellcode = debug_shellcode.encode("HEX")
imm.log("Address: 0x%08x" % address)
imm.log("Shellcode Length : %d" % length)
imm.log("Attack Shellcode: %s" % canvas_shellcode[:512])
imm.log("In Memory Shellcode: %s" % id_shellcode[:512])
# Begin a byte-by-byte comparison of the two shellcode buffers
count = 0
while count <= shellcode_length:
if debug_shellcode[count] != shellcode[count]:
imm.log("Bad Char Detected at offset %d" % count)
bad_char_found = True
break
count += 1
if bad_char_found:
imm.log("[***** | |] ")
imm.log("Bad character found: %s" % debug_shellcode[count])
imm.log("Bad character original: %s" % shellcode[count])
imm.log("[***** | |] ")
return "[*] !badchar finished, check Log window."

在这个脚本中,我们只是从 Immunity 库中调用了 readMemory()函数。剩下的脚本只是 简单的字符串比较。现在你需要将你的 shellcode 做 ASCII 编码(如果你有字节 0xEB 0x09, 编码后后你的字符串将看着像 EB09),将代码贴入脚本,并且如下运行:

!badchar <Address to Begin Search>

在我们前面的例子中,我们将从 ESP+0x4 地址 (0x00AEFD4C) 寻找,所以要在 PyCommand 执行如下命令:

!badchar 0x00AEFD4c

我们的脚本在发现危险字符串的时候将立刻发出警戒,由此大大减少花在调试 shellcode 崩溃时间。

Immunity Debugger学习 二的更多相关文章

  1. Immunity Debugger学习

    1.Immunity Debugger简介 Immunity Debugger软件专门用于加速漏洞利用程序的开发,辅助漏洞挖掘以及恶意软件分析.它具备一个完整的图形用户界面,同时还配备了迄今为止最为强 ...

  2. Immunity Debugger学习笔记

    图1::Immunity主界面 注意事项:最下方的PyCommands窗格既可以执行调试命令也可以执行python脚步文件. 1.PyCommands学习 在 Immunity 中执行 Python ...

  3. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  4. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  5. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  6. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

  7. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  8. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  9. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

随机推荐

  1. String Reconstruction (并查集)

    并查集维护和我这个位置的字母连续的已经被填充的字母能到达的最右边的第一个还没有填充的位置,然后把这个位置填上应该填的东西,然后把这个位置和下一个位置连接起来,如果下一个位置还没有填,我就会把下一个位置 ...

  2. Typescript学习笔记(二)枚举

    跟随handbook的脚步,详细介绍一下枚举. enum Direction { Up = 1, Down, Left, Right } 一个枚举类型可以包含零个或多个枚举成员,每个枚举成员可以是一个 ...

  3. Eureka

    Consul vs. Eureka Eureka is a service discovery tool. The architecture is primarily client/server, w ...

  4. OpenLayers学习笔记(五)— 拖拽Feature图层

    参考文档的例子可以知道如何拖动矢量图层feature GitHub: 八至 作者:狐狸家的鱼 本文链接:拖拽Feature图层 全部代码 <!DOCTYPE html> <html& ...

  5. A1009. Product of Polynomials

    This time, you are supposed to find A*B where A and B are two polynomials. Input Specification: Each ...

  6. .Net Core Nlog日志记录到MySql

    前段时间想要实现这个功能网上找了很多资料,现在整理一下发布出来,希望给大家一点帮助. 首先是依赖项的选择: 关于NLog版本不是最新是因为最新版本有点问题我试了试不支持,所以选了这几个版本,MySql ...

  7. java 8: ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver

    转眼之间, java 11都快要推出了. 而我一直都在 java 7环境下写代码,真的不想升级,不想改变什么,可世界每天都在变化. 最近因为服务端需要SNI,而 java 7 只支持客户端的SNI,只 ...

  8. 浅谈 WebDriver如何应对不同浏览器

    selenium2 基于对象的测试,在selenium2中一共支持以下浏览器: Firefox(FirefoxDriver) IE(InternetExplorerDriver) Chrome(Chr ...

  9. Git使用全解

    起步 关于版本控制 Git 简史 Git 基础 安装 Git 初次运行 Git 前的配置 获取帮助 小结 Git 基础 取得项目的 Git 仓库 记录每次更新到仓库 查看提交历史 撤消操作 远程仓库的 ...

  10. 第三十一篇-TextInputLayout(增强文本输入)的使用

    效果图: 密码使用的是增强文本输入类型,当密码长度小于6或者密码长度大于10的时候就会给出提示. main.xml 当添加TextInputLayout时,旁边会有一个下载符号,如果点不动,可以右键点 ...