pwn入門之二 緩衝溢位

2021-08-29 18:50:38 字數 1854 閱讀 5379

pwn入門二:緩衝溢位

環境:cenos6.5 64位,安裝了 gcc的32位編譯庫,cenos執行於文字模式,搭建方法見博文《pwn入門之一:搭建64位centos6.5虛擬機器 》。

一、建立 test1.c,內容如下:

#include

main()

可以不必去理解這段**的含義,只要無誤的輸入就可以了,理解了**反而不利於理解pwn技術。

二、編譯生成可執行檔案test1

用以下命令

gcc -m32 -o test1 test1.c

可生成test1檔案。

三、執行test1

用./test1命令執行之,程式要求鍵盤輸入,輸入一些字元後回車,可發現當輸的內容的長度大於10,且第11個字元 不為『a』時,提示成功資訊,否則提示失敗資訊。

四、用gdb分析test1

執行gdb test1命令,出現(gdb)提示符,輸入disas main命令,顯示main函式的彙編**,如下圖所示:

**中有兩處出現put@plt,這是輸出的語句,我們兩來看看這兩個語句前放入棧頂的是什麼,

輸入 x /s 0x80484f4 命令,顯示「try again.」如下圖:

可知,如攻擊不成功時會執行第11條語句 即

movl $804841f4,(%esp)

輸入 x /s 0x80484ff 命令,顯示「you've pwned it.」如下圖:

可知,如果攻擊成功,一定會執行第14條語句即

movl $804841ff,(%esp)

再看第10條語句,當0x1f(%esp)不等於0x61時就會執行第14條語句。

但在第5條語句,已將0x61賦值給了0x1f(%esp)了。

再看第6、7,8條語句,將這個位址放入棧頂,然後再呼叫gets@plt,這說明此時的輸入的內容將被放入0x15(%esp)及以後的記憶體單元中,但0x15(%esp)剛好在0x1f(%esp)前面10個單元的位置上,所以當輸入的字元數為10個時,0x1f(%esp)將為置為『0x00』,0x1f(%esp)r的值就不等於0x61了,這時攻擊就成功了,另外,當輸入的字元數大於10個時,第11個字元就會覆蓋0x1f(%esp),當這個字元不是『a』時,0x1f(%esp)r的值也就不等於0x61了,這時攻擊就成功了。

來驗證一下。

我們在第7個語句後設定乙個斷點,然後執行程式,到達斷點後逐條執行,觀察用鍵盤輸入一些字元後0x15(%esp)到0x1f(esp)的記憶體單元的值的變化。如下圖:

如其中的標示,在輸入10個a字元之前,$esp+0x15至$esp+0x1e的值分別為0x83,0x04,0x08,0x4b,0x84,0x04,0x08,0xf4,0x0f,0x7a,而$esp+0x1f的值為0x61.

輸入10個a字元之後,$esp+0x15至$esp+0x1e的值均為0x61,而$esp+0x1f的值變為了0x00,

依上法,我們重新做一次實驗,這次我們輸入10個a和1個b,情況如下:

這次我們發現$esp+0x1f的值變為了0x62,再而$esp+0x20的值則變成為0x00.

這就驗證了我們的想法,由此設計攻擊的方法,如下:

但當輸入的第10個字為a時,失敗,如下圖:

什麼是緩衝區溢位 (二)

要知道什麼是緩衝區溢位,首先要知道什麼是緩衝區,緩衝區,簡單說來是一塊連續的計算機記憶體區域,可以儲存相同資料型別的多個例項。你一定用strcpy拷貝過字串吧?那,如果拷貝時目的字串的緩衝區的長度小於源字串的長度,會發生什麼呢?對,源字串中多餘的字元會覆蓋掉程序的其它資料。這種現象就叫緩衝區溢位。根...

緩衝區溢位攻擊 入門例子原理分析

在通過了基本的測試程式後,開始分析其原理。本問的內容還是主要參考 先回顧下一些基礎 匯程式設計序快速入門 32位 程式記憶體空間分配 函式幀結構 現代高階語言c c 程式裡每個函式對應乙個函式幀結構 在棧中 在呼叫乙個函式前,會在棧中儲存一些資料,在跳轉到新的函式時,新的函式首先建立自己的幀結構,接...

PL SQL程式設計入門之二

pl sql 的異常處理 根據exception 來進行異常處理 pl sql 的begin 和end 之間發生的異常通過在這個塊中定義的 exception 來處理。同一塊中沒有異常處理定義的情況下,則引用上層的意外處理。例如雖然捕捉了異常,但是在異常處理部分什麼也沒寫的情況下什麼也不會發生。但是...