- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 932字
- 2020-10-30 17:56:49
3.6 .dtors區
任意內存寫攻擊的另外一個目標是覆寫由GCC生成的可執行文件的.dtors區中的函數指針[Rivas 2001]。GNU C允許程序員利用__attribute__關鍵字后跟一個包含于雙括號中的屬性修飾符來聲明函數的屬性[FSF 2004]。屬性修飾符包括constructor和destructor。constructor屬性指示函數在main()之前被調用,destructor屬性則表示函數將在main()執行完成后或exit()被調用后進行調用。
例3.7所示的程序展示了constructor和destructor屬性的用法。該程序包含3個函數:main()、create()和destroy()。第4行聲明的create()函數是一個構造函數,第5行聲明的destroy()函數則是一個析構函數。這兩個函數都沒有被main()調用,main()只是打印了兩個函數的地址然后就退出了。例3.8展示了示例程序的執行結果。顯然,create()首先執行,然后是main(),最后才是destroy()。
例3.7 具有constructor和destructor屬性的程序
01 #include <stdio.h> 02 #include <stdlib.h> 03 04 static void create(void) __attribute__ ((constructor)); 05 static void destroy(void) __attribute__ ((destructor)); 06 07 int main(void) { 08 printf("create: %p.\n", create); 09 printf("destroy: %p.\n", destroy); 10 exit(EXIT_SUCCESS); 11 } 12 13 void create(void) { 14 puts("create called.\n"); 15 } 16 17 void destroy(void) { 18 puts("destroy called."); 19 }
例3.8 示例程序的輸出
% ./dtors create called. create: 0x80483a0. destroy: 0x80483b8. destroy called.
構造函數和析構函數分別存儲于生成的ELF可執行映像的.ctors和.dtors區中。這兩個區都具有如下的布局形式:
0xffffffff { 函數地址 } 0x00000000
.ctors和.dtors區映射到進程地址空間后,默認屬性為可寫。漏洞利用程序從未利用過構造函數,因為它們都在main()函數之前執行。結果,攻擊者的興趣都集中到了析構函數和.dtors區上。
如例3.9所示,可以使用objdump命令檢查可執行映像中.dtors區中的內容,我們可以看到頭、尾標簽,以及destroy()函數的地址(采用小端格式)。
例3.9 .dtors區的內容
1 % objdump -s -j .dtors dtors 2 3 dtors: file format elf32-i386 4 5 Contents of section .dtors: 6 804959c ffffffff b8830408 00000000
攻擊者可以通過覆寫.dtors區中的函數指針的地址從而將程序控制權轉移到任意的代碼。如果攻擊者能夠讀取到目標二進制文件,那么通過分析ELF映像,很容易就能確定要覆寫的確切位置。
有趣的是,即使沒有指定任何析構函數,.dtors區仍然存在。在這種情況下,該區中只含有頭、尾標簽而中間沒有函數地址。不過,仍然可以通過將尾標簽0x00000000覆寫為攻擊者提供的外殼代碼的地址,從而將控制轉移過去。如果外殼代碼返回,則進程將會繼續調用接下來的函數直到遇到尾標簽或發生錯誤為止。
對于攻擊者而言,覆寫.dtors區的好處在于該區總是存在并且會映射到內存中 [1]。當然,dtors僅存在于用GCC編譯和鏈接的程序中。有時候,很難找到合適的外殼代碼注入點,使得在main()退出后外殼代碼仍然能夠駐留在內存中。
- Android開發精要
- Java編程指南:基礎知識、類庫應用及案例設計
- Java從入門到精通(第4版)
- Web Application Development with R Using Shiny(Second Edition)
- 深入淺出Android Jetpack
- 機械工程師Python編程:入門、實戰與進階
- 人工智能算法(卷1):基礎算法
- 深入解析Java編譯器:源碼剖析與實例詳解
- Android應用開發實戰(第2版)
- OpenCV 3.0 Computer Vision with Java
- Android編程權威指南(第4版)
- 金融商業數據分析:基于Python和SAS
- Java核心編程
- Bitcoin Essentials
- Mastering Node.js