緩衝區溢出攻擊實戰

一、   實驗目的

通過實驗,使我們對緩衝區溢出攻擊的原理更加了解,對此攻擊方式更加得心應手。

二、   實驗原理

當向緩衝區裏寫入的數據超過了爲其分配的大小時,就會發生緩衝區溢出。攻擊者可以利用緩衝區溢出來竄改進程運行時棧,從而改變程序的正常流向。

三、   實驗分析

1)  main函數在調用f函數前,首先將參入的參數壓入棧中;

2)  接着,將當前程序執行的下一個的位置EIP加入棧中,後面f函數返回時用;

3)  進入f函數,f函數首先將當前的EBP壓入棧中,接着mov esp, ebp(將EBP指向當前的棧頂),接着以EBP爲基礎構建自己的函數幀結構。函數幀結構中包含當前函數的局部變量(攻擊的示例程序的buffer變量及在這裏面)

4)  在f函數執行完成後,會將棧中的EBP值彈出,恢復到EBP寄存器中,還原ESP寄存器,接着彈出EIP變量,程序根據EIP變量指向的位置接着執行main函數後面的程序部分。

圖1

main函數調用f函數的棧結構如下圖所示:

圖2

對buf進行數據拷貝,得到的結果如下圖所示:

圖3

四、   實驗步驟

首先,就像教程上做的,將32位編程的一些庫加進去:

圖4

圖5

圖6

接下來進入正題,進入32位linux環境,使用bash:

圖7

使用地址空間隨機化來隨機堆與棧的初始地址使得我們猜測準確的內存地址非常困難,因此我們關閉這一功能:

圖8

接下來編寫stack相信大家都會了,實驗教程中也有,因此這裏就不再貼出來,編譯程序,設置SET-UID:

圖9

接下來是寫攻擊程序,將stack.c和exploit.c都存放在tmp中,tmp文件夾可以在主文件夾中搜索到,在exploit.c中“\x??\x??\x??\x??”處需要添上shellcode保存在內存中的地址,因爲發生溢出後這個位置剛好可以覆蓋返回地址。而strcpy(buffer+100,shellcode); 這一句又告訴我們,shellcode保存在 buffer+100 的位置。現在我們要得到shellcode在內存中的地址,輸入命令:

圖10

 

結果顯示:

圖11

接下來按照教程:

圖12

 

根據語句strcpy(buffer+100,shellcode); 我們計算shellcode的地址爲 0xffffd010(十六進制)+100(十進制)=0xffffd074(十六進制)

現在修改exploit.c文件!將 \x??\x??\x??\x?? 修改爲 \x74\xd0\xff\xff

編譯exploit.c並且進行攻擊:

圖13

產生段錯誤,這裏使我非常苦惱,然後我就進行了測試:

圖14

圖15

圖16

圖17

在此終於找到問題,在stack.c中我打錯了一個單詞:badfile,使得我大動干戈,首先我定位到了fread的問題,那肯定是有什麼地址溢出或者是訪問出現了越界之類的問題,然後我努力的查看了exploit.c發現一點問題都沒有,就再運行了一遍發現warning中問題出現在了stack.c,這告訴我們每一個warning都是致命的。

圖18

接下來,重新計算地址:

圖19

然後開始緩衝區溢出攻擊:

圖20

出現的fault不要怕,重新編譯一下stack.c就OK了。

第二個實驗則重新開始即可,地址需要重新查看與計算:

 

圖21

發現出現段錯誤(這是本階段實驗出現的正確的實驗結果):

圖22

第三個實驗還是重新開始,但是這次不加以下代碼:

圖23

進行相同操作發現可以成功顯示root:

圖24

最後附上改地址的操作圖片:

圖25

 

五、   實驗總結

1)     通過這次的實驗,使得我對緩衝區的溢出攻擊的原理更加明白了,本來上課聽的有些模糊,經過這次上網上搜索資料和進行實驗,讓我對這個實驗更加了解;

2)     通過這次實驗,讓我對bug調試更加得心應手,當時我總是產生段錯誤,然後我就在網上搜索解決的辦法和容易出現此類錯誤的地方,然後通過命令我定位到了錯誤地點,訪問的內存地址不存在,然後我檢查了代碼編譯出現的warning,發現一個單詞打錯了,最終解決問題。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章