棧溢位攻擊c語言 棧溢位攻擊

2021-10-19 23:58:50 字數 939 閱讀 1582

我們先來看下面的乙個例子:

#include

int main();

gets(str);

printf("str: %s\n", str);

return 0;

在 main() 函式內部定義乙個字元陣列,並通過 gets() 為它賦值。

在vs2010 debug模式下執行程式,當輸入的字元不超過10個時,可以正確輸出,但是當輸入的字元過多時,就會出現執行時錯誤。例如輸入"12345678901234567890",就會出現下面的錯誤:

!(這是為什麼呢?我們不妨先來看一下 main() 函式的棧:

!(區域性陣列也是在棧上分配記憶體,當輸入"12345678901234567890" 時,會發生陣列溢位,占用「4位元組空白記憶體」、「old ebp」和「返回位址」所在的記憶體,並將原有的資料覆蓋掉,這樣當 main() 函式執行完成後,會取得乙個錯誤的返回位址,該位址上的指令是不確定的,或者根本就沒有指令,所以程式在返回時出錯。

c語言不會對陣列溢位做檢測,這是乙個典型的由於陣列溢位導致覆蓋了函式返回位址的例子,我們將這樣的錯誤稱為「棧溢位錯誤」。

> 注意:這裡所說的「棧溢位」是指棧上的某個資料過大,覆蓋了其他的資料

區域性陣列在棧上分配記憶體,並且不對陣列溢位做檢測,這是導致棧溢位的根源。除了上面講到的 gets() 函式,strcpy()、scanf() 等能夠向陣列寫入資料的函式都有導致棧溢位的風險。

下面是使用 strcpy() 函式導致棧溢位的例子:

#include

#include

int main();

strcpy(str2, str1);

printf("str: %s\n", str2);

return 0;

將 str1 複製到 str2,顯然超出了 str2 的接受範圍,會發生溢位,覆蓋返回位址,導致 main() 函式返回時出錯。

shellshock溢位攻擊

實驗背景 2014年9月24日,bash中發現了乙個嚴重漏洞shellshock,該漏洞可用於許多系統,並且既可以遠端也可以在本地觸發。在本實驗中,需要親手重現攻擊來理解該漏洞,並回答一些問題。什麼是shellshock shellshock,又稱bashdoor,是在unix中廣泛使用的bash ...

棧溢位和棧記憶體溢位

棧記憶體溢位是指使用者棧的大小最多為8 10mb,分配超過棧大小的變數則會導致棧記憶體溢位。如char c 1024102411 11mb 棧溢位指的是程式向棧中某個變數中寫入的位元組數超過了這個變數本身所申請的位元組數,因而導致與其相鄰的棧中的變數的值被改變。如char c 10 memset c...

棧溢位,記憶體溢位

對於一台伺服器而言,每乙個使用者請求,都會產生乙個執行緒來處理這個請求,每乙個執行緒對應著乙個棧,棧會分配記憶體,此時如果請求過多,這時候記憶體不夠了,就會發生棧記憶體溢位。棧溢位是指不斷的呼叫方法,不斷的壓棧,最終超出了棧允許的棧深度,就會發生棧溢位,比如遞迴操作沒有終止,死迴圈。可以把記憶體比作...