- 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é),從而覆寫任意位置的一個地址。
推薦閱讀
- Practical Data Analysis Cookbook
- Java EE 6 企業(yè)級應用開發(fā)教程
- 深入淺出Java虛擬機:JVM原理與實戰(zhàn)
- PostgreSQL Replication(Second Edition)
- PLC編程與調試技術(松下系列)
- PHP 7+MySQL 8動態(tài)網站開發(fā)從入門到精通(視頻教學版)
- Learning Continuous Integration with TeamCity
- OpenStack Networking Essentials
- Python編程:從入門到實踐(第3版)
- 監(jiān)控的藝術:云原生時代的監(jiān)控框架
- Practical Predictive Analytics
- Instant Pygame for Python Game Development How-to
- Apache Solr for Indexing Data
- 高性能MVVM框架的設計與實現:San
- 歐姆龍PLC編程指令與梯形圖快速入門