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

3.2 函數指針

雖然棧溢出(連同很多基于堆的攻擊)不可能發生于數據段(data segment)中,但是覆寫函數指針在任何內存段中都會發生。

例3.2包含了一個有漏洞的程序,其BSS段中的一個函數指針可以被覆寫。第3行聲明的靜態字符數組buff和第4行聲明的靜態函數指針funcPtr都是未初始化的,并且存儲于BSS段中。第6行對strncpy()的調用是對有界字符串復制函數的非安全調用的演示。當argv[1]的長度大于BUFFSIZE的時候,就會發生緩沖區溢出。這個緩沖區溢出漏洞可以被利用來將函數指針值覆寫為外殼代碼的地址,從而將程序的控制權轉移到任意的代碼。當程序執行到第7行、執行由funcPtr標識的函數時,外殼代碼將會取代good_function()得以執行。

例3.2 BSS段中導致緩沖區溢出的程序漏洞


1  void good_function(const char *str) {...}
2  int main(int argc, char *argv[]) {
3    static char buff[BUFFSIZE];
4    static void (*funcPtr)(const char *str);
5    funcPtr = &good_function;
6    strncpy(buff, argv[1], strlen(argv[1]));
7    (void)(*funcPtr)(argv[2]);
8  }

有一個樸素的緩沖區溢出緩解策略是將棧緩沖區重新聲明為全局靜態變量或局部靜態變量,以降低棧溢出攻擊的可能性。然而,將緩沖區重新聲明為全局變量并不是一個完備的解決方案,因為我們已經看到,數據段內同樣可能出現可利用的緩沖區溢出漏洞。

主站蜘蛛池模板: 辰溪县| 弥勒县| 梁山县| 富顺县| 壤塘县| 建平县| 娱乐| 仁化县| 左权县| 临夏县| 高安市| 万山特区| 泰和县| 绵阳市| 横山县| 容城县| 长宁县| 米泉市| 乐亭县| 社会| 阳山县| 安塞县| 昭觉县| 南和县| 仁怀市| 中宁县| 阆中市| 鱼台县| 锦州市| 营口市| 津市市| 成武县| 叙永县| 揭东县| 晴隆县| 桑植县| 柯坪县| 长垣县| 武穴市| 阳原县| 余干县|