我的第乙個緩衝區溢位

2021-08-07 09:03:17 字數 834 閱讀 4725

從乙個玩具函式開始:

gets函式:會讀取輸入的內容直到遇到換行或eof停止,gets(buffer)而讀取到的內容去了buffer陣列;

在不進入另乙個call的情況下buffer算是臨時變數,存在堆疊中 o(∩_∩)o。

這裡是乙個程式的源**和彙編**

儲存返回位址

把ebp設為棧基位址,esp為偏移位址

棧16位元組對齊,編譯的時候優化的吧  對齊訪問效率高一些

給棧分配空間(60個位元組)(不清楚是0x60個位元組還是0x60+2個位元組,如果是0x60的話esp本身指向的額位址不就算是棧外面了)

棧頂空間設定為0(modified為0這個棧頂存放的應該就是modified了,c語言中的int型資料64位系統下,採用64位編譯器進行編譯處理時,發生變化的變數型別是:long。)

(1c-5c=40十進位制64)這句是把buffer複製到eax   這裡buffer陣列是esp+1c開始向低位址處延伸到esp+5c

把eax複製到esp指向的位置

call  gets

比較0x00和esp+0x5c(modified)

分析到這裡就夠了,我要做的就是把輸入的字元足夠多,多到64位填滿再多把modified的空間覆蓋掉

gdb命令

disas main  執行main函式

r              run

b  ****x  下斷點

x  $esp+0x5c  檢視這個位址的堆疊

ni 單步步過

si 單步步入

堆疊的緩衝區溢位

我們在做專案的過程中遇到過乙個問題 開啟底層板卡,對板卡進行讀寫的時候,板卡的控制代碼莫名奇妙改變了,而我們沒有顯式改變過它。其實這是一類問題,就是區域性變數莫名其妙被修改。這是由於堆疊的緩衝區溢位造成的,主要現象是 1.某些區域性變數莫名其妙被改 2.函式返回的時候崩潰 主要原因是 1.陣列越界 ...

簡單的緩衝區溢位

這是乙個簡單的緩衝區溢位程式,是我在oday上面學到的,嘿嘿嘿,每個人寫的shellcode不一樣所以實現的目的也不一樣。大家自由發揮吧。include include include include define password 1234567 int verify password char ...

寫入到a時緩衝區溢位 一文理解緩衝區溢位

緩衝區溢位 對現代作業系統與編譯器來講已經不是什麼大問題,但是作為乙個合格的 c c 程式設計師,還是完全有必要了解它的整個細節。電腦程式一般都會使用到一些記憶體,這些記憶體或是程式內部使用,或是存放使用者的輸入資料,這樣的記憶體一般稱作緩衝區。簡單的說,緩衝區就是一塊連續的計算機記憶體區域,它可以...