- 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 }
有一個樸素的緩沖區溢出緩解策略是將棧緩沖區重新聲明為全局靜態變量或局部靜態變量,以降低棧溢出攻擊的可能性。然而,將緩沖區重新聲明為全局變量并不是一個完備的解決方案,因為我們已經看到,數據段內同樣可能出現可利用的緩沖區溢出漏洞。
推薦閱讀
- C++案例趣學
- INSTANT OpenCV Starter
- Drupal 8 Blueprints
- 自制編譯器
- Java從入門到精通(第4版)
- 從0到1:HTML+CSS快速上手
- Effective Python Penetration Testing
- D3.js 4.x Data Visualization(Third Edition)
- Visual C#通用范例開發金典
- Kotlin開發教程(全2冊)
- Cocos2d-x Game Development Blueprints
- Python:Deeper Insights into Machine Learning
- Scratch·愛編程的藝術家
- R的極客理想:量化投資篇
- Building Web and Mobile ArcGIS Server Applications with JavaScript(Second Edition)