官术网_书友最值得收藏!

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的示例程序中展示的變量在這兩種操作系統中遵循同樣的分配模式。

[1] BSS是“符號開始的塊”(block started by symbol)的縮寫,但全稱很不常用。
主站蜘蛛池模板: 甘洛县| 额济纳旗| 神木县| 修武县| 宜昌市| 岳西县| 通化市| 澜沧| 鹿泉市| 平乐县| 垫江县| 特克斯县| 巴中市| 克东县| 安岳县| 泾川县| 宁陵县| 固原市| 遂川县| 阜新| 平乡县| 晋宁县| 大城县| 常宁市| 阿勒泰市| 泽州县| 兰考县| 乌什县| 泗水县| 雷波县| 会理县| 方城县| 栾川县| 孙吴县| 台前县| 巩留县| 天峻县| 关岭| 福海县| 萨迦县| 盈江县|