开始写Immunity Debugger PyCommand

这是我学习Immunity Debugger时在网上找到的一片文章,由于原作者是用英文编写的,为了方便我的学习及今后的查找,所以翻译过来,作为我的学习笔记。本文也希望给一起学习的人一个方便的译文。本着忠于原作者的态度,进行全文翻译。
原文网址如下:
[https://www.corelan.be/index.php/2010/01/26/starting-to-write-immunity-debugger-pycommands-my-cheatsheet/]

当我好多年前开始win32的漏洞开发时,我当时偏向的调试器是WinDbg(以及一些Olly)。虽然Windbg是一个很棒的快速的调试器,但我很快就发现需要一些额外的工具来提高我的漏洞开发体验。

尽管windbg中的命令行导向方法有很多好处,但是它也不是用来查找好的跳转地址,或者列出编译的non-safeseh或non-aslr模块等等的最好的工具。好吧,查找一个简单的“jmp esp”是微不足道的,但如果你是要在non-safeseh的编译模块中查找所有的pop ret组合呢。这不是一个简单的任务。

给windbg来构建插件式完全可行的,但是我找到的插件(MSEC,byakugan(Metasploit))并不是总能按照我想要的方式工作,而且它并不能够解决我写漏洞开发程序时遇到的问题。

OllyDbg和Immunity Debugeer与windbg完全不同。不仅仅是GUI有很大变化,这些debugger更是拥有更多的插件。在测评完这两款debugger(他们实际上有很相似的外观及操作感受),及这两款debugger的插件加入机制之后,我决定专注于Immunity Debugger。

这并不意味着OllyDbg不好或就写插件而言你所能做的有限制。我只是发现在构建漏洞程序时它比较不容易来“快速地微调一个插件”。OllyDbg插件会编译进dll文件中,所以改变一个插件将会须要我来重新编译和测试。而Immunity Debugger 则运用python脚本。我能进入这个脚本并作出一些改变来查看结果的变化。简单方便。

OllyDbg和Immunity Debugger都有很多插件(不论是社区贡献出来的来时当你安装时加载的)。当插件没有问题时,我很希望有一个单独的插件来帮我构建从A到Z的漏洞利用程序。将这个想法翻译进我的pvefindaddr PyCommand。

我的显而易见的选择是Immunity&Python。我完全不是一个出色的python开发者,但我足够来构建我的PyCommand在比较短的一段时间内。这证明了构建一个Immunity的PyCommands很容易,即使你不是一个专业的开发者。

我面临的唯一的问题就是寻找Immunity-specific API的方法和属性是如何工作的。老实来讲,Immunity Debugger中的API帮助并不是个好助手。它仅仅是基础地列出可得的方法和属性,而且仅此而已。没有对于这些方法和属性表现方式,应该做什么或者怎么用它们来解决问题的解释。
但一旦你开始了解它们是怎么运作的,它们仍然是一个好的参考,但是如果你是从scrath上学习的,一点坚持的信念是必须的。

幸运的是,自从Immunity有了很多PyCommand,他们能被用为参考。

不管怎样,用ImmDbg Python API 来帮助文本传输仍然是个好的想法。你能通过浏览“Help”,选择”Select API help file“,再选择 Documentation文件夹的IMMLIB.HLP文件来获取API帮助。(这里我试了一下,win8.1系统貌似无法打开)
这里写图片描述
然后,你能通过”Help“-”Open API help file“来获取帮助。
这里写图片描述
Immunity 也有一个API的在线的版本这里写链接内容

我今天的主要目的是给任何对写pycommands感兴趣的人总结一份参考/作弊条,然后你可以更快地开始构建你的插件。这不是一份完整的参考文献,但它能帮你开个头。

首先,你需要的Python语法是基于Python2.x的。(如果你不熟悉Python:v2.x和v3.x在某些地方是有很大不同的,所以如果你像给自己一些写python的参考或书,确定你找的是基于2.x版本的)

从scratch构建一个PyCommand

在Immunity Debugger PyCommand 文件夹中创建一个文件:<文件名>.py
这个文件名是很重要的,因为你将需要通过这个文件名来启动PyCommand。

启动一个PyCommand

启动一个PyCmmond很容易:只要在最下方的命令窗口打入文件名(不需要加.py的后缀,但开头要加一个感叹号)
这里写图片描述
如果你的插件名为”plugin1.py“,你可以通过执行”!plugin1“来启动。

基本的结构

插件的基本结构如下:
-加载Immunity Libraries(或者其他的libraries,取决于你想做什么)
-写一个main()函数来读取命令行参数并调用你想让插件执行功能的函数
-写需要的函数来执行你的命令

#!/usr/bin/env python
"""
(c) Peter Van Eeckhoutte 2009
U{Peter Van Eeckhoutte - corelan.<http://www.corelan.be>}

peter.ve@corelan.be
corelanc0d3r

"""
__VERSION__ = '1.0'
import immlib
import getopt
import immutils
from immutils import *

""""""""""""
 Functions
""""""""""""



""""""""""""""""""
 Main application
""""""""""""""""""
def main(args):

接下来,你将需要提出你想用Immunity Debugger libraries和把他们用到你的脚本中。最好的方法是通过声明一个变量来链接到Immunity debugger类:

imm = immlib.Debugger()

我通常把他设为全局变量,所以我把它设在main()函数的外面。(举例来说,你可以就把它放在”import“声明的下面)

可用类的列表如下:
这里写图片描述

处理参数

指定的参数是一个Python列表,在启动PyCommand时就被捕获。

你能获得参数使用的长度通过

len(args)

在队列中使用参数本身同通过args[]列表反复调用来取得一种元素的内容一样简单:

def main(args):
    if not args:
        usage()
    else:
        print "Number of arguments : " + str(len(args))
        cnt=0
        while (cnt < len(args)):
            print " Argument " + str(cnt+1)+" : " + args[cnt]
            cnt=cnt+1

写Log,Table,File

你可能已经注意到了以上的脚本似乎没有输出任何东西。当语法正确时,没有任何可视的默认输出窗口,所以你需要告诉插件去哪里写输出的内容。

这里有几个选择:你可以写在Immunity Log window(这是最常用的),或是一个新的独立的table(只是一个可以在表格中列出信息的新窗口),或者是一个file中(如果输出会溢出Log window缓存区,这是一个好的想法)

在Log Window中输出
Log Window是debugger的一部分。所以我们需要用我们之前声明过的实例(imm)来输出。

方法很简单:imm.Log()
这里写图片描述
还有一些事你可以做到,让我们来看看这个例子:

def main(args):
    print "Number of arguments : " + str(len(args))
    imm.Log("Number of arguments : %d " % len(args))
    cnt=
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值