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

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

主站蜘蛛池模板: 贡嘎县| 云龙县| 崇州市| 西城区| 水城县| 武胜县| 新泰市| 滦南县| 喀喇| 巍山| 孟津县| 金华市| 安泽县| 南木林县| 北辰区| 瑞丽市| 嘉义市| 抚松县| 上林县| 瑞丽市| 中阳县| 宜春市| 贞丰县| 双辽市| 恩施市| 德安县| 和龙市| 石台县| 长沙县| 平武县| 石嘴山市| 商都县| 辽阳市| 宝山区| 庄浪县| 南丹县| 南汇区| 军事| 营山县| 崇州市| 镇江市|