《逆向工程實驗報告》由會員分享,可在線閱讀,更多相關(guān)《逆向工程實驗報告(11頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、
電子科技大學(xué)
信息與軟件工程學(xué)院
逆向工程
實
驗
報
告
姓 名:XXX
學(xué) 號:201852090710
指導(dǎo)教師:何興高
一、題目
基于MBR的Bootkit的逆向分析
二、題目梗概
利用逆向工程技術(shù),從可運行的程序系統(tǒng)出發(fā),運用解密、反匯編、系統(tǒng)分析、程序理解等多種計算機技術(shù),對軟件的結(jié)構(gòu)、流程、算法、代碼等進行逆向拆解和分析,推導(dǎo)出軟件產(chǎn)品的源代碼、設(shè)計原理、結(jié)構(gòu)、算法、處理過程、運行方法及相關(guān)文檔等。隨著用戶需求的復(fù)雜度越來越高,軟件開發(fā)難度不斷上升,快速高效地軟件開發(fā)已成為項目成敗的
2、關(guān)鍵之一。
Bootkit是一種比較舊的技術(shù),這個概念最早是在2005年由eEye Digital安全公司在他們的“BootRoot"項目中提及的。Rootkit是一種特殊的惡意軟件,它的功能是在安裝目標上隱藏自身及指定的文件、進程和網(wǎng)絡(luò)鏈接等信息,比較多見到的是Rootkit一般都和木馬、后門等其他惡意程序結(jié)合使用。Rootkit通過加載特殊的驅(qū)動,修改系統(tǒng)內(nèi)核,進而達到隱藏信息的目的。rootkit并不一定是用作獲得系統(tǒng)root訪問權(quán)限的工具。實際上,rootkit是攻擊者用來隱藏自己的蹤跡和保留root訪問權(quán)限的工具。通常,攻擊者通過遠程攻擊獲得root訪問權(quán)限,或者首先密碼猜
3、測或者密碼強制破譯的方式獲得系統(tǒng)的訪問權(quán)限。進入系統(tǒng)后,如果他還沒有獲得root權(quán)限,再通過某些安全漏洞獲得系統(tǒng)的root權(quán)限。接著,攻擊者會在侵入的主機中安裝rootkit,然后他將經(jīng)常通過rootkit的后門檢查系統(tǒng)是否有其他的用戶登錄,如果只有自己,攻擊者就開始著手清理日志中的有關(guān)信息。通過rootkit的嗅探器獲得其它系統(tǒng)的用戶和密碼之后,攻擊者就會利用這些信息侵入其它的系統(tǒng)。所有在開機時比Windows內(nèi)核更早加載,實現(xiàn)內(nèi)核劫持的技術(shù),都可以稱之為Bootkit。Bootkit主要是利用其內(nèi)核準入和開機過程的隱身技術(shù),在功能上無異于Rootkit。傳統(tǒng)的Rootkit利用系統(tǒng)啟動時提
4、升權(quán)限,而Bootkit主要被安置在外設(shè)的主引導(dǎo)扇區(qū)(也有放于Ntldr文件、BIOS中的Bootkit)并駐留在整個系統(tǒng)的啟動過程。Bootkit屬于Rootkit的一種,但它卻是更加高級的Rootkit,因為其存放于主引導(dǎo)扇區(qū)、啟動文件之類地方,在操作系統(tǒng)啟動之前駐留內(nèi)存并內(nèi)核運行之前劫持內(nèi)核。
MBR即主引導(dǎo)扇區(qū)(Master Boot Record)是裝有Linux系統(tǒng)的硬盤的第一個扇區(qū),即C/H/S地址的0柱面0磁頭1扇區(qū)。這個扇區(qū)是系統(tǒng)開啟時必須訪問的扇區(qū),記錄本磁盤相關(guān)信息以及硬盤各個分區(qū)的大小和信息。
本實驗旨在對基于MBR的BootKit的啟動模塊代碼,也
5、就是感染MBR后第1、第61、62扇區(qū)的模塊進行逆向分析。
三、涉及知識點
在本項目中,逆向涉及到的知識點有以下幾個,分別是:
l 保護模式下的匯編語言
l 實模式下的匯編語言
l BIOS中斷服務(wù)
l 多級HOOK技術(shù)
l 計算機系統(tǒng)內(nèi)核原理
l NTLDR(系統(tǒng)加載程序,用于裝載Windows xp 2003等版本)
四、涉及工具
在本項目中,涉及到的工具有以下幾個,分別是:
l IDA(主要靜態(tài)分析Bootkit)、
l Windbg
l Bochs(主要是用于動態(tài)調(diào)試這個Bootkit)
l Winhex工具
五、源程序
見附件
六、過程及分析
6、 首先介紹一下這個樣本黑盒后的癥狀:感染MBR(感染的具體形式為:真正的MBR被挪到了第63個扇區(qū),Bootkit啟動模塊的代碼在第1、61、62個扇區(qū)。)直接在硬盤上寫入了一個驅(qū)動(這種寫入不是普通的在磁盤上釋放一個文件,在系統(tǒng)的文件系統(tǒng)里面是看不見這個驅(qū)動的,在實驗的虛擬機上是寫入了未分區(qū)的空間中,通過Winhex工具可以查看到);生成一個DLL并運行然后10分鐘后自動關(guān)機。第1、61、62個扇區(qū)的代碼中,第1個扇區(qū)的代碼是實模式下的匯編語言,第61、62個扇區(qū)是保護模式下的匯編語言,所以在用IDA分析的時候要進行選擇,至于這三個扇區(qū)的代碼直接用Winhex截取出來然后進行逆向分析。
7、 這個Bootkit的啟動代碼主要用了三級HOOK,分別為HOOK INT13h、HOOK NTLDR的特征碼,HOOK內(nèi)核的特征碼。下面將主要分析這三級HOOK的行為。
1、第一級HOOK(HOOK INT13h)
seg000:7C35 @HOOK_INT13H:
seg000:7C35 xor bx, bx
seg000:7C37 mov eax, [bx+4Ch]
seg000:7C3B mov es:73h, eax
seg000:7C4
8、0 mov word ptr [bx+4Ch], 66h ; f
seg000:7C45 mov word ptr [bx+4Eh], es
seg000:7C48 push es
seg000:7C49 push 4Dh ; M
seg000:7C4C retf
上面的代碼實現(xiàn)了HOOK INT13h ,即HOOK了BIOS的磁盤中斷服務(wù)。
下面為HOOK INT13h后的主要代碼,其中主要是搜
9、索了NTLDR文件的特征碼,特征碼為:
SignatureCode is : 8B F0 mov esi,eax
85 F6 test esi,esi
74 21 jz $+23h
80..............
這段代碼運行后內(nèi)核和BootDriver已經(jīng)加載到內(nèi)存中,當找到這段代碼以后就對這段特征碼進行HOOK,HOOK的過程用到了CALL NEAR[offset3
10、2],即相對的尋址方式。這個HOOK利用了eEye BootRoot 里面的技術(shù)。上面的主要代碼是在第一個扇區(qū)中的代碼實現(xiàn)的,是實模式下執(zhí)行的代碼。
2、第二級HOOK(HOOK NTLDR的特征碼)
這里主要為HOOK了NLTDR以后代碼執(zhí)行的過程,第二個HOOK的代碼主要是在第61個扇區(qū)中實現(xiàn)的。
首先第二個HOOK會去搜索NTLDR中的特征碼,搜索這個特征碼是為了定位到BlLoaderBlock這個變量,這個變量中包括了很多有用的信息,如內(nèi)核和BootDriver等等。搜索過程為下圖:
圖1
當搜索到以后就可以定位到BlLoaderBlock,然后[[BlLoaderBl
11、ock]+0]就正好為模塊鏈表的指針。這個指針所指向的結(jié)構(gòu)的一些主要成員為:
+00h LIST_ENTRY module list links
+08h [10h] 不太了解
+18h PTR image base address
+1Ch PTR module entry point
+20h DWORD size of loaded module in memory
+24h UNICODE_STRING full module path and file name
12、
+2Ch UNICODE_STRING module file name
下圖的代碼就是利用上面介紹BlLoaderBlock的結(jié)構(gòu)定位到了內(nèi)核的基址。
圖2
當定位到內(nèi)核以后,Bootkit將搜索內(nèi)核的特征代碼,然后對內(nèi)核進行HOOK。
搜索的內(nèi)核代碼為:
push 4Bh 6Ah 4Bh
push 19h 6Ah 19h
call InbvSetProgressBarSubset(x,x) E8 E8 DD
13、E6 FF
push [ebp+var_470] FF B5 90 FB FF FF
call IoInitSystem(x) E8 53 E6 FF FF
當搜索到了上面的內(nèi)核特征碼后,就對內(nèi)核的call IoInitSystem(x)進行了HOOK,這個搜索特征碼的過程如下圖所示:
圖3
當搜索到特征碼后接下就會對Kernel的特征碼進行HOOK,HOOK的特征碼為:
call IoInitSystem(x) E8 53 E6 FF FF
修改
14、的地方為后面四個字節(jié)的偏移量。通過這個HOOK Bootkit就能在內(nèi)核運行的時候再次獲得執(zhí)行的機會。
下面的代碼便是對內(nèi)核進行HOOK的操作:
圖4
從上圖的代碼看出,在這個過程中Bootkit會將HOOK內(nèi)核的代碼挪到內(nèi)存中內(nèi)核映像文件的末尾位置,大小正好為200個字節(jié)。
上面便是Bootkit的第二個HOOK所完成的工作。
3、第三級HOOK(HOOK Kernel的特征碼)
當HOOK Kernel后的代碼運行時,主要的代碼是在第62個扇區(qū)中。其中的代碼有些復(fù)雜,這里只介紹主要的執(zhí)行流程。這個HOOK代碼主要的功能實現(xiàn)了加載并運行一個驅(qū)動程序。
15、
第三級HOOK中首先是通過內(nèi)核的輸出表定位到ExAllocatePool函數(shù),搜索這個內(nèi)核的函數(shù)是通過Hash的比較。當找到這個函數(shù)的地址以后就調(diào)用這個函數(shù)分配一片內(nèi)存池,然后把下面的代碼拷貝到這份內(nèi)存中并在內(nèi)存池中執(zhí)行Bootkit后面的代碼。上面這個過程具體實現(xiàn)如下入所示:
圖5
接下來Bootkit會把調(diào)用之前被HOOK的IoInitSystem(x)函數(shù),即去Call這個函數(shù),讓IO去初始化系統(tǒng)。當執(zhí)行完這步操作以后,則會在內(nèi)核中搜索和多函數(shù),如NtReadFile、NtOpenFile、NtClose等函數(shù),調(diào)用這些函數(shù)主要是為了能夠把驅(qū)動直接從磁盤上讀出來,然后運行。
16、
具體過程為如下。
首先調(diào)用NtOpenFile打開磁盤,并定位那個驅(qū)動的位置。過程為:
圖6
接下來調(diào)用NtReadFile函數(shù),把驅(qū)動從磁盤上讀到內(nèi)存中,過程為下圖所示:
圖7
當把驅(qū)動讀入到內(nèi)存以后Bootkit還有一個將驅(qū)動進行內(nèi)存對齊的操作。
具體過程為下圖所示:
圖8
當對驅(qū)動進行內(nèi)存對齊以后,就開始根據(jù)偏移定位到驅(qū)動的入口地址,然后運行驅(qū)動程序,具體過程下圖所示為:
圖9
當驅(qū)動執(zhí)行完畢后,則把控制權(quán)交還給Bootkit的啟動代碼,Bootkit最后做的善后處理為:把正在運行的內(nèi)存池里面的代碼清零,然后把控制權(quán)交給操作系統(tǒng)的內(nèi)核,讓內(nèi)核繼續(xù)進行計算機的啟動過程。
以上便是這個Bootkit樣本的啟動模塊代碼執(zhí)行流程。
最后附上一個圖,下圖為HOOK Kernel處留下的痕跡。
圖10
Call IoInitSystem(x)被替換成了Call 806cee00,而806cee00地址處的代碼是Bootkit第三個HOOK的代碼。
七、心得
逆向工程是一個實踐性很強的學(xué)科,通過在線課程的學(xué)習(xí)以及親手上機實驗使得我在本次課程中收獲很大,通過對程序的逆向工程的分析,本人對計算機技術(shù)有了更加深刻的認識。
感謝何興高老師在課堂上的諄諄教誨,更感謝何老師在休息時間對我們的耐心講解。