逆向?qū)W習(xí)筆記二
逆向分析學(xué)習(xí)筆記旨在與小伙伴們分享小編們的學(xué)習(xí)心得,主要為一些短小但又精華的小技巧,具體如下:
一、PE文件各區(qū)段解釋(區(qū)段名稱跟功能沒有必然關(guān)系,這里只是說明常見的定義):
.code或.text段:存放程序的代碼數(shù)據(jù)。
.data段:存放程序運行使用的數(shù)據(jù)。
.rdata或.idata段:程序的導(dǎo)入表數(shù)據(jù)。
.edata段:程序的導(dǎo)出表所在的節(jié)。
.rsrc段 :程序資源節(jié),為多層的二叉排序樹,節(jié)點指向PE文件的各種類型資源(圖標(biāo)、對話框、菜單等)。
.reloc段:重定位表所在的節(jié),當(dāng)程序的加載基址被占用時,要重新分配加載基址,重定位表就用來處理由此產(chǎn)生的問題,加載基址改變之后,程序里的有些數(shù)據(jù)(如部分全局變量等)地址是寫死的,程序加載時將這些數(shù)據(jù)的地址更新,重定位表就用來存放需要重定位的數(shù)據(jù)信息。
二、Windbg界面雖然不怎么友好(看雪提供有Windbg高亮插件),偶爾也是可以用來分析應(yīng)用層程序的,但是Windbg剛加載程序時是在系統(tǒng)斷點處斷下的,可以載入程序之后在命令行設(shè)置斷點bp $exentry,再運行就會在程序的入口點斷下的。
三、將Windbg設(shè)置為默認(rèn)調(diào)試器的方法為在命令行轉(zhuǎn)到Windbg程序的目錄下,輸入Windbg –I,如果Windbg.exe的目錄已經(jīng)添加到了系統(tǒng)環(huán)境變量里,就不用再Cd進(jìn)Windbg程序的目錄了。設(shè)置默認(rèn)調(diào)試器可以在程序出現(xiàn)異常時自動掛載程序到出異常的位置,在調(diào)試漏洞Poc時非常有用,如果Poc觸發(fā)了異常就會自動調(diào)用Windbg到出問題的代碼處。
四、Windbg進(jìn)行本地調(diào)試時需要將系統(tǒng)的調(diào)試開關(guān)打開,命令為:bcdedit -debug on ,重啟生效,同理:bcdedit -debug off為關(guān)閉調(diào)試開關(guān)。
五、使用Windbg進(jìn)行源代碼調(diào)試驅(qū)動程序時必須首先安裝與系統(tǒng)相對應(yīng)的符號文件,如果驅(qū)動程序?qū)?yīng)的源碼名稱為QS2HU4.c,在驅(qū)動的入口設(shè)置斷點的命令為bp QS2HU4!DriverEntry,其中QS2HU4為源碼文件名、DriverEntry為驅(qū)動的入口函數(shù)名(相當(dāng)于C程序中的Main函數(shù)),使用WinDbg打開QS2HU4.c文件之后再加載驅(qū)動,就會在源碼中DriverEntry函數(shù)哪一行斷下。(Windbg根據(jù)符號文件找出DriverEntry函數(shù)位置~)。
六、Windbg調(diào)試驅(qū)動程序出現(xiàn)藍(lán)屏?xí)r,可以根據(jù)提示輸入并執(zhí)行!analysis -v,查看系統(tǒng)崩潰的詳細(xì)信息,比如錯誤碼C0000005代表非法內(nèi)存訪問等,雖然也能將定位到出現(xiàn)錯誤的源代碼中的行或具體的某句匯編指令,但是情景復(fù)雜的情況往往需要進(jìn)行棧回溯等等方法尋找出錯的根源。
七、Windbg中查看錯誤碼含義的指令為!error 錯誤碼。例如!error 2。
八、棧溢出主要有覆蓋返回地址、覆蓋虛表指針、覆蓋SEH異常處理鏈表等形式。
九、堆溢出一般發(fā)生在指針拆卸出錯,可造成固定地址寫任意數(shù)據(jù)、任意地址寫固定數(shù)據(jù)、任意地址寫任意數(shù)據(jù)等,目前此類型漏洞在Windows系列操作系統(tǒng)中發(fā)生的不多,在xp sp2之前的操作系統(tǒng)可以通過向系統(tǒng)關(guān)鍵地址處如進(jìn)程控制塊中的指針等。Ps:路由器操作系統(tǒng)中利用堆溢出漏洞進(jìn)行拒絕服務(wù)攻擊甚至是遠(yuǎn)程代碼執(zhí)行還很常見。
十、為了繞過Windows xp sp2及以上操作系統(tǒng)的dep保護(hù)機制,可以利用Immunity Debugger調(diào)試器的mona插件可以自動生成Rop鏈(好像是findantidep插件的升級版),當(dāng)然可能還需要進(jìn)行手工調(diào)試修正,首先把mona插件的python腳本下到手之后放到Immunity Debugger的plugin目錄下即可。
十一、在Immunity Debugger的命令行輸入!mona rop -m msvcr71.dll -n(前提是筆記十)。-m選項代表從后面的msvcr71.dll中獲取rop鏈,-n代表過濾掉null byte,也就是“X00″,避免Rop數(shù)據(jù)被類似strcpy的字符串拷貝函數(shù)拷貝時被截斷出錯,命令執(zhí)行之后就可以得到ruby、python等各種語言格式的Rop鏈啦~
十二、在使用Immunity Debugger的mona插件時,注意生成的Rop鏈中如果帶有Ascll字樣,代表構(gòu)成Rop的這些數(shù)組的每一個字節(jié)的十六進(jìn)制值都是小于0×80(128)的,也就是在Ascll字符表示范圍內(nèi),使用這種Rop鏈的一個好處就是可以避免MultiByteToWideChar和WideCharToMutiByte函數(shù)對輸入數(shù)據(jù)的ANSIC與寬字符之間的轉(zhuǎn)換,如果漏洞利用調(diào)試過程中自己的利用代碼出現(xiàn)了類似的小意外不妨從這里找找原因。
十三、IDA:有時候感覺用IDA的圖形視圖看匯編代碼真是一種享受,不過IDA的強大之處還不止此,不僅可以對字符串、函數(shù)找到其交叉參考(查看該字符串或函數(shù)的調(diào)用情況,便于追根溯源),還有出色的代碼標(biāo)注功能及N多強大的插件(⊙o⊙)哦,比如:hexray……
十四、IDA的hexray插件功能非常強大,可以將匯編代碼反編譯成的類c語言的偽代碼,用法也非常簡單:在某調(diào)用函數(shù)反匯編代碼的圖形視圖按下F5鍵就有驚喜(⊙o⊙)哦(在反匯編代碼視圖中光標(biāo)選定位置F5之后就會得到光標(biāo)所在函數(shù)的反編譯代碼),這技術(shù)還不是非常成熟,但是IDA反編譯出的結(jié)果還算準(zhǔn)確,測試時可以把int 3指令反編譯成debugbreak()。(最好不要濫用該技能,建議老老實實的看匯編代碼,慢慢打基礎(chǔ))。
十五、IDA以靜態(tài)反匯編出名,也可以進(jìn)行調(diào)試分析的,看菜單工具欄選項或F9快捷鍵體驗一下吧,個人感覺效果、功能雖不如od的動態(tài)調(diào)試,圖形視圖下的調(diào)試還算不錯的,結(jié)合Windbg調(diào)試就更爽了。。。
十六、如果一些窗體程序使用起來不合你的胃口,比如說對話框太小了、圖片太丑了,先不用考慮放棄這個程序,試試ResHacker、eXeScope等資源編輯工具吧,操作簡單,還能將一些灰色按鈕的限制功能取消掉(找到相應(yīng)的屬性,修改之后再Rebuild),也是進(jìn)行漢化操作等的利器。
十七、程序加載到內(nèi)存時需要根據(jù)導(dǎo)入表的結(jié)構(gòu)將程序運行所需要的API函數(shù)地址填充到IAT(導(dǎo)入函數(shù)地址表)的地址,程序運行時導(dǎo)入表的結(jié)構(gòu)是用不到的,所以一些外殼程序會把導(dǎo)入表結(jié)構(gòu)銷毀掉,如果在脫殼過程中對其進(jìn)行Dump內(nèi)存鏡像的操作之后,得到的程序就沒有導(dǎo)入表結(jié)構(gòu),無法提供程序運行時的API地址信息,導(dǎo)致出錯。這也就是為什么Dump內(nèi)存鏡像之后要進(jìn)行導(dǎo)入表修復(fù)操作。
十八、硬件斷點:常用的CPU都有8個調(diào)試寄存器Dr0-Dr7,其中Dr0-Dr3用于存放設(shè)置硬件斷點的地址(所以硬件斷點最多只能設(shè)置四個),Dr4-Dr5一般用于保留,Dr6-Dr7用于指示硬件斷點的設(shè)置個數(shù)及屬性(讀、寫中斷)等。