第十六章,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.什麼時...