- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 1039字
- 2020-10-30 17:56:49
3.5 全局偏移表
Windows和Linux在庫函數的鏈接和控制轉移方面使用了類似的機制。從安全的角度來看,二者主要的區別在于Linux使用的方法是可被利用的,而Windows則不然。
Linux、Solaris2.x和SVR4使用的默認二進制格式稱為可執行和鏈接格式(Executable and Linking Format,ELF)。ELF最初由UNIX系統實驗室(UNIX System Laboratories,USL)作為二進制應用程序接口(Application Binary Interface,ABI)的一個部分開發并發布。近來,工具接口標準(Tool Interface Standards,TIS) [1]委員會采納了ELF標準,將其作為多種x86-32操作系統上的可移植目標文件格式。
任何ELF的二進制文件的進程空間中,都包含一個稱為全局偏移表(Global Offset Table,GOT)的區。GOT存放絕對地址,從而使得地址可用,并且不會影響位置獨立性和程序代碼的可共享性。要使得動態鏈接的進程能夠工作,這個表是必不可少的。該表的實際內容和形式取決于處理器的型號[TIS 1995]。
程序使用的每一個庫函數在GOT中都擁有一個入口項,GOT中包含有實際函數的地址。這使得很容易在進程內存中對庫函數進行重定位。在程序首次使用一個函數之前,該入口項包含有運行時鏈接器(RunTime Linker,RTL)的地址。如果該函數被程序調用,則程序的控制權被轉移到RTL,然后函數的實際地址被確定且被插入到GOT中。接下來就可以通過GOT中的入口項直接調用函數,而跟RTL就無關了。
在ELF可執行文件中GOT入口項的地址是固定的。這就導致對任何可執行進程映像而言GOT入口項都位于相同的地址。如例3.6所示,可以利用objdump命令查看某一個函數的GOT入口項的位置。為每一個R_386_JUMP_SLOT重定位記錄指定的偏移量,包含了指定函數(或RTL鏈接函數)的地址。
例3.6 全局偏移表
% objdump --dynamic-reloc test-prog format: file format elf32-i386 DYNAMIC RELOCATION RECORDS OFFSET TYPE VALUE 08049bc0 R_386_GLOB_DAT __gmon_start__ 08049ba8 R_386_JUMP_SLOT __libc_start_main 08049bac R_386_JUMP_SLOT strcat 08049bb0 R_386_JUMP_SLOT printf 08049bb4 R_386_JUMP_SLOT exit 08049bb8 R_386_JUMP_SLOT sprintf 08049bbc R_386_JUMP_SLOT strcpy
攻擊者可以利用任意內存寫將一個函數的GOT入口項覆寫為外殼代碼的地址。這樣,當程序調用對應于被改寫的GOT入口項的函數時,程序的控制權就被轉移到外殼代碼。例如,每一個編寫良好的C程序最后都會調用exit()函數,因此,只要覆寫了exit()的GOT入口項,就可以在exit()被調用時將程序的控制權轉移到指定的地址。ELF過程鏈接表(Procedure Linkage Table,PLT)具有類似的問題[Cesare 2000]。
Windows PE(Portable Executable,可移植的可執行)文件格式扮演著與ELF格式相似的角色。PE文件中包含一個數據結構數組,每一項對應一個導入的DLL。每一項都包含有導入的DLL的名稱以及一個指向函數指針數組的指針(即導入地址表,Import Address Table,IAT)。每一個被導入的API在IAT中都有自己的保留槽,由Windows載入器為其填充導入函數的地址。一旦一個模塊被載入,IAT就保存了需要調用的導入函數的地址。IAT的入口項是寫保護的,因為它們在運行時無須修改。
- Microsoft Application Virtualization Cookbook
- BeagleBone Media Center
- Learning ArcGIS Pro
- TypeScript實戰指南
- The Professional ScrumMaster’s Handbook
- 零基礎學Kotlin之Android項目開發實戰
- 持續集成與持續交付實戰:用Jenkins、Travis CI和CircleCI構建和發布大規模高質量軟件
- RocketMQ實戰與原理解析
- Application Development with Parse using iOS SDK
- .NET 4.0面向對象編程漫談:應用篇
- Python預測分析實戰
- Java EE項目應用開發
- 絕密原型檔案:看看專業產品經理的原型是什么樣
- 區塊鏈:技術與場景
- Twitter Bootstrap Web Development How-to