下面是一段包含緩衝區溢位的**:
#include using namespace std;
void attacker()
{ cout<<"attacker is running."<
該程式的執行結果如下:
可以看到,主函式中並沒有呼叫attacker這個函式,但是在執行時卻看到了attacker這個函式在執行,這就是我通過構造緩衝區溢位來實現的。原本子函式leak_func()執行完之後應當返回主函式並執行下一條語句,此時我卻通過溢位覆蓋了子函式的返回指令,而且通過計算使得原本返回指令的位置被attacker函式的首位址所覆蓋。那麼程式就直接執行到了我精心構造的位置,假如這個位置是一段惡意**,那麼造成的損失是難以估量的。
下面我將針對上述**手工構造乙個棧來解釋緩衝區溢位問題的原理。
attacker:0x4013ee;leak_func:0x401421;main:0x401458。
程式開始時,我們先為陣列attack_data[10]申請空間,由於是int型,所以共申請了40個位元組的空間。然後我們開始對前三個陣列成員賦值,此時的棧大概如下所示:
esp41
42
43
44
41
42
43
44
00
40
13
ee
……此處為剩餘的七個未賦值陣列成員
ebp
注:每個記憶體單元為乙個位元組,此處ebp和esp應佔兩個記憶體單元,為了簡化所以並未畫出。
接下來就要進入leak_func()函式了,在該函式中,我們只開闢了乙個char型的,有四個陣列成員的函式。因為char型資料只佔乙個位元組,所以整個陣列的大小為4位元組,而我們之前所輸入的3個int型的引數佔了12個位元組。很明顯,我們所申請的陣列空間不足以存放我們傳入的引數,系統會將我們的int型引數分割成4個char型放入陣列中。當子函式開始時,我們的編譯器會在記憶體中再開闢乙個棧幀,根據**,開闢的棧幀如下:
esp
local[0]
local[1]
local[2]
local[3]
這裡代表四個記憶體單元,儲存著整型變數i
ebp
返回位址(eip...)
從這裡我們可以看到,local陣列佔了4個記憶體單元,正好儲存了attack_data[0],接下來就出現了溢位,整型變數i被attack_data[0]所覆蓋.ebp是棧底指標,佔16位,eip儲存著返回主函式的位址,也佔16位,可是此時ebp和eip已經被引數attack_data[2]所覆蓋,丟失了返回主函式的位址,而且,此時ebp與eip中儲存的是函式attacker的首位址,所以該函式結束後並不返回主函式,而是直接前往了attacker函式。設想一下,假如attacker函式是一段惡意**,那麼你的計算機就很有可能已經被人控制了。
人們為了防止緩衝區溢位攻擊已經做出了很多努力。比如讓編譯器去檢查有沒有溢位情況,但是讓編譯器去做這件事意味著犧牲c++最引以為傲的效率,所以我認為這塊工作還是要交給程式設計師去完成。還有就是記憶體位址隨機化的方式。假如記憶體位址隨機化的話,我上面寫的那個程式就起不到效果了,因為我沒法提前去預知記憶體中函式位址的情況。據我所知,linux系統已經完全記憶體位址隨機化了,每次執行程式時,程式所在的記憶體位址都不相同,而且我在自己的虛擬機器下測試了,結果的確如此。而windows下似乎並沒有應用這一技術,我連續執行發現位址都相同,而且重啟之後的記憶體位址也相同,這也是linux比windows安全的一大證據吧。當然了,高階的病毒都是利用各種系統檔案作為跳板來執行它想要執行的**的,令人防不勝防。
雖然我們想了各種辦法來抵禦快取區溢位攻擊,但是黑客們總能想到辦法來破解,更何況現在安全並沒有被大部分人所重視起來。
乙個小程式的棧溢位
看下面 include int cp char p int main else return 0 在vs2008下面建個工程,我輸入 1234567 的時候輸出是 congralations 程式是正確的,但是當我輸入是 12345678 的時候,崩潰了,於是我把gs關了,結果輸出竟然也是 cong...
乙個小程式的棧溢位
看下面 include int cp char p int main else return 0 在vs2008下面建個工程,我輸入 1234567 的時候輸出是 congralations 程式是正確的,但是當我輸入是 12345678 的時候,崩潰了,於是我把gs關了,結果輸出竟然也是 cong...
乙個簡單的verlig程式 乙個簡單C程式的介紹
我們前面學了c語言的一些理論知識,今天通過乙個簡單的程式先來看一看c語言程式是什麼樣子。然後再對程式中的 進行介紹。這個語句的功能是進行有關的預處理操作。include稱為檔案包含命令,後面尖括號的內容稱為標頭檔案或首檔案。此處指包含stdio.h系統標頭檔案,在下面主函式中使用的printf 函式...