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

 

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

 

執行結果。

 

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

 

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

 

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

 

正常的執行結果。

 

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

 

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

 

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

 

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

 

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

 

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

文章標籤
全站熱搜
創作者介紹
創作者 卑微研究生 的頭像
卑微研究生

卑微研究生的部落格

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