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

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  }

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

主站蜘蛛池模板: 洪雅县| 芜湖县| 嘉黎县| 盘山县| 石台县| 龙泉市| 通河县| 布尔津县| 聂拉木县| 合水县| 麟游县| 汉川市| 大丰市| 桃园市| 托克逊县| 塘沽区| 湟中县| 庆城县| 莱阳市| 大同市| 神农架林区| 全南县| 图木舒克市| 盱眙县| 吉安市| 辛集市| 梅河口市| 奈曼旗| 泾阳县| 南京市| 巴青县| 手游| 抚州市| 岳池县| 彝良县| 鄂尔多斯市| 扶沟县| 平顶山市| 寻甸| 霍山县| 乌海市|