日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Exploit开发系列教程-Mona 2 SEH

發(fā)布時(shí)間:2025/3/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Exploit开发系列教程-Mona 2 SEH 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

P3nro5e · 2015/07/10 10:58

0x00 Mona 2 前言 & 準(zhǔn)備


Mona 2是一種非常有用的插件,它由Corelan Team開(kāi)發(fā)。起初是為Immunity Debugger寫(xiě)的,現(xiàn)在它適用于WinDbg調(diào)試器。

你將需要為WinDbg x86 和 WinDbg x64安裝一些工具:

安裝Python 2.7 (從這里可下載到) 。

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

從這里下載正確的zip包(請(qǐng)下載pykd-0.2.0.29-python-2.7.zip這個(gè)壓縮包),接著提取并運(yùn)行vcredist_x86.exe 和 vcredist_x64.exe。

從這里下載兩個(gè)exe程序(x86版和x64版),接著執(zhí)行它們。

從這里下載windbglib.py和mona.py,并將它們放置到WinDbg.exe所在的目錄中。

配置符號(hào)搜索路徑如下:

通過(guò) File→Symbol File Path

輸入

SRV*C:\windbgsymbols*http://msdl.microsoft.com/download/symbols 復(fù)制代碼

3.保存工作區(qū)(File→Save Workspace).

在WinDbg下運(yùn)行mona.py

用WinDbg運(yùn)行mona.py的范例:

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

.load pykd.pyd 復(fù)制代碼

2.運(yùn)行mona使用命令如下:

!py mona 復(fù)制代碼

更新mona 輸入如下:

!py mona update 復(fù)制代碼

0x01 配置


工作目錄

在mona的工作目錄里,mona的多數(shù)函數(shù)將數(shù)據(jù)轉(zhuǎn)儲(chǔ)到已創(chuàng)建的文件中。我們可以具體指定某個(gè)工作目錄,這取決于使用的格式說(shuō)明符%p (process name) 和 %i (process id)指定的進(jìn)程名和id。

例如,輸入:

workingfolder "C:\mona_files\%p_%i" 復(fù)制代碼

排除模塊

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

!mona config -set excluded_modules "module1.dll,module2.dll" !mona config -add excluded_modules "module3.dll,module4.dll" 復(fù)制代碼

作者

你也可以設(shè)定作者:

!mona config -set author Kiuhnm 復(fù)制代碼

當(dāng)產(chǎn)生與metasploit兼容的輸出內(nèi)容時(shí)可以使用該信息。

重點(diǎn)

如果WinDbg和mona都沒(méi)有出錯(cuò),那么請(qǐng)?jiān)囋囈怨芾韱T身份運(yùn)行WinDbg。

0x02 Mona的手冊(cè)


你可以在這里找到更多關(guān)于Mona的信息。

范例

該范例引用自Mona的手冊(cè). 現(xiàn)在來(lái)說(shuō)明如下代碼中我們控制的ECX的值:

MOV EAX, [ECX] CALL [EAX+58h] 復(fù)制代碼

我們想要使用那段代碼以jmp到我們的shellcode(即我們注入到進(jìn)程中的代碼),它的地址位于ESP+4,因此我們需要調(diào)用如上調(diào)用的一些指令,如“ADD ESP, 4 | RET“。上面的代碼有許多間接的操作:

(ECX = p1) → p2 p2+58h → p3 → “ADD ESP,4 | RET” 復(fù)制代碼

首先我們需要找到p3:

!py mona config -set workingfolder c:\logs !py mona stackpivot -distance 4,4 復(fù)制代碼

如上使用的命令可以讓你在stackpivots內(nèi)的指定偏移范圍在mix~max之間找到等價(jià)于ADD ESP, X | RET代碼的指針,通過(guò)選項(xiàng)-distance min,max來(lái)指定偏移范圍。

已發(fā)現(xiàn)指針/地址會(huì)被寫(xiě)入到c:\logs\stackpivot.txt。

現(xiàn)在我們已經(jīng)有我們的p3指針(許多p3指針!)了,我們還需找到p1:

!py mona find -type file -s "c:\logs\stackpivot.txt" -x * -offset 58 -level 2 -offsetlevel 2 復(fù)制代碼

下面來(lái)了解那些選項(xiàng)的含義:

使用“-x *”選項(xiàng)意味著你要 “accept addresses in pages with any access level” (正如另一個(gè)范例所示, 用 “-x X”選項(xiàng)說(shuō)明我們僅在可執(zhí)行頁(yè)中定位).

“-level 2”具體指定要間接操作的指令層級(jí),它告知mona找出“a pointer (p1) to a pointer (p2)to a pointer (p3)”。 前兩個(gè)選項(xiàng) (-type 和 -s)指定ps必須是指針,它被列出在文件“c:\logs\stackpivot.txt“里。

使用“-offsetlevel 2” 和 “-offset 58”選項(xiàng)告知mona用偏移58h來(lái)進(jìn)行增值操作時(shí),第二個(gè)指針(p2)必須指向第三個(gè)指針(p3)。

如果這個(gè)范例并不能讓你對(duì)其內(nèi)容有較好的理解,請(qǐng)你不要擔(dān)心。這個(gè)范例僅向你展示了WinDbg中利用Mona插件可以實(shí)現(xiàn)的一些功能。當(dāng)然,我也承認(rèn)這個(gè)命令的語(yǔ)法不是非常易懂。

范例

使用findwild命令可以讓你找到帶有特殊形式的指令鏈。 細(xì)想如下范例:

!mona findwild -s "push r32 # * # pop eax # inc eax # * # retn" 復(fù)制代碼

選項(xiàng)”-s”指定鏈的形態(tài):

用 ‘#‘將指令分隔開(kāi)

r32 為任意32位寄存器

  • 為任意指令序列

可選參數(shù)為:

  • -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并利用它們構(gòu)造ROP鏈,但是我將不在這部分講解這方面的相關(guān)內(nèi)容,因?yàn)檫@里我假設(shè)你并不知道ROP鏈的含義及關(guān)于ROP的概念。正如我曾說(shuō)過(guò)的,如果這篇文章講述的內(nèi)容讓你難以理解,那么請(qǐng)不要擔(dān)心。盡管學(xué)習(xí)該系列的下一部分文章吧。

0x03 結(jié)構(gòu)化異常處理(SEH)


異常處理器以一種單鏈表的形式存在,它和每個(gè)線(xiàn)程有關(guān)。一般說(shuō)來(lái),鏈表的節(jié)點(diǎn)被分配在棧上。某一位于TEB (Thread Environment Block)的起始位置的指針指向鏈表頭,因此當(dāng)代碼想要添加一個(gè)新的異常處理器時(shí),某一新節(jié)點(diǎn)會(huì)被添加到鏈表頭并且在TEB里的指針?biāo)赶虻奈恢脮?huì)被改變,進(jìn)而指向新節(jié)點(diǎn)。

每個(gè)節(jié)點(diǎn)固有_EXCEPTION_REGISTRATION_RECORD類(lèi)型并且會(huì)存儲(chǔ)處理器的地址及鏈表下個(gè)節(jié)點(diǎn)的一個(gè)指針。奇怪的是,鏈表上一節(jié)點(diǎn)的“next pointer”不是null但是它等價(jià)于0xffffffff。

確切的定義如下:

0:000> dt _EXCEPTION_REGISTRATION_RECORD ntdll!_EXCEPTION_REGISTRATION_RECORD+0x000 Next : Ptr32 _EXCEPTION_REGISTRATION_RECORD+0x004 Handler : Ptr32 _EXCEPTION_DISPOSITION 復(fù)制代碼

TEB可被段選擇子fs訪(fǎng)問(wèn)(始于 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 復(fù)制代碼

編譯器通常會(huì)注冊(cè)單個(gè)全局句柄,它能意識(shí)到被程序執(zhí)行過(guò)的區(qū)域(這依賴(lài)于某一全局變量)并且當(dāng)它被調(diào)用時(shí)會(huì)有根據(jù)地作出行為。

因?yàn)槊總€(gè)線(xiàn)程都有一個(gè)不同的TEB,因此操作系統(tǒng)會(huì)確保段被fs選擇,fs總會(huì)引用準(zhǔn)確的TEB(即當(dāng)前線(xiàn)程之一)。 通過(guò)讀取與TEB的Self區(qū)域相符的 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 復(fù)制代碼

現(xiàn)在我們可以證實(shí)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 復(fù)制代碼

正如我們?cè)谥爸v述過(guò)的, fs:18h含有TEB的地址:

0:000> ? poi(fs:[18]) Evaluate expression: 2130563072 = 7efdd000 復(fù)制代碼

記住:poi會(huì)對(duì)某一指針進(jìn)行解引用操作并且使用‘?’來(lái)對(duì)某一表達(dá)式進(jìn)行求值操作。 我們看看ExceptionList 指向的結(jié)構(gòu)體名:

0:000> dt nt!_NT_TIB ExceptionList ntdll!_NT_TIB+0x000 ExceptionList : Ptr32 _EXCEPTION_REGISTRATION_RECORD 復(fù)制代碼

正如我們已經(jīng)說(shuō)過(guò)的那樣,這意味著每個(gè)節(jié)點(diǎn)會(huì)是_EXCEPTION_REGISTRATION_RECORD的某一實(shí)例。使用!slist命令展示出整個(gè)鏈表的信息:

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 復(fù)制代碼

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

以下使用了一種更簡(jiǎn)潔的方法來(lái)展示異常處理鏈的信息:

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 復(fù)制代碼

總結(jié)

以上是生活随笔為你收集整理的Exploit开发系列教程-Mona 2 SEH的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。