- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 491字
- 2020-10-30 17:56:49
3.3 對象指針
對象指針在C和C++程序中無處不在。Kernighan和Ritchie[Kernighan 1988]對此有如下評論。
指針在C中得以大量使用,部分原因是它們通常能產生更緊湊、更高效的代碼,而用其他手段則無法做到這一點。
C和C++中的對象指針用于指向動態(tài)分配的結構、函數的引用參數、數組以及其他對象。這些對象指針可能會被攻擊者修改,比如當利用一個緩沖區(qū)溢出漏洞的時候。如果一個指針接下來被用作一個賦值操作的目的地址,那么攻擊者就可以通過控制該地址達到修改其他內存位置內容的目的,這種技術也稱為“任意內存寫”(arbitrary memory write)。
例3.3包含了一個有漏洞的程序,可以被利用來實現任意內存寫。程序第5行包含一個無界內存復制。在溢出緩沖區(qū)后,攻擊者可以覆寫ptr和val。當接下來在第6行中計算*ptr=val時,就會發(fā)生任意內存寫。另外,某些常見的動態(tài)內存管理錯誤也使攻擊者有機會修改對象指針。
例3.3 修改對象指針
1 void foo(void * arg, size_t len) { 2 char buff[100]; 3 long val = ...; 4 long *ptr = ...; 5 memcpy(buff, arg, len); 6 *ptr = val; 7 ... 8 return; 9 }
任意內存寫在32位的Intel架構(x86-32)上備受關注,因為在這種硬件環(huán)境下,sizeof(void*)、sizeof(int)、sizeof(long)都等于4字節(jié)。換句話說,在x86-32架構上,有很多機會可以將某4個字節(jié)寫入另外4個字節(jié),從而覆寫任意位置的一個地址。
推薦閱讀
- Hands-On Image Processing with Python
- 云原生Spring實戰(zhàn)
- Python金融數據分析
- Modern JavaScript Applications
- 軟件測試技術指南
- 微信小程序項目開發(fā)實戰(zhàn)
- 移動界面(Web/App)Photoshop UI設計十全大補
- Buildbox 2.x Game Development
- Python 3 數據分析與機器學習實戰(zhàn)
- 現代C:概念剖析和編程實踐
- SSH框架企業(yè)級應用實戰(zhàn)
- Microsoft HoloLens By Example
- Mastering OpenStack
- Sitecore Cookbook for Developers
- Kohana 3.0 Beginner's Guide