當前位置:
首頁 > 新聞 > 如何利用IDA Python瀏覽WINDOWS內核

如何利用IDA Python瀏覽WINDOWS內核


寫在前面的話


當我去參加安全會議時,我總喜歡跟大神們討論關於逆向工程方面的東西。因為這樣我就可以從別人的經驗中了解到他們是如何自動化實現那些繁瑣操作的了。值得一提的是,很多人已經習慣使用IDA的人卻不喜歡使用內置的API來完成他們的工作。為了改變這個現狀,今天我準備給大家演示IDA配合上Python之後會有怎樣強大的效果。

在這篇文章中,我將給大家介紹如何利用IDA Python來枚舉Windows的系統調用表。


背景知識


Windows系統中所有發生的系統調用都會被分配一個ID,這個ID是一個唯一值,用於標識一個系統調用在執行時具體使用的是哪一個函數。在不同的Windows版本中,這些ID的變化可能會非常大,對於Windows 10來說,每一個發行版本中的這些ID都不同。但是對於普通應用程序而言,由於使用的是用戶模式下的代碼庫,因此ID不會變化。


接下來,我將給大家演示如何手動枚舉調用表,然後再演示如何通過Python實現自動化枚舉。


手動枚舉Windows系統調用表


在解析系統調用表時我們還有三個重要的符號需要識別:表的基址、表的大小和參數在棧中所佔的位元組大小。對於ntoskrnl.exe來說,這三個參數的名稱分別為:KiServiceTable、KiServiceLimit和KiArgumentTable。對於win32k.sys來說,這三個參數就變成了W32pServiceTable、W32pServiceLimit和W32pArgumentTable。在32位系統架構中,這些符號名稱中都會包含下劃線。


比如說,我們來看一看Windows 7 64位版本中ntoskrnl.exe(版本6.1.7601.24117)的信息。KiServiceLimit數據如圖1所示:


根據這些信息,我們可以看到這裡有401個系統調用(0x191)。KiServiceTable數據如圖2所示:


根據圖2的數據,我們就可以將函數和它們的ID手動映射出來了。其中,NtMapUserPhysicalPagesScatter對應的ID為0x0000,NtWaitForSingleObject對應的ID為0x0001,NtCallbackReturn對應的ID為0x0002,後面的依此類推。


這裡有兩種特殊情況需要專門處理。如果我們分析的是win32k.sys,在枚舉函數ID時需要在表地址上加0x1000。同樣的,對於64位Windows10(build 1607)我們也需要進行不同的處理。在這個版本的系統中,系統調用表包含了四個位元組的函數偏移量。

下面給出的是版本號為10.0.17134.48的ntoskrnl.exe信息。KiServiceTable數據如圖3所示:


這也就意味著,我們需要每次讀取四個位元組的值,然後將它們與基地址相加。


利用IDA完成自動化映射


首先我們來看一看需要調用的IDA函數:





  1. idaapi.get_imagebase:這個函數將會在我們所查看的模塊中返回基地址。



  2. idc.GetInputFile:該函數可以返回IDB載入的文件名稱。



  3. idc.BADADDR:這是一個值為-1(無符號整形)的常量,我們還可以用它來判斷當前系統為32位還是64位模式。



  4. idc.Name:該函數可以返回給定地址的名稱。



  5. idc.LocByName:它的功能跟idc.Name正好相反,它用於返回給定名稱的地址。



  6. idc.Dword:該函數能返回給定地址的四位元組值。



  7. idc.Qword:該函數可返回給定地址的八位元組值。



  8. idautils.DataRefsFrom:該函數可根據任意數據引用枚舉給定地址。


首先,我們需要確定正在分析的對象是ntoskrnl.exe還是win32k.sys:


接下來,我們需要判斷使用哪一個符號名稱,並判斷是否需要在變數中添加下劃線:



如果表不存在,LocByName將返回BADADDR,所以我們就可以利用這一點來測試符號名稱是否存在或是否需要添加下劃線。


得到了正確的符號名稱之後,我們需要獲取表的實際大小:



首先獲取LocByName的地址,然後利用Dword獲取地址值。下面給出的是64位Windows 10的處理方法:


DataRefsFrom將會利用數據引用來遍歷表的基地址,但如果目標是新版本的Windows 10系統,我們就需要在基地址上加上相應的值。接下來需要做的就是從表的基地址開始讀取連續的值。我們可以使用Qword函數處理64位版本,用Dword處理32位版本。下面給出的是輸出結果樣本:



工具下載


完整源碼請點擊

閱讀原文

獲取


總結


逆向工程分析本來就是一個枯燥乏味的工作,但任務的自動化實現卻能夠在無聊中添加一些趣味。希望大家能夠喜歡這篇文章,並在日常工作中發現IDA和Python的更多功能。


* 參考來源:zerodayinitiative,FB小編Alpha_h4ck編譯,轉載請註明來自FreeBuf.COM


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

如何在CTF中少走彎路
如何利用Struts2漏洞繞過防火牆獲取Root許可權

TAG:FreeBuf |