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

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é),從而覆寫任意位置的一個地址。

主站蜘蛛池模板: 虎林市| 临湘市| 兴宁市| 枞阳县| 普定县| 北安市| 沈丘县| 邹城市| 天柱县| 嘉黎县| 清流县| 乌苏市| 利津县| 哈密市| 巴南区| 武清区| 沂水县| 泰和县| 洪江市| 宜兰县| 庐江县| 神农架林区| 常山县| 高雄市| 通榆县| 喜德县| 乌审旗| 万山特区| 澄江县| 泊头市| 黔江区| 望谟县| 乃东县| 应城市| 理塘县| 宜川县| 清徐县| 滦南县| 余姚市| 修水县| 兰考县|