逆向工程核心原理 第十六章

2022-08-23 23:42:15 字數 1334 閱讀 9009

第十六章,pe檔案重定位。向程序的虛擬記憶體載入pe檔案時,檔案會被載入到pe頭的imagebase所指向的位址處,若ib位置已經載入了其他檔案,pe裝載器就會將其載入到去其他未被占用的空間,這就涉及到pe位址重定位的問題。

建立好程序之後,exe檔案會首先載入到記憶體,因此在exe檔案無需考慮位址重定位問題

aslr安全機制:每次執行時exe檔案都會被載入到隨機位址。

此機制也適用於dll/sys檔案,對於個os的主要系統dll,微軟會根據不同版本分別賦予不同的ib位址。同意系統的kernel32.dll、user32.dll等會被載入到自身固有的ib,所以系統的dll實際上並不會發生重定位問題。

在應用程式中查詢硬編碼的位址位置

讀取值後,減去imagebase(va->rva)(原本這些值是以ib為基準的硬編碼值)

加上實際載入的位址(rva->va)

基址重定位表的位址位於pe頭的datadirectory陣列的第六個元素

基址重定位表是乙個image_base_relocation結構體陣列

成員:例:

rva資料

注釋0002f000

00001000

virtualaddress

0002f004

00000150

sizeofblock

0002f008

3420

typeoffset

0002f00a

342d

typeoffset

0002f00c

3436

typeoffset

......

...注釋:rva是在檔案當中這些資料所儲存的rva,注釋是自己加的,檔案裡是沒有的

解讀:virtualaddress成員的值為1000,說明typeoffset陣列的基準位址為rva1000,sizeofblock的值為150,typeoffset陣列的大小(不是長度)為150。typeoffset的值為2b大小,是由4位的type與12位的offset合成的,如3420--->

型別(4位)

偏移(12位)

3420

低12位的偏移才是真正的位移,它是基於va成員的偏移,因此

rva = virtualsize + offset

等程式真正在記憶體中執行時,rva=1420的位址處所存的硬編碼位址,就會被替換成新的位址。

注釋:typeoffset項中指向位移的低12位所擁有的最大位址值為1000,為了表示更大的位址,要新增乙個與其對應的塊(使用結構體的原因),這些塊以陣列形式羅列(就是結構體陣列),故稱為重定位表。

第十六章 tcp wrappers

在伺服器向外提供的tcp服務上包裝一層安全檢測機制。外來連線請求首先通過這個安全檢測,獲得安全認證後才可被系統服務接受。hosts.allow hosts.deny 在配置檔案中為各服務分別定義訪問控制規則實現訪問控制,檔案中的規則是即時生效的。配置檔案語法 1 daemon list client...

第十六章 執行緒棧

1 基礎 1 執行緒初始化時,執行緒棧預設1m,所有頁面都是page readwrite屬性,但只為前兩個頁面調撥了物理儲存器,位址低的那個頁面叫防護頁面,為其指定了page guard屬性 2 當執行緒訪問到防護頁面時,由於指定了page guard屬性,系統會得到通知,系統會為防護頁面的下乙個頁...

第十六章 控制迴圈

第十六章 控制迴圈 16.1 選擇迴圈的種類 1.在大多數語言中,你只能用到少數幾種迴圈 1 計數迴圈 執行次數一定。2 連續求值的迴圈 預先並不知道將要執行多少次,它會在每次迭代時檢查是否應該結束。3 無限迴圈 一旦啟動就一直執行下去。4 迭代器迴圈 對容器類裡面的每個元素執行一次操作。2.什麼時...