Exploit开发系列教程-Mona 2 SEH

P3nro5e · 2015/07/10 10:58

0x00 Mona 2 前言 & 准备


Mona 2是一种非常有用的插件,它由Corelan Team开发。起初是为Immunity Debugger写的,现在它适用于WinDbg调试器。

你将需要为WinDbg x86 和 WinDbg x64安装一些工具:

安装Python 2.7 (从这里可下载到) 。

x86 和 x64版本的工具分别安装在不同的目录里,如c:\python27(32) 和c:\python27。

从这里下载正确的zip包(请下载pykd-0.2.0.29-python-2.7.zip这个压缩包),接着提取并运行vcredist_x86.exe 和 vcredist_x64.exe。

从这里下载两个exe程序(x86版和x64版),接着执行它们。

从这里下载windbglib.py和mona.py,并将它们放置到WinDbg.exe所在的目录中。

配置符号搜索路径如下:

通过 File→Symbol File Path

输入

SRV*C:\windbgsymbols*http://msdl.microsoft.com/download/symbols
复制代码

3.保存工作区(File→Save Workspace).

在WinDbg下运行mona.py

用WinDbg运行mona.py的范例:

1.使用如下命令加载pykd插件

.load pykd.pyd
复制代码

2.运行mona使用命令如下:

!py mona
复制代码

更新mona 输入如下:

!py mona update
复制代码

0x01 配置


工作目录

在mona的工作目录里,mona的多数函数将数据转储到已创建的文件中。我们可以具体指定某个工作目录,这取决于使用的格式说明符%p (process name) 和 %i (process id)指定的进程名和id。

例如,输入:

workingfolder "C:\mona_files\%p_%i"
复制代码

排除模块

你可以用如下操作排除指定模块:

!mona config -set excluded_modules "module1.dll,module2.dll"
!mona config -add excluded_modules "module3.dll,module4.dll"
复制代码

作者

你也可以设定作者:

!mona config -set author Kiuhnm
复制代码

当产生与metasploit兼容的输出内容时可以使用该信息。

重点

如果WinDbg和mona都没有出错,那么请试试以管理员身份运行WinDbg。

0x02 Mona的手册


你可以在这里找到更多关于Mona的信息。

范例

该范例引用自Mona的手册. 现在来说明如下代码中我们控制的ECX的值:

MOV   EAX, [ECX]
CALL   [EAX+58h]
复制代码

我们想要使用那段代码以jmp到我们的shellcode(即我们注入到进程中的代码),它的地址位于ESP+4,因此我们需要调用如上调用的一些指令,如“ADD ESP, 4 | RET“。上面的代码有许多间接的操作:

(ECX = p1) → p2
p2+58h → p3 → “ADD ESP,4 | RET”
复制代码

首先我们需要找到p3:

!py mona config -set workingfolder c:\logs
!py mona stackpivot -distance 4,4
复制代码

如上使用的命令可以让你在stackpivots内的指定偏移范围在mix~max之间找到等价于ADD ESP, X | RET代码的指针,通过选项-distance min,max来指定偏移范围。

已发现指针/地址会被写入到c:\logs\stackpivot.txt

现在我们已经有我们的p3指针(许多p3指针!)了,我们还需找到p1:

!py mona find -type file -s "c:\logs\stackpivot.txt" -x * -offset 58 -level 2 -offsetlevel 2
复制代码

下面来了解那些选项的含义:

使用“-x *”选项意味着你要 “accept addresses in pages with any access level” (正如另一个范例所示, 用 “-x X”选项说明我们仅在可执行页中定位).

“-level 2”具体指定要间接操作的指令层级,它告知mona找出“a pointer (p1) to a pointer (p2)to a pointer (p3)”。 前两个选项 (-type 和 -s)指定ps必须是指针,它被列出在文件“c:\logs\stackpivot.txt“里。

使用“-offsetlevel 2” 和 “-offset 58”选项告知mona用偏移58h来进行增值操作时,第二个指针(p2)必须指向第三个指针(p3)。

如果这个范例并不能让你对其内容有较好的理解,请你不要担心。这个范例仅向你展示了WinDbg中利用Mona插件可以实现的一些功能。当然,我也承认这个命令的语法不是非常易懂。

范例

使用findwild命令可以让你找到带有特殊形式的指令链。 细想如下范例:

!mona findwild -s "push r32 # * # pop eax # inc eax # * # retn"
复制代码

选项”-s”指定链的形态:

用 ‘#‘将指令分隔开

r32 为任意32位寄存器

  • 为任意指令序列

可选参数为:

  • -depth <nr>: maximum length of the chain
  • -b <address>: base address for the search
  • -t <address>: top address for the search
  • -all: returns also chains which contain “bad” instructions, i.e. instructions that might break the chain (jumps, calls, etc…)

ROP链

Mona可以找到ROP gadgets并利用它们构造ROP链,但是我将不在这部分讲解这方面的相关内容,因为这里我假设你并不知道ROP链的含义及关于ROP的概念。正如我曾说过的,如果这篇文章讲述的内容让你难以理解,那么请不要担心。尽管学习该系列的下一部分文章吧。

0x03 结构化异常处理(SEH)


异常处理器以一种单链表的形式存在,它和每个线程有关。一般说来,链表的节点被分配在栈上。某一位于TEB (Thread Environment Block)的起始位置的指针指向链表头,因此当代码想要添加一个新的异常处理器时,某一新节点会被添加到链表头并且在TEB里的指针所指向的位置会被改变,进而指向新节点。

每个节点固有_EXCEPTION_REGISTRATION_RECORD类型并且会存储处理器的地址及链表下个节点的一个指针。奇怪的是,链表上一节点的“next pointer”不是null但是它等价于0xffffffff。

确切的定义如下:

0:000> dt _EXCEPTION_REGISTRATION_RECORD
ntdll!_EXCEPTION_REGISTRATION_RECORD+0x000 Next             : Ptr32 _EXCEPTION_REGISTRATION_RECORD+0x004 Handler          : Ptr32     _EXCEPTION_DISPOSITION
复制代码

TEB可被段选择子fs访问(始于 fs:[0]), 因此通常可看到代码如下:

mov    eax, dword ptr fs:[00000000h]      ; retrieve the head
push   eax                                ; save the old head
lea    eax, [ebp-10h]
mov    dword ptr fs:[00000000h], eax      ; set the new head
.
.
.
mov    ecx, dword ptr [ebp-10h]           ; get the old head (NEXT field of the current head)
mov    dword ptr fs:[00000000h], ecx      ; restore the old head
复制代码

编译器通常会注册单个全局句柄,它能意识到被程序执行过的区域(这依赖于某一全局变量)并且当它被调用时会有根据地作出行为。

因为每个线程都有一个不同的TEB,因此操作系统会确保段被fs选择,fs总会引用准确的TEB(即当前线程之一)。 通过读取与TEB的Self区域相符的 fs:[18h]得到TEB的地址。

列出TEB的信息如下:

0:000> !teb
TEB at 7efdd000ExceptionList:        003ef804          -----------------------StackBase:            003f0000StackLimit:           003ed000SubSystemTib:         00000000FiberData:            00001e00ArbitraryUserPointer: 00000000Self:                 7efdd000EnvironmentPointer:   00000000ClientId:             00001644 . 00000914RpcHandle:            00000000Tls Storage:          7efdd02cPEB Address:          7efde000LastErrorValue:       2LastStatusValue:      c0000034Count Owned Locks:    0HardErrorMode:        0
复制代码

现在我们可以证实fs引用TEB:

0:000> dg fsP Si Gr Pr Lo
Sel    Base     Limit     Type    l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
0053 7efdd000 00000fff Data RW Ac 3 Bg By P  Nl 000004f3
复制代码

正如我们在之前讲述过的, fs:18h含有TEB的地址:

0:000> ? poi(fs:[18])
Evaluate expression: 2130563072 = 7efdd000
复制代码

记住:poi会对某一指针进行解引用操作并且使用‘?’来对某一表达式进行求值操作。 我们看看ExceptionList 指向的结构体名:

0:000> dt nt!_NT_TIB ExceptionList
ntdll!_NT_TIB+0x000 ExceptionList : Ptr32 _EXCEPTION_REGISTRATION_RECORD
复制代码

正如我们已经说过的那样,这意味着每个节点会是_EXCEPTION_REGISTRATION_RECORD的某一实例。使用!slist命令展示出整个链表的信息:

0:000> !slist $teb _EXCEPTION_REGISTRATION_RECORD
SLIST HEADER:+0x000 Alignment          : 3f0000003ef804+0x000 Next               : 3ef804+0x004 Depth              : 0+0x006 Sequence           : 3fSLIST CONTENTS:
003ef804+0x000 Next             : 0x003ef850 _EXCEPTION_REGISTRATION_RECORD+0x004 Handler          : 0x6d5da0d5     _EXCEPTION_DISPOSITION  MSVCR120!_except_handler4+0
003ef850+0x000 Next             : 0x003ef89c _EXCEPTION_REGISTRATION_RECORD+0x004 Handler          : 0x00271709     _EXCEPTION_DISPOSITION  +0
003ef89c+0x000 Next             : 0xffffffff _EXCEPTION_REGISTRATION_RECORD+0x004 Handler          : 0x77e21985     _EXCEPTION_DISPOSITION  ntdll!_except_handler4+0
ffffffff+0x000 Next             : ???? +0x004 Handler          : ???? 
Can't read memory at ffffffff, error 0
复制代码

记住$teb表示的是TEB的地址.

以下使用了一种更简洁的方法来展示异常处理链的信息:

0:000> !exchain
003ef804: MSVCR120!_except_handler4+0 (6d5da0d5)CRT scope  0, func:   MSVCR120!doexit+116 (6d613b3b)
003ef850: exploitme3+1709 (00271709)
003ef89c: ntdll!_except_handler4+0 (77e21985)CRT scope  0, filter: ntdll!__RtlUserThreadStart+2e (77e21c78)func:   ntdll!__RtlUserThreadStart+63 (77e238cb)
We can also examine the exception handler chain manually:
0:000> dt 003ef804 _EXCEPTION_REGISTRATION_RECORD
MSVCR120!_EXCEPTION_REGISTRATION_RECORD+0x000 Next             : 0x003ef850 _EXCEPTION_REGISTRATION_RECORD+0x004 Handler          : 0x6d5da0d5     _EXCEPTION_DISPOSITION  MSVCR120!_except_handler4+0
0:000> dt 0x003ef850 _EXCEPTION_REGISTRATION_RECORD
MSVCR120!_EXCEPTION_REGISTRATION_RECORD+0x000 Next             : 0x003ef89c _EXCEPTION_REGISTRATION_RECORD+0x004 Handler          : 0x00271709     _EXCEPTION_DISPOSITION  +0
0:000> dt 0x003ef89c _EXCEPTION_REGISTRATION_RECORD
MSVCR120!_EXCEPTION_REGISTRATION_RECORD+0x000 Next             : 0xffffffff _EXCEPTION_REGISTRATION_RECORD+0x004 Handler          : 0x77e21985     _EXCEPTION_DISPOSITION  ntdll!_except_handler4+0
复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python集合的元素可以是_Python集合的元素中,为什么不可以是包含嵌套列表的元组?...

你有一个误解&#xff0c;hash算法针对的是元素的内容&#xff0c;并不是针对指针&#xff0c;所以指针不变不等于可hash。 如果你想深究细节的话&#xff0c;可以看tuple的源码&#xff1a; static Py_hash_t tuplehash(PyTupleObject *v) { Py_uhash_t x; /* Unsigned for de…

python lib库_python_lib基础库

1&#xff1a;argv传递给python脚本的命令行参数列表&#xff0c;argv[0]是脚本的名字(他是平台独立的&#xff0c;不管他是一个路径全名或不是)&#xff0c;如果使用了-c参数选项&#xff0c;argv[0]会被设置为字符串-c&#xff0c;如果没有脚本名传递给python解释器&#xff…

hive复合数据类型之map

概述 MAP&#xff1a;MAP包含key->value键值对&#xff0c;可以通过key来访问元素。比如”userlist”是一个map类型&#xff0c;其中username是key&#xff0c;password是value&#xff1b;那么我们可以通过userlist[username]来得到这个用户对应的password&#xff1b; 操…

Beego框架使用

为什么80%的码农都做不了架构师&#xff1f;>>> Beego Web项目目录结构 new 命令是新建一个 Web 项目&#xff0c;我们在命令行下执行 bee new <项目名> 就可以创建一个新的项目。但是注意该命令必须在 $GOPATH/src 下执行。最后会在 $GOPATH/src 相应目录下…

oracle下lag和lead分析函数

Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列。 这种操作可以代替表的自联接&#xff0c;并且LAG和LEAD有更高的效率。 语法&#xff1a; [sql] view plaincopy /*语法*/ lag(exp_str,offset,defval) over() Lead(…

802d简明调试手册_SINUMERIK-828D简明调试手册.pdf

SINUMERIK 828D / 828D BASIC简明调试手册SINUMERIKAnswers for industry. SIEMENSABC01.2012 ASINUMERIK 828D / 828D BASIC V04.04SP01123PLC 45NC 67PLC 891011121314151617PLC 18i1 11.1 11.1.1 NC 31.1.2 31.2

jtessboxeditorfx 界面显示不出来_macOS 使用 XQuartz 支持 X11 实现 Linux 图形化界面显示...

更多奇技淫巧欢迎订阅博客&#xff1a;https://fuckcloudnative.io前言在 Windows 中相信大家已经很熟悉使用 Xmanager(Xshell), MobaXterm, SecureCRT 通过 X11 实现 Linux 图形化界面显示&#xff0c;我的需求是在 macOS 下使用 iTerm2 作为 Terminal 实现 X11 图形化界面显示…

EntityFramework Core 2.0 Explicitly Compiled Query(显式编译查询)

前言 EntityFramework Core 2.0引入了显式编译查询&#xff0c;在查询数据时预先编译好LINQ查询便于在请求数据时能够立即响应。显式编译查询提供了高可用场景&#xff0c;通过使用显式编译的查询可以提高查询性能。EF Core已经使用查询表达式的散列来表示自动编译和缓存查询&a…

Oracle Minus关键字 不包含 取差集

Oracle Minus关键字   SQL中的MINUS关键字   SQL中有一个MINUS关键字&#xff0c;它运用在两个SQL语句上&#xff0c;它先找出第一条SQL语句所产生的结果&#xff0c;然后看这些结果有没有在第二个SQL语句的结果 中。如果有的话&#xff0c;那这一笔记录就被去除&#xff0…

python扫描器甄别操作系统类型_20189317 《网络攻防技术》 第三周作业

一.教材内容总结1.网络踩点&#xff1a;web搜索与挖掘、DNS和IP查询、网络拓扑侦察(1)网络踩点目标确定(2)技术手段&#xff1a;web信息搜索与挖掘、DNS和IP查询、网络拓扑侦察(3)web信息搜索与挖掘&#xff1a;基本搜索与挖掘技巧、高级搜索与挖掘技巧、编程实现google搜索、元…

python 网页重定向_小试牛刀:python爬虫爬取springer开放电子书.

首先声明,本文旨在记录反思,并没有资源,代码也不具有借鉴意义(水平实在不行.某天,水群的时候发现群友发了一个文件,里面是疫情时期springer开放的免费电子书名单,同时还附有下载链接,总共有400多本,这要是一个一个下载不得累死个人,只下载自己感兴趣的书也是一个好主意,但是,我…

直面桌面云带来的现状优势

在桌面云解决方案里&#xff0c;首先&#xff0c;所有的数据以及运算都在服务器端进行&#xff0c;客户端只是显示其变化的影像而已&#xff0c;所以在不需要担心客户端来非法窃取资料&#xff0c;我们在电影里面看到的商业间谍拿着 U 盘疯狂的拷贝公司商业机密的情况再也不会出…

ORA-28001: the password has expired解决方法

Oracle提示错误消息ORA-28001: the password has expired&#xff0c;是由于Oracle11G的新特性所致&#xff0c; Oracle11G创建用户时缺省密码过期限制是180天&#xff08;即6个月&#xff09;&#xff0c; 如果超过180天用户密码未做修改则该用户无法登录。 Oracle公司是为了数…

.net 导出excel_Qt编写的项目作品18-数据导出到Excel及Pdf和打印数据

一、功能特点原创导出数据机制&#xff0c;不依赖任何office组件或者操作系统等第三方库&#xff0c;尤其是支持嵌入式linux。10万行数据9个字段只需要2秒钟完成。只需要四个步骤即可开始急速导出大量数据到Excel。同时提供直接写入数据接口和多线程写入数据接口&#xff0c;不…

hive数据库定义

默认数据库"default" 可以显式切换数据库&#xff1a;hive> use 数据库名; 创建 hive>CREATE DATABASE [IF NOT EXISTS] mydb [LOCATION] /....... [COMMENT] ....; 实例 hive (default)> create database test_db comment test database; OK Ti…

图像增强_Keras 常用的图像增强方式

欢迎关注 “小白玩转Python”&#xff0c;发现更多 “有趣”在使用神经网络和深度学习模型时&#xff0c;需要进行数据准备。对于更复杂的物体识别任务&#xff0c;也越来越需要增加数据量。数据增加意味着增加数据量。换句话说&#xff0c;拥有更大的数据集意味着更健壮的模型…

Facebook产品经理的三年叙事与协作思考

产品经理和研发工程师的关系经常被大家调侃&#xff0c;可偏偏就有同时受到研发和设计都喜欢的“别人家的产品经理”&#xff0c;沟通协调、对接需求、项目把控面面俱到还有好人缘。有没有人天生就是产品经理&#xff1f;产品经理的工作就是写需求写需求和写需求么&#xff1f;…

sis新地址_坚若磐石不掉速,老平台升级新选择,入手昱联Asint 500G SSD

我是文章的原作者&#xff0c;文章首发于&#xff1a;什么值得买爱折腾的老狐狸​zhiyou.smzdm.com首发文章链接&#xff1a;坚若磐石不掉速&#xff0c;老平台升级新选择&#xff0c;入手昱联Asint 500G SSD _值客原创_什么值得买​post.smzdm.com虽然说&#xff0c;现在越来越…

hive表定义(3种方式)

创建表 方式一 建表语法 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ..…

进度条设置_为你的练习设置进度条

在我们的日常练习中&#xff0c;遇到最多的一个问题就是不知道自己练得怎么样了&#xff1f;还需不需要继续&#xff0c;或者调整练习方法。这种问题大多出现在自学吉他的学生当中&#xff0c;因为得不到老师的反馈&#xff0c;自己练得对不对&#xff0c;够不够&#xff0c;都…