從乙個玩具函式開始:
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 程式設計師,還是完全有必要了解它的整個細節。電腦程式一般都會使用到一些記憶體,這些記憶體或是程式內部使用,或是存放使用者的輸入資料,這樣的記憶體一般稱作緩衝區。簡單的說,緩衝區就是一塊連續的計算機記憶體區域,它可以...