close
緩衝區溢位(Buffer Overflow)是相當常見的攻擊手法,可以說透過此手法破解軟體的比例高達八成(立委調)。以下圖來說明它的理論,在程式中呼叫函式時,會將要返回的位址塞入堆疊中,也就是ESP值,然後是EBP值、函式中的變數。如果能覆寫掉ESP值,將它指向惡意程式碼,就能達到破解或攻擊的目的。
以下面C++程式碼為例,這裡宣告了兩個陣列,大小各為2。
執行結果。
如果我刻意存取陣列外的元素,例如intArray2[3],會發生什麼事呢?
執行結果如下,可以發現intArray裡的元素竟然被更動了。再對照前面的堆疊示意圖,只要算準Return Address放在哪,再加以更改,整個動作就算完成了。
接下來是下列程式碼,函式的參數是一個字串,函式裡有一個大小為2的buffer,在這裡就單純的把str複製進buffer變數裡。
正常的執行結果。
接下來這個函式,姑且當作是駭客要執行的惡意程式。
接下來,這裡故意塞進超過buffer大小的字串,並且結尾塞入惡意程式的指標位址。
執行結果如下,除了印出輸入值,還執行到了惡意程式。
所以在一般的C++程式中,如果很注意安全性,儘量用STL的vector來取代傳統陣列。
除此之外,現在編譯器也有檢查的功能,以VC++為例,將下列兩個選項打開。
一旦遇到類似的狀況,是會直接丟出Exception的。
全站熱搜
留言列表