您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎么逆向分析微軟IFEO鏡像劫持從ring3到ring0的實現(xiàn)機理,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
IFEO(Image File Execution Options )是設(shè)置在Windows注冊表中,創(chuàng)建IFEO注冊表項的目的是讓開發(fā)人員可以選擇調(diào)試他們的軟件,是為了開發(fā)人員可以使用注冊表項將任何程序附加到任何可執(zhí)行文件,但是很多被利用了去實現(xiàn)進程注入。很多只知道ring3的部分機制,但是并不知道完整的機制,今天們就來分析下它的ring3到ring0的整個過程的機理。
開發(fā)一個小的test.exe解析命令行,為了方便上調(diào)試器調(diào)試加上Messagebox 彈框
編譯后,我們可以修改注冊表演示下IFFO
**HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\{name of the executable}**
加個notepad.exe的項目然后添加Debugger的keyvalue
“Debugger”=”{full path to the debugger}”
然后我們在windows左下角搜索框輸入notepad
然后啟動notepad.exe,這時我們的test.exe就會被啟動了
今天的目的就是來分析下這種機制的原理。
把上述代碼繼續(xù)改造的MessageBox去掉,加直接啟動notepad.exe的啟動參數(shù)里的進程
然后上ollydbg調(diào)試運行。
啟動后對CreatPorcessW下斷點輸入命令: bp CreatPorcessW
斷點停下來
繼續(xù)F8 然后F7進入
**775F1054 |. E8 22010100 CALL kernel32.CreateProcessInternalW**
通過IDA
查看CreateProcessInternalW前面基本都是一些字符串拷貝的動作
在Ollydbg開始階段就直接F8單步運行過去
接著就是創(chuàng)建環(huán)境
這些也直接單步走過,當我們單步到這里的時候
調(diào)試器在這里下斷點
然后F8
發(fā)現(xiàn)
NtCreateUserProcess(&Process, &ThreadHandle, 0x2000000, 0x2000000, v188, v189, v64, 1, v60, &v194, &v347)
函數(shù)的eax的返回值是0xC0000039,也就是說這里調(diào)用內(nèi)核去創(chuàng)建的時候是直接失敗的,
返回值是STATUS_OBJECT_PATH_INVALID
意識就是說路徑對象無效,通過分析第九個參數(shù)結(jié)構(gòu)體的數(shù)據(jù)發(fā)現(xiàn)路徑確實沒有任何問題
我們可以做個對比實驗,把IFEO的對應(yīng)注冊表Debugger刪除后再運行調(diào)試
下面是正常情況下把注冊表刪除了后的運行
參數(shù)基本一模一樣,然后直接F8 單步運行,結(jié)果出現(xiàn)了返回值eax == 0
也就是STATUS_SUCCES,沒有debugger注冊表鍵值的時候NtCreateUserProcess內(nèi)核返回值是0
,現(xiàn)在我們大致可以猜測內(nèi)核里也對這個IFEO位置的注冊表鍵值做了處理,為了搞清楚內(nèi)核如何處理,直接上windbg用虛擬機進行雙機調(diào)試,調(diào)試內(nèi)核。
接下來在NtCreateUserProcess上下斷點,當Ollydbg里執(zhí)行NtCreadtUserProcess
時windbg里斷點停下來
有個最簡單的方法就是不斷的嘗試單步進入函數(shù)后單步Call返回值為0xC0000039的函數(shù),最后經(jīng)過反復的實現(xiàn)發(fā)現(xiàn)NtCreateUserProcess內(nèi)在調(diào)用**PspAllocateProcess**
函數(shù)時返回0xC0000039
在fffff800`0412651f 出下斷點
運行后斷下
調(diào)試器停在了call nt!PspAllocateProcess (fffff8000412852c)
,F10 后查看eax值r eax
,顯示
也就是說在這個函數(shù)里可能會涉及處理注冊表的過程,用ida打開ntkrnlmap.exe的內(nèi)核文件,慢慢查看會發(fā)現(xiàn)有這么一段代碼
在這段代碼里判斷IFEOKEY 是否有對應(yīng)Debugger注冊表設(shè)置,往上面翻會發(fā)現(xiàn)IFEOKey打開的就是當前進程名的IFEOKey的注冊表
RtlpOpenImageFileOptionsKey
調(diào)用了RtlpOpenBaseImageFileOptionsKey
,RtlpOpenBaseImageFileOptionsKey
會ZwOpenKey IFEO
注冊表
為了驗證我們的結(jié)果,在RtlQueryImageFileKeyOption
函數(shù)下斷點
進入 RtlQueryImageFileKeyOption
函數(shù)單步執(zhí)行到ZwQueryValueKey
時,F(xiàn)10后
查看rsi里的值
會發(fā)現(xiàn)此時讀取到Debugger的設(shè)置注冊表,然后返回到調(diào)用之前的下面一句指令:
判斷eax是否是0,此時函數(shù)返回值就是0,然后就進入了
mov r12d,0xC00000039h
最后把 r12d 賦值給了eax返回
就是最后我看到創(chuàng)建進程失敗了,錯誤號0xC00000039
當前者失敗后,ring3 層就進入了
76B4F75F . FF15 5006B176 CALL DWORD PTR DS:[<&ntdll.LdrQueryImageFileKeyOption>] ; ntdll.LdrQueryImageFileKeyOption
函數(shù)去讀取IFEO的Debugger注冊表
獲取了數(shù)據(jù)后,解析參數(shù)成功后就把當前進程的路徑加載Debugger對應(yīng)的進程后面作為一個參數(shù)組合成一個啟動進程參數(shù)
在上圖可以看到兩個路徑被加到一起。構(gòu)造的的新參數(shù)就是
UNICODE "C:\Users\Administrator\Desktop\test.exe C:\Windows\System32\notepad.exe"
最后goto LABEL_87
重新組建進程參數(shù)環(huán)境去執(zhí)行新的進程,又會進入NtCreateUserProcess
,但這時啟動的是test.exe
這時返回值就是0了,創(chuàng)建成功
至此整個過程就分析完畢了,微軟的IFEO機制本來是給開發(fā)人員調(diào)試程序用的,后來慢慢被惡意軟件用來鏡像劫持,在微軟的官方msdn里有一段描述說使用DEBUG_ONLY_THIS_PROCESS和DEBUG_PROCESS方式 CreateProcess時是不會讀取注冊表去劫持的,而實際測試時確實如此,具體原理讀者可以自行分析。 特別申明:逆向分析調(diào)試是一種武器,切莫用于非法途徑。
上述內(nèi)容就是怎么逆向分析微軟IFEO鏡像劫持從ring3到ring0的實現(xiàn)機理,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。