- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 899字
- 2020-10-30 17:56:49
3.1 數據位置
有大量的漏洞利用代碼可以用來覆寫函數指針或對象指針,其中包括緩沖區溢出。
緩沖區溢出通常是由邊界不足的循環引起的。通常,有以下這些循環類型:
由上界限制的循環:循環重復執行N次,其中N小于或等于p的邊界,指針指定一系列對象,例如,從p到p+N-1。
由下界限制的循環:循環重復執行N次,其中N小于或等于p的邊界,指針指定一系列對象,例如,從p到p-N+1。
由數組的末元素地址(又名Hi)限制的循環:循環遞增一個間接的指針,直到它等于Hi。
由數組的首元素地址(又名Lo)限制的循環:循環遞減一個間接的指針,直到它等于Lo。
由空終止符限制的循環:循環遞增一個間接的指針,直到它的目標為空。
要使這些循環類型的緩沖區溢出能被用于覆寫函數指針或對象指針,下列條件必須同時成立。
1.緩沖區與目標函數指針或者對象指針必須分配在同一個段內。
2.對于由上界限制的循環、由Hi限制的循環,或由空終止符限制的循環,緩沖區必須位于比目標函數指針或者對象指針更低的內存地址處。對于由下界限制的循環或由Lo限制的循環,緩沖區必須位于比目標函數指針或者對象指針更高的內存地址處。
3.該緩沖區必須是界限不充分的,因此容易被緩沖區溢出利用。
要確定緩沖區和目標函數或者對象指針是否位于同一段內,首先必須了解不同的變量類型是如何在不同的內存段中分配的。
UNIX可執行文件包含data段和BSS [1]段。data段包含了所有已初始化的全局變量和常數。BSS段包含了所有未初始化的全局變量。將已初始化和未初始化變量分開是為了讓匯編器不將未初始化的變量內容(BSS段)寫入目標文件中。
例3.1展示了一個變量的聲明及其存儲位置的關系。代碼中的注釋說明了每一個變量的存儲空間分別分配在哪里。
例3.1 數據聲明和進程內存組織
01 static int GLOBAL_INIT = 1; /* 數據段, 全局 */ 02 static int global_uninit; /* BSS 段, 全局 */ 03 04 int main(int argc, char **argv) { /* 棧, 局部 */ 05 int local_init = 1; /* 棧, 局部 */ 06 int local_uninit; /* 棧, 局部 */ 07 static int local_static_init = 1; /* 數據段, 局部 */ 08 static int local_static_uninit; /* BSS 段, 局部 */ 09 /* buff_ptr 的存儲空間是棧, 局部 */ 10 /* 分配的內存是堆, 局部 */ 11 int *buff_ptr = (int *)malloc(32); 12 }
雖然UNIX和Windows的內存組織有很多不同之處,但例3.1的示例程序中展示的變量在這兩種操作系統中遵循同樣的分配模式。
- Production Ready OpenStack:Recipes for Successful Environments
- Cassandra Design Patterns(Second Edition)
- 征服RIA
- Java設計模式及實踐
- Jupyter數據科學實戰
- 可解釋機器學習:模型、方法與實踐
- 低代碼平臺開發實踐:基于React
- 動手學數據結構與算法
- Canvas Cookbook
- 測試架構師修煉之道:從測試工程師到測試架構師
- 數據分析與挖掘算法:Python實戰
- Practical Maya Programming with Python
- 算法秘籍
- MySQL數據庫應用實戰教程(慕課版)
- Visual FoxPro程序設計實驗教程