1 棧溢位的利用

2022-09-12 18:00:19 字數 2939 閱讀 3756

1.程序使用的記憶體都可以按功能大致分為以下4個部分:

(1)**區:這個區域儲存著被裝入執行的二進位制機器**,處理器會到這個區域取指並執行。

(2)資料區:用於儲存全域性變數等。

(3)堆區:程序可以在堆區動態地請求一定大小的記憶體,並在用完之後還給堆區。動態分配和**是堆區的特點。

(4)棧區:用於動態地儲存函式之間的呼叫關係,以保證被呼叫函式在返回時恢復到母函式中繼續執行。

2.win32系統提供兩個特殊的暫存器用於標識位於棧系統頂端的棧幀。

(1)esp:棧指標暫存器,其內存放著乙個指標,改指標永遠指向系統棧最上面的乙個棧幀的棧頂。

(2)ebp:基址指標暫存器,其內存放著乙個指標,改指標永遠指向系統棧最上面乙個棧幀的底部。

乙個棧溢位利用實驗

今天看了乙個關於溢位的小實驗,挺好玩的,於是自己也想玩玩,首先看看這個實驗的原始碼。

我們準備在password.txt檔案中植入二進位制的機器碼,在password.txt攻擊成功時,密碼驗證程式應該執行植入**,並在桌面上彈出乙個訊息框顯示「failwest」字樣.

首先我們要完成的幾項工作:

(1)分析並除錯漏洞程式,獲得淹沒返回位址的偏移。

(2)獲得buffer的起始位址,並將其寫入password.txt的相應偏移處,用來沖刷返回位址。

(3)向password.txt中寫入可執行的機器**,用來呼叫api彈出乙個訊息框。

如果在password.txt中寫入恰好44個字元,那麼第45個隱藏截斷符null將沖掉authenticated,低位元組中的1,從而突破密碼證的限制。

正如我們所料,authenticated被沖刷後,程式直接進入驗證通過的分支。

(1)buffer陣列的起始位址位0x0018fb44

(2)password.txt檔案中第53~56個字元的ascll碼將寫入棧幀的返回位址,成為函式返回後執行的指令位址。

用組合語言呼叫messageboxa需要3個步驟:

(1)裝載動態鏈結庫user32.dll。messageboxa是動態鏈結庫user32.dll的倒出函式。

(2)在組合語言中呼叫這個函式需要獲得這個函式的入口位址。

(3)在呼叫前需要向棧中按從右向左的順序壓入messageboxa。

為了讓植入的機器**更加簡潔明瞭,我們在實驗準備中構造漏洞程式的時候已經人工載入了user32.dll這個庫,多以可以不用考慮第一步。

messageboxa的入口引數可以通過user32.dll在系統中載入的基址和messageboxa在庫中的偏移相加得到。(具體可以使用vc自帶工具「dependency  walker「獲得這些資訊)

好吧 ,我的vc沒有這個功能,只有在od中去找了。

入口位址=7599fd1e

將以下彙編**一十六進製制形式抄入password.txt。

第53~56位元組為buffer的起始位址,最後儲存,當再次開啟程式的時候

果然和我們預想的一樣,出現了對話方塊,點選確定後程式就會崩潰。

到此就全部結束了,最重要的地方就是messageboxa的位址和buffer的起始位址,並且buffer的起始位址要恰好覆蓋掉第53~56個字元棧幀的返回位址。

棧溢位和棧記憶體溢位

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

棧溢位,記憶體溢位

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

堆溢位利用

0x1 申請 0x2 使用 0x3 釋放 堆塊包括塊首與塊身 返回的指標指向 塊首是乙個堆塊頭部的幾個位元組,用來標識這個堆塊自身的資訊。未被占用的堆區 被占用的堆區 位於堆區的起始位置,堆表分為兩種空閒雙向鍊錶freelist 空表 128條 和快速單向鍊錶lookaside 快表 最多只有四項 ...