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