-----根據(jù)自己的理解和《0day安全》總結(jié)下
??? pe(可執(zhí)行文件)常見(jiàn)的便是 .exe和 .dll文件
?? 可執(zhí)行文件中不光有機(jī)器代碼,還有可以幫助我們定位的字符串胸蛛,菜單羽嫡,圖標(biāo)這些。PE格式規(guī)定了所有的這些信息在文件中應(yīng)該如何組織。當(dāng)文件載入的時(shí)候各拷,操作系統(tǒng)會(huì)按照PE文件格式的規(guī)定去相應(yīng)的地方準(zhǔn)確定位各種類型的資源,并分別裝入內(nèi)存的不同區(qū)域襟锐。
?? PE文件格式
? pe文件有著我們常說(shuō)的數(shù)據(jù)節(jié)撤逢。
?.text 編譯器產(chǎn)生,存放著二進(jìn)制代碼粮坞,我們反編譯調(diào)試一般都是在這里蚊荣。
.data 初始化的數(shù)據(jù)塊,儲(chǔ)存著宏定義莫杈,全局變量互例,靜態(tài)變量這些。
.idata 可執(zhí)行文件的動(dòng)態(tài)鏈接庫(kù)
.rsrc 存放著程序的圖標(biāo)筝闹,菜單這些媳叨。可以改著玩关顷。
(ps:當(dāng)然這都是正常情況下糊秆,當(dāng)作者不想讓我們看到程序里面的內(nèi)容,便會(huì)加殼议双。這些東西并不會(huì)影響程序的執(zhí)行痘番,但會(huì)pe文件變得非常難受,給反編譯平痰,調(diào)試造成很大的難度汞舱。而且更有一些會(huì)把關(guān)鍵函數(shù)放到服務(wù)器上,用戶拿到的僅僅只是交互的東西宗雇。這樣破解難度會(huì)更大昂芜。)
虛擬內(nèi)存
?? windows上的內(nèi)存分為物理內(nèi)存,和虛擬內(nèi)存赔蒲。物理內(nèi)存這內(nèi)核級(jí)別的東西我就不了解了泌神,ring0層良漱,目前只知道使用icesoft進(jìn)行調(diào)試。這個(gè)調(diào)試器很霸道腻扇,使用的時(shí)候會(huì)獨(dú)占cpu债热,還能更改內(nèi)核的東西。我之前好奇用了一下幼苛,很開(kāi)心窒篱,電腦藍(lán)屏沒(méi)商量。
?? 虛擬內(nèi)存是我們用戶看到的級(jí)別舶沿,我們調(diào)試器看到的便是虛擬內(nèi)存墙杯。比如說(shuō)電腦的內(nèi)存是4GB,但可能內(nèi)存條只有512MB括荡。這用到的便是內(nèi)存管理器高镐,具體到怎么實(shí)現(xiàn)的,可以看看那些算法畸冲,聽(tīng)名字都頭疼嫉髓。
?? 但是我們讓每個(gè)進(jìn)程都相信自己有殼4GB的運(yùn)行空間,但應(yīng)該沒(méi)幾個(gè)進(jìn)程上來(lái)就用這么多邑闲。所以內(nèi)存管理器給的便是“虛擬地址”算行,進(jìn)程們都認(rèn)為這些地址是可以訪問(wèn)的。
? 《0day安全》有很形象的描述
? 如果我們把這看成銀行苫耸,那么就很好理解了州邢。
?---進(jìn)程相當(dāng)于儲(chǔ)戶
---內(nèi)存管理器相當(dāng)于銀行
---物理內(nèi)存相當(dāng)于鈔票
---虛擬內(nèi)存相當(dāng)于存款
?? 當(dāng)進(jìn)程不需要內(nèi)存的時(shí)候那些內(nèi)存可以分給其它進(jìn)程,相當(dāng)于存在銀行中褪子。銀行等著其它需要內(nèi)存的人來(lái)取走量淌。那些虛擬地址就相當(dāng)于鈔票上的編號(hào),我們只要去的現(xiàn)金就好嫌褪。并不會(huì)對(duì)上面的號(hào)碼有什么感想呀枢。我們實(shí)際物理地址遠(yuǎn)小于虛擬地址之和,相對(duì)的銀行也不會(huì)有那么多錢(qián)讓所有用戶來(lái)同時(shí)去笼痛。當(dāng)兩者往往都會(huì)正常運(yùn)行著硫狞。
PE文件與虛擬內(nèi)存的映射
?? 我們調(diào)試的時(shí)候會(huì)經(jīng)常說(shuō)到文件地址這些,對(duì)于我們來(lái)說(shuō)不存在可能這個(gè)說(shuō)法晃痴,只能準(zhǔn)確的找到位置才能到達(dá)控制,破解的目的财忽。
VA:虛擬內(nèi)存地址倘核,也就是我們ida看到的那些地址
既然物理和虛擬之間存在著映射,我們便需要在PE文件中找到文件地址即彪。
===文件偏移地址 File Offset
數(shù)據(jù)在PE文件中的地址叫文件偏移地址
===裝載基址 Image Base
? PE裝入內(nèi)存時(shí)的基地址紧唱,默認(rèn)情況下EXE內(nèi)存的基地址是0x00400000,DLL文件是0X10000000
===虛擬內(nèi)存地址 Virtual Address,VA
PE文件中的指令被裝入內(nèi)存后的地址
?===相對(duì)虛擬地址 Relative Virtual Address,RVA
虛擬內(nèi)存地址活尊,映射基址,相對(duì)虛擬內(nèi)存地址三者關(guān)系
VA=Image+RVA
?? 文件偏移是相對(duì)于文件從0字節(jié)開(kāi)始的偏移漏益,RVA是相對(duì)于裝載基址0x00400000處的偏移蛹锰。
? 注意:pe文件中的數(shù)據(jù)是按照磁盤(pán)標(biāo)準(zhǔn),以0x200(512)字節(jié)為基本單位绰疤。如果數(shù)據(jù)節(jié)不足則用00補(bǔ)全铜犬,內(nèi)存中則是按照0x1000(1024)為基本單位。
? 使用PE Editor轻庆,dependencly可以查看各個(gè)字節(jié)癣猾。根據(jù)公式,我們可以計(jì)算文件中的偏移位置余爆,在文件中直接進(jìn)行更改或者pwn纷宇。
?現(xiàn)在遇到了需要許多計(jì)算地址的ctf,先把這些基本的搞清楚蛾方。