Immunity Debugger学习 二
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学习 二的更多相关文章
- Immunity Debugger学习
1.Immunity Debugger简介 Immunity Debugger软件专门用于加速漏洞利用程序的开发,辅助漏洞挖掘以及恶意软件分析.它具备一个完整的图形用户界面,同时还配备了迄今为止最为强 ...
- Immunity Debugger学习笔记
图1::Immunity主界面 注意事项:最下方的PyCommands窗格既可以执行调试命令也可以执行python脚步文件. 1.PyCommands学习 在 Immunity 中执行 Python ...
- emberjs学习二(ember-data和localstorage_adapter)
emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...
- ReactJS入门学习二
ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...
- TweenMax动画库学习(二)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- Hbase深入学习(二) 安装hbase
Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...
- Struts2框架学习(二) Action
Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- Quartz学习--二 Hello Quartz! 和源码分析
Quartz学习--二 Hello Quartz! 和源码分析 三. Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...
随机推荐
- PID 通俗解释
PID 控制原理3 个故事:看完您就明白了.1.: PID 的故事小明接到这样一个任务:有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就 ...
- 百度地图API:自定义控件
HTML: <!DOCTYPE html> <html> <head> <meta name="viewport" content=&qu ...
- Django 配置数据库
Django提到配置那大多数都是在settings.py配置文件 在配置文件里的 DATABASES 内进行设置 # 数据库配置 DATABASES = { #连接mysql 'default': { ...
- mybatis 的批量更新操作sql
转: mybatis 的批量更新操作sql 2018年07月23日 10:38:19 海力布 阅读数:1689 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...
- 第一节,windows和ubuntu下深度学习theano环境搭建
先讲解windows下深度学习环境的搭建 步骤一 安装Anaconda Anaconda是一个用于科学计算的python发行版,支持linux,mac,windows系统,提供了包管理和环境管理的功 ...
- GitLab 环境搭建【CentOS7】
RPM安装方式 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7 [最好给服务器分配至少4G内存] 先检查一下依赖:sshd [root@l ...
- hdu 2476"String painter"(区间DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 给定字符串A,B,每次操作可以将字符串A中区间[ i , j ]的字符变为ch, ...
- 做错的题目——给Array附加属性
- testng+maven一些坑
1. [TestNGContentHandler] [WARN] It is strongly recommended to add "<!DOCTYPE suite SYSTEM & ...
- text-overflow文本溢出隐藏“...”显示
一.文本溢出省略号显示 1.文本溢出是否“...”显示属性:text-overflow:clip(不显示省略标记)/ellipsis(文本溢出时“...”显示) 定义此属性有四个必要条件:1)须有容器 ...