- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 437字
- 2020-10-30 17:56:49
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 }
有一個樸素的緩沖區溢出緩解策略是將棧緩沖區重新聲明為全局靜態變量或局部靜態變量,以降低棧溢出攻擊的可能性。然而,將緩沖區重新聲明為全局變量并不是一個完備的解決方案,因為我們已經看到,數據段內同樣可能出現可利用的緩沖區溢出漏洞。
推薦閱讀
- Data Visualization with D3 4.x Cookbook(Second Edition)
- Spring Cloud Alibaba核心技術與實戰案例
- 算法訓練營:入門篇(全彩版)
- Koa開發:入門、進階與實戰
- Visual C++數字圖像處理技術詳解
- Linux操作系統基礎案例教程
- JavaCAPS基礎、應用與案例
- QlikView Unlocked
- Hack與HHVM權威指南
- 計算機組裝與維護(第二版)
- Tableau Dashboard Cookbook
- 金融商業數據分析:基于Python和SAS
- C# 10核心技術指南
- Learning Zimbra Server Essentials
- jQuery Essentials