《軟體漏洞分析技術》筆記
pe檔案:
pe(portable executable)是win32平台下可執行遵守的資料格式。平時常見的比如*.exe和*.dll都是pe檔案。
可執行檔案:包含二進位制**,字串,選單,圖示,位圖字型等。
執行時作業系統會按pe檔案的約定定位資源並裝載入記憶體。可執行檔案 ——>拆分——>若干資料節
典型pe檔案通常包含:.text(編譯器產生,存放二進位制**, 反彙編和除錯的物件)、.data(初始化資料塊)、.idata(使用的外來函式如動態鏈結庫與檔案資訊)、.rsrc(存放程式資源),還包括其他如.reloc、.edata、.tls、.rdata
等。虛擬記憶體:
windows記憶體:1.物理記憶體層面;2.虛擬記憶體層面。
物理記憶體通常核心級別ring0才能看到;通常使用者模式下看見的為windows使用者態記憶體對映機制
下的虛擬記憶體。
記憶體管理器可以使程序在實際只有512mb物理記憶體的情況下使程序「認為」自己擁有4gb記憶體(其中包括**, 棧空間,資源區,動態鏈結庫等)。
這種情況和實際生活中銀行相似,你需要用的錢其實並不等於你擁有的財富,銀行實際存有的金額數小於所有儲戶的財富和。
那萬一有使用者需要取出超出實際金額數怎麼辦,作業系統原理中有「虛擬記憶體」概念, 即在這種情況下有時會將「部分硬碟空間」暫時作為記憶體使用。(兩者「虛擬記憶體「概念物件不一,不宜混淆)
pe檔案與虛擬記憶體之間的對映
(1).檔案偏移位址(file offset):資料在pe檔案中的位址,在磁碟上存放時相對於檔案開頭的偏移。
(2).裝載基址(image base):pe裝入記憶體時的基位址。預設exe檔案在記憶體中的基位址為0x00400000,dll為0x10000000。當然位置可由編譯選項更改。
va、image base、rva之間關係:
va = image base + rva;
可理解為: 實際 = 基點 + 位移.
裝載pe檔案時,檔案偏移位址(磁碟上)與rva(記憶體上)有很大一致性(作業系統會盡量保持pe中各資料結構),那同樣會有細微差異,由檔案資料和記憶體資料的存放單位不同造成。
在pe檔案中,以磁碟資料標準存放(我們知道硬碟以乙個section為基本單位,即512byte),0x200位元組,當乙個資料節不足0x200位元組時填充0x00;
而在記憶體中,則以0x1000位元組(4byte)為基本單位進行組織,其他與前者類似。
在進行file offset和va換算時,會由儲存單位引起節基址差稱為節偏移。比如:
則有:
那麼就可以計算出:
fileoffset = va - image base -節偏移
= va - image base - (相對虛擬偏移量 - 檔案偏移量)
按上表,比如計算虛擬記憶體中0x00404141處的一條指令,要換算出該指令在檔案中的偏移量:
檔案偏移量 = 0x00404141 - 0x00400000(預設的image base)-(0x1000 - 0x400)(**存於.text檔案中) = 0x3541
二進位制檔案
本質上是文字檔案是把檔案資訊先轉化成以字元編碼的ascii碼,再儲存ascii的二進位制 而二進位制檔案是直接把檔案資訊編碼成二進位制儲存。因此在讀取的時候要考慮記憶體中二進位制 應該怎麼樣解釋。二進位制檔案的讀取是是要告訴元素的型別 編碼方式 文字檔案則預設為char型別。文字檔案是一種特殊的二進...
二進位制檔案
二進位制檔案 也叫型別檔案 二進位制檔案是由一批同一型別的資料組成的乙個資料序列,就是說乙個具體的二進位制檔案只能存放同一種型別的資料。type tmember record name string 10 email string 20 posts longint end var members a...
二進位制檔案
二進位制檔案 也叫型別檔案 二進位制檔案是由一批同一型別的資料組成的乙個資料序列,就是說乙個具體的二進位制檔案只能存放同一種型別的資料。type tmember record name string 10 email string 20 posts longint end var members a...