20212923 2021-2022-2 《網絡攻防實踐》第九次作業
實踐九:軟件安全攻防--緩衝區溢出和shellcode
課程:《網絡攻防實踐》
班級: 2129
姓名: 王文彬
學號:20212923
實驗教師:王志強
實驗日期:2022年5月13日
必修/選修: 選修
一.實踐內容
1. 實踐要求介紹
-
本次實踐的對象是一個名爲pwn1的linux可執行文件。
-
該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。
-
該程序同時包含另一個代碼片段,getShell,會返回一個可用Shell。正常情況下這個代碼是不會被運行的。我們實踐的目標就是想辦法運行這個代碼片段。我們將學習兩種方法運行這個代碼片段,然後學習如何注入運行任何Shellcode。
-
動手實踐任務一
- 任務:手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
-
動手實踐任務二
- 任務:利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
-
動手實踐任務三
- 任務:注入一個自己製作的shellcode並運行這段shellcode。
緩衝區溢出
- 知識點總結:
-
緩衝區溢出是指當計算機向緩衝區填充數據時超出了緩衝區本身的容量,溢出的數據覆蓋在合法數據上。主要危害有以下亮點:
- 1、程序崩潰,導致拒絕服務
- 2、跳轉並且執行一段惡意代碼
- 原因在於程序中沒有仔細檢查用戶輸入。
-
緩衝區:緩衝區可以理解爲一段可讀寫多內存區域,緩衝區攻擊的最終目的就是希望系統能執行這塊可讀寫內存中已經被蓄意設定好的惡意代碼。
-
按照馮·諾依曼存儲程序原理,程序代碼是作爲二進制數據存儲在內存的,同樣程序的數據也在內存中,因此直接從內存的二進制形式上是無法區分哪些是數據哪些是代碼的,這也爲緩衝區溢出攻擊提供了可能。
-
最常見的手段是通過製造緩衝區溢出使程序運行一個用戶shell,再通過shell執行其它命令。如果該程序屬於root且有suid權限的話,攻擊者就獲得了一個有root權限的shell,可以對系統進行任意操作了。
任務一:手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數
(1)首先我們先利用objdump命令對於pwn1程序進行反編譯,查看getShell函數、main函數和foo函數。
從上圖中可以看出0x8048491-0x80484ba=0xffffffffffffffd7,和圖中main函數中地址爲0x80484b5顯示一樣,因此我們只要把d7變爲getshell函數的地址就可以實現攻擊,因此我們計算0x804847d-0x80484ba=0xffffffffffffffc3,把d7換成c3就可以實現。
(2)利用vim編輯器進行修改
(3)打開文件後顯示的亂碼文檔,我們利用%!xxd命令進行16進制的轉化,轉換成我們可以看懂的文檔,如下圖:
(4)找到d7的位置進行修改,修改爲c3,如下圖:
(5)然後保存後退出運行,發現運行以後出現$,進入shell,攻擊成功。
任務二:利用foo函數的Bof漏洞,構造返回地址
(1)首先在gdb調試中藉助一個足夠長的參數去試,藉助debug工具才能看出那部分數據是溢出的。
裏面用到info命令查看eip寄存器(返回地址)的值,注意到0x35就是‘5’的ascll碼,因此可以確定地址應該在8個5的位置,於是再輸入一組測試,1111111122222222333333334444444412345678來確定4字節地址的具體位置。
(2)此時就可以確定輸入32字節之後的4個字節就是我們要覆蓋的返回地址所在的位置了,接下來就是把原來的地址改爲getshell函數的起始地址。從之前逆向的反彙編中我們知道getshell的起始地址是0x0804847d,但是直接按這個順序輸入會錯,因爲從上圖中看出當輸入是1234時eip寄存器中的值卻對應的是4321,這是因爲棧頂是低地址的緣故,所以0x0804847d也需要反着輸入,即0x7d840408。
任務三:注入一個自己製作的shellcode並運行這段shellcode
(1)準備工作
(2)首先需要確定我們插入shellcode後的地址在哪,我們利用perl語句:perl -e 'print "\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x73\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x4\x3\x2\x00"' > input_shellcode進行實驗,查看\x4\x3\x2\x00這四個字節在哪裏;
(3)進行gdb調試,利用attach命令找到pwn1程序,並且對於foo函數進行反編譯,反編譯以後設置一個斷電,以尋找到插入shellcode的地址,我們在foo函數返回點設置斷點,繼續運行以後,可以查看當前esp指針指向哪裏,查看偏移,然後發現\x4\x3\x2\x00成功覆蓋。
(4)接下來就構造輸入數據,先按前一步把eip和前32字節內容寫到input2文件中,然後編寫shellcode。運行後發現攻擊效果已經達成。
二、 實驗過程中遇到的問題和解決過程
- 在第一個實踐過程中,在修改後,保存可執行文件以後卻不能成果運行,提示說:“格式有誤”
- 我們需要在vim中進行%!xxd -r 進行反轉後才能夠進行保存,這樣就可以進行運行了。
三、感想
在此次實踐中,我們能夠進一步瞭解不同的攻擊手段,同時還增長了Linux系統操作的更多知識。