1概念
-
ELF。Exucutable and Linkable Format,譯為“可執行和可鏈接的格式”。
它是關於可執行文件、對象代碼、共享庫和內核導出的一種公共標准文件的格式定義,廣泛應用於類unix系統。每個ELF文件由三個部分組成:Program header table、Sectoin header table、Data referred to above。
-
PIC。Position-Independent Code,譯為“位置無關代碼”。
在計算機系統中,PIC是可以在主存中不同位置執行的目標代碼。PIC經常被用在共享庫中,這樣就能將相同的庫代碼為每個程序映射到一個位置,不用擔心覆蓋掉其他程序或共享庫。 -
PIE。Position-Independent Executable,譯為“位置無關可執行程序”。
它是完全由位置無關代碼所組成的可執行二進制文件,有時可稱為PIC Executable。它有一個顯著的優點,那就是當程序加載時,所有PIE二進制文件以及它所有的依賴都會加載到虛擬內存空間中的隨機位置(隨機地址),可以有效提高他人通過絕對地址實施"return-to-libc"安全攻擊的難度。 -
GOT。Global Offset Table。全局偏移量表。
它是數據字段的地址存儲表。它被可執行程序用於查看全局變量的運行時地址,這些變量的地址在編譯階段是未知的。在進程引導階段,動態鏈接器會更新GOT。 -
PLT。Procedure Linkage Table。過程鏈接表
它將位置無關的的函數調用轉換為絕對地址。形象的比喻,PLT像蹦床一樣,將對共享函數的調用彈向正確的方向。 -
Lasy Loading/Lasy Binding。延遲加載。
在位置無關代碼PIC中一般不能包含動態鏈接庫中符號的絕對地址。當運行某個調用動態庫函數符號的用戶態程序時,用戶態程序在編譯鏈接階段並不知曉該符號的具體位置,只有等到運行階段,動態加載器將所需要的共享庫加載到內存后,才最終確定符號的地址。而在編譯階段所有與位置無關的函數調用都將被保存到ELF文件的過程鏈接表PLT(Procedure Linkage Table)中。
2 引用
- [1].非常詳細的介紹了FPIC的原理,PLT與GOT
- [2].gcc 編譯工具(上)— 編譯過程和原理淺析
- [3].Return-to-libc attack
- [4].GOT和PLT示例1
- [5].GOT和PLT示例2