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.pswp.cn/news/539220.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539220.shtml
英文地址,請注明出處:http://en.pswp.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;都…