1、緩衝區概念
緩衝區(buffer)又稱為快取,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。
使用緩衝區有兩個好處:
1、減少實際物理讀寫次數
2、緩衝區在建立時就被分配記憶體,這塊記憶體區域一直被重用,可以減少動態分配和**記憶體的次數
比如我們從磁碟裡取資訊,我們先把讀出的資料放在緩衝區,計算機再直接從緩衝區中取資料,等緩衝區的資料取完後再去磁碟中讀取,這樣就可以減少磁碟的讀寫次數,再加上計算機對緩衝區的操作大大快於對磁碟的操作,故應用緩衝區可大大提高計算機的執行速度。
比如從網上下電影,你不能下一點點資料就寫一下硬碟,而是積攢一定量的資料以後一整塊一起寫,不然硬碟都要被你玩壞了
假設要實現乙個功能:接受使用者鍵入的字串,並賦值給乙個字串變數其過程如下:
1:在記憶體中開闢乙個」鍵盤緩衝區「接受使用者鍵入的字串
2:把緩衝區中的字串copy到程式中定義的字串變數指向的記憶體空間(也就是賦值過程)
也就是說,為了完成最終目標:把字串放入字串變數指向的空間,需要暫時把字串放入「鍵盤緩衝區」的空間。
這裡,緩衝區解決的問題不是「時間」,而是「空間」,為資料找乙個暫存地。
所以,緩衝區就是一塊記憶體區,它用在輸入輸出裝置和cpu之間,用來快取資料。它使得低速的輸入輸出裝置和高速的cpu能夠協調工作,避免低速的輸入輸出裝置占用cpu,解放出cpu,使其能夠高效率工作。
2、緩衝區溢位概念
緩衝區溢位,簡單的說就是計算機對接收的輸入資料沒有進行有效的檢測(理想的情況是程式檢查資料長度並不允許輸入超過緩衝區長度的字元),向緩衝區內填充資料時超過了緩衝區本身的容量,而導致資料溢位到被分配空間之外的記憶體空間,使得溢位的資料覆蓋了其他記憶體空間的資料。作業系統所使用的緩衝區,又被稱為「堆疊」,在各個操作程序之間,指令會被臨時儲存在「堆疊」當中,「堆疊」也會出現緩衝區溢位。所以,棧溢位是緩衝區溢位的一種。
3、棧溢位
棧溢位指的是程式向棧中某個變數中寫入的位元組數超過了這個變數本身所申請的位元組數,因而導致與其相鄰的棧中的變數的值被改變。棧溢位漏洞輕則可以使程式崩潰,重則可以使攻擊者控制程式執行流程。此外,我們也不難發現,發生棧溢位的基本前提是
-程式必須向棧上寫入資料。
-寫入的資料大小沒有被良好地控制。
棧溢位中比較重要的幾個步驟
輸出:
確定填充長度
這一部分主要是計算我們所要操作的位址與我們所要覆蓋的位址的距離。常見的操作方法就是開啟 ida,根據其給定的位址計算偏移。一般變數會有以下幾種索引模式
相對於棧基位址的的索引,可以直接通過檢視ebp相對偏移獲得
相對應棧頂指標的索引,一般需要進行除錯,之後還是會轉換到第一種型別。
直接位址索引,就相當於直接給定了位址。
一般來說,我們會有如下的覆蓋要求
覆蓋函式返回位址,這時候就是直接看 ebp 即可。
覆蓋棧上某個變數的內容,這時候就需要更加精細的計算了。
覆蓋 bss 段某個變數的內容。
根據現實執**況,覆蓋特定的變數或位址的內容。
參考網頁:
緩衝區溢位 棧
正義與 共存,推動正義的進步,正義迫使 的昇華,兩者誰是誰非。是非只是它人的定義,兩者都是正確的 在我們除錯程式的時候,我們如何去掉除錯視窗中的cccc 的內容。第一步 開啟專案屬性 c c 生成 基本執行時檢查設定為 未初始化的變數 安全檢查 否 第二步 開啟專案屬性 聯結器 高階 隨機基址為 否...
Kali 棧緩衝區溢位
堆疊記憶體是執行時實時分配的 與棧溢位有關的暫存器主要是esp,ebp,eip。esp和ebp都是用於控制當前執行函式棧幀的暫存器。ebp指向棧幀最高記憶體位址,esp指向棧幀最低記憶體位址。棧幀 棧幀中存放著函式的引數,區域性變數,及恢復前乙個棧幀所需要的資料。一旦函式執行完畢,整個棧幀就會被復原...
緩衝區溢位
緩衝區溢位是指當電腦程式向緩衝區內填充的資料位數超過了緩衝區本身的容量。溢位的資料覆蓋在合法資料上。理想情況是,程式檢查資料長度並且不允許輸入超過緩衝區長度的字串。但是絕大多數程式都會假設資料長度總是與所分配的儲存空間相匹配,這就為緩衝區溢位埋下隱患。作業系統所使用的緩衝區又被稱為堆疊,在各個操作程...