0day_軟件漏洞分析技術-筆記1-PE文件與虛擬內存之間的映射

PE文件與虛擬內存之間的映射

PE(portable executable)是win32平臺下可執行文件遵守的數據格式。常見的如:“*.exe”、“.bat”等文件都是PE文件。
PE文件格式把可執行文件分成若干個數據節(section),一個典型的PE文件中包含如下:
.text:由編譯器產生,存在着二進制機器代碼,也是反彙編和調試的對象。
.data:初始化的數據塊,如宏定義,全局變量之類的。
.idata:可執行文件所用的動態鏈接庫等外來函數與文件信息。
.rsrc:存放程序的資源,如圖標,菜單等。

在調試漏洞的時候,會經常做這兩種操作:
1、靜態反彙編工具看到的PE文件中的某條指令的位置是相對於磁盤文件而言的,即所謂的文件偏移,還需要知道這條指令在內存所處的位置,虛擬內存地址(VA)。
2、在調試看到的某條指令的地址是虛擬內存地址,需要回到PE文件中找到這條指令對應的機器碼。
爲了完成以上兩個操作,必須清楚PE文件和虛擬內存地址之間的映射關係。
1、文件偏移地址(File Offest)
數據在PE文件中的地址叫文件偏移地址,但叫做文件地址更加容易理解。這是文件在磁盤上存放時相對於文件開頭的偏移。
2、裝載基地址(Image Base)
PE裝入內存時的基地址。默認情況下,EXE文件在內存中的基地址是0x00400000,DLL文件是0x10000000。這些位置可以通過修改編譯器選項更改。
3、虛擬內存地址(Virtual Address,VA)
PE文件中的指令被裝入內存後的地址。一般PE文件的0字節將對映射到虛擬內存的0x00400000位置,這個地址是所謂的裝載基址
4、相對虛擬地址(Relative Virtual Address,RVA)
相對虛擬地址是內存地址相對於映射基地址的偏移量。
虛擬內存地址,映射基址,相對虛擬內存地址三者之間有如下關係:
虛擬內存地址=裝載基址+相對虛擬地址
VA=Image Base+RVA

左邊是磁盤數據格式,右邊是內存數據格式

1、PE文件中的數據按照磁盤數據標準存放,以0x200字節爲基本單位進行組織。當一個數據節(section)不足0x200字節時,不足的地方將被0x00填充;當一個數據節超過0x200字節時,下一個0x200塊將分配給這個節使用。因此PE數據節的大小永遠是0x200的整數倍。
2、當代碼裝入內存後,將按照內存數據標準存放,並以0x1000字節位基本單位進行組織。類似的,不足將被補全,若超出將分配下一個0x1000爲其所用。因此,內存中的節總是0x1000的整數倍。

在這裏插入圖片描述

表中所列出的文件偏移地址和RVA之間的對應關係可以讓大家更直接地理解這種“細微的差異”。
我們把這種由存儲單位差異引起的節基址差稱作節偏移,在上例中:
.text節偏移=0x1000-0x400=0xc00
.rdata節偏移=0x7000-0x6200=0xE00
.data節偏移=0x9000-0x7400=0x1C00
.rsrc節偏移=0x2D000-0x7800=0x25800
文件偏移地址與虛擬內存地址之間的換算關係可以用下面的公式來計算。
文件偏移地址=虛擬內存地址(VA)-裝載基址(Image Base)-節偏移
文件偏移地址=RVA-節偏移

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章