緩衝區溢位(Buffer Overflow)是相當常見的攻擊手法,可以說透過此手法破解軟體的比例高達八成(立委調)。以下圖來說明它的理論,在程式中呼叫函式時,會將要返回的位址塞入堆疊中,也就是ESP值,然後是EBP值、函式中的變數。如果能覆寫掉ESP值,將它指向惡意程式碼,就能達到破解或攻擊的目的。

 2012-03-08_224944

以下面C++程式碼為例,這裡宣告了兩個陣列,大小各為2。

2012-03-08_110535

 

執行結果。

2012-03-08_110557

 

如果我刻意存取陣列外的元素,例如intArray2[3],會發生什麼事呢?

2012-03-08_110621

 

執行結果如下,可以發現intArray裡的元素竟然被更動了。再對照前面的堆疊示意圖,只要算準Return Address放在哪,再加以更改,整個動作就算完成了。

2012-03-08_110634

 

接下來是下列程式碼,函式的參數是一個字串,函式裡有一個大小為2的buffer,在這裡就單純的把str複製進buffer變數裡。

2012-03-08_113132

 

正常的執行結果。

2012-03-08_113416

2012-03-08_113430

 

接下來這個函式,姑且當作是駭客要執行的惡意程式。

2012-03-08_113450

 

接下來,這裡故意塞進超過buffer大小的字串,並且結尾塞入惡意程式的指標位址。

2012-03-08_113611

 

執行結果如下,除了印出輸入值,還執行到了惡意程式。

2012-03-08_113630

 

所以在一般的C++程式中,如果很注意安全性,儘量用STL的vector來取代傳統陣列。

2012-03-08_113757

 

除此之外,現在編譯器也有檢查的功能,以VC++為例,將下列兩個選項打開。

2012-03-08_113916

 

一旦遇到類似的狀況,是會直接丟出Exception的。

2012-03-08_113947

全站熱搜

卑微研究生 發表在 痞客邦 留言(1) 人氣()