2009-07-13 134 views
49

編程中堆棧溢出和緩衝區溢出有什麼不同?堆棧溢出和緩衝區溢出有什麼區別?

+5

有趣的是,堆棧溢出是緩衝區溢出的一個特例。 :hmm: – 2009-08-27 02:50:19

+3

他他..堆棧溢出reefers到網站,緩衝區溢出不... – Xinus 2009-12-30 16:59:31

+0

@Spencer Ruport爲什麼這將在Meta? – orokusaki 2010-02-05 02:06:34

回答

121

堆棧溢出特指當執行堆棧增長超出爲其保留的內存時的情況。例如,如果你調用一個遞歸調用自己而沒有終止的函數,那麼當每個函數調用創建一個新的棧幀時,你將會導致一個堆棧溢出,堆棧最終將消耗比爲其保留的內存更多的內存。

緩衝區溢出是指任何情況下,程序寫入超出分配給任何緩衝區(包括在堆上,而不是在堆棧上)的內存末端。例如,如果您從堆中分配的數組的末尾寫入,則會導致緩衝區溢出。

5

stackoverflow是當一個線程的堆棧大小超過該線程的最大允許堆棧大小。

當值被寫入當前未被程序分配的內存中時,發生緩衝區溢出。

11

堆棧溢出:你已經把太多的東西在棧上分配給當前線程

緩衝區溢出內存:您已經超出了當前分配的緩衝區的大小,並沒有重新調整它以適應(或不能再調整它)。

3

緩衝區溢出通常代表隨時內存緩衝區被超越它的界限訪問是否棧或堆。堆棧溢出意味着堆棧已經超過了它的分配限制,並且大多數機器/操作系統正在堆上運行。

18

關鍵的區別是知道堆棧和緩衝區之間的差異。

堆棧是執行程序執行的空間。當你調用一個函數時,它的參數和返回信息被放置在堆棧上。

緩衝區是用於單一目的的通用內存塊。例如,一個字符串是一個緩衝區。它可以通過向字符串寫入比分配的更多數據來運行。

3

你是不是故意說「棧和緩衝區有什麼區別?」 - 這會讓你更快地獲得更多見解。一旦你得到了那麼多,那麼你可以考慮這些東西溢出意味着什麼。

0

大多數提到緩衝區溢出的人都意味着棧溢出。但是,溢出可能發生在任何區域,而不僅限於堆棧。如堆或bss。堆棧溢出僅限於覆蓋堆棧上的返回地址,但不覆蓋返回地址的正常溢出可能會覆蓋其他本地變量。

1

1.基於堆棧的緩衝區溢出 •當一個程序寫入到預定的數據結構外的程序調用堆棧上的存儲器地址好發 - 固定長度緩衝器中。 •基於堆棧的編程特性 1.「堆棧」是分配自動變量的內存空間。 2.函數參數在堆棧上分配,不會被系統自動初始化,所以在初始化之前它們會有垃圾。 3.函數完成其循環後,將刪除對堆棧中變量的引用。 (即,如果多次調用函數,則在每次調用和退出函數時都會重新創建和刪除其局部變量和參數。)
•攻擊者利用基於堆棧的緩衝區溢出來以各種方式覆蓋程序
1 。一個局部變量,靠近棧中內存中的緩衝區,以改變可能有利於攻擊者的程序行爲。
2.在堆棧幀中返回地址。一旦函數返回,執行將在攻擊者指定的返回地址恢復,通常是用戶輸入填充的緩衝區。 3.一個函數指針或異常處理程序,隨後執行。 •克服漏洞利用的因素有:
1.地址中的空字節 2. shell代碼位置的變化 3.環境之間的差異Shell代碼是用於利用軟件漏洞的一小段代碼。

2.堆緩衝區溢出

•發生在堆數據區。 •當應用程序將更多數據複製到緩衝區中而不是緩衝區設計爲包含時發生溢出。 •如果將數據複製到緩衝區而未事先驗證該源是否適合目標,則容易被利用。 •基於堆棧和基於堆的編程的特性: •當分配動態對象時,「堆」是一個「自由存儲」,即內存空間。 •堆是動態分配new(),malloc()和calloc()函數的內存空間。 •動態創建的變量(即聲明的變量)在執行前在堆上創建並存儲在內存中,直到對象的生命週期完成。 •執行開發 •破壞數據以覆蓋內部結構,例如鏈接列表指針。 •指針交換重寫程序功能