@@ -17,7 +17,7 @@ def initialize(info={})
17
17
Msf ::OptBool . new ( "EnableStageEncoding" , [ false , "Encode the second stage payload" , false ] ) ,
18
18
Msf ::OptString . new ( "StageEncoder" , [ false , "Encoder to use if EnableStageEncoding is set" , nil ] ) ,
19
19
Msf ::OptString . new ( "StageEncoderSaveRegisters" , [ false , "Additional registers to preserve in the staged payload if EnableStageEncoding is set" , "" ] ) ,
20
- Msf ::OptBool . new ( "StageEncodingFallback" , [ false , "Fallback to default encoders or no encoding if the selected StageEncoder is not compatible" , true ] )
20
+ Msf ::OptBool . new ( "StageEncodingFallback" , [ false , "Fallback to no encoding if the selected StageEncoder is not compatible" , true ] )
21
21
] , Msf ::Payload ::Stager )
22
22
23
23
end
@@ -221,22 +221,11 @@ def encode_stage_preserved_registers
221
221
# @return [String] Encoded version of +stg+
222
222
def encode_stage ( stg )
223
223
return stg unless encode_stage?
224
- stage_enc_mod = [ ]
224
+ stage_enc_mod = nil
225
225
226
226
# Handle StageEncoder if specified by the user
227
227
if datastore [ 'StageEncoder' ] . to_s . length > 0
228
- # Allow multiple encoders separated by commas
229
- stage_enc_mod = datastore [ "StageEncoder" ] . split ( ',' ) . map ( &:strip ) . select { |x | x . to_s . length > 0 } . uniq
230
- end
231
-
232
- # Add automatic encoding as a fallback if needed
233
- if datastore [ 'StageEncodingFallback' ]
234
- stage_enc_mod << nil
235
- end
236
-
237
- # If fallback has been disabled and no encoder was parsed, exit early and rop the session
238
- if stage_enc_mod . length == 0
239
- raise RuntimeError , "StageEncoder is invalid and StageEncodingFallback is disabled"
228
+ stage_enc_mod = datastore [ "StageEncoder" ]
240
229
end
241
230
242
231
# Allow the user to specify additional registers to preserve
@@ -247,34 +236,32 @@ def encode_stage(stg)
247
236
saved_registers . strip!
248
237
249
238
estg = nil
250
-
251
- stage_enc_mod . each do |encoder_refname_from_user |
252
-
239
+ begin
253
240
# Generate an encoded version of the stage. We tell the encoding system
254
241
# to save certain registers to ensure that it does not get clobbered.
255
242
encp = Msf ::EncodedPayload . create (
256
243
self ,
257
244
'Raw' => stg ,
258
- 'Encoder' => encoder_refname_from_user ,
245
+ 'Encoder' => stage_enc_mod ,
259
246
'EncoderOptions' => { 'SaveRegisters' => saved_registers } ,
260
247
'ForceSaveRegisters' => true ,
261
248
'ForceEncode' => true )
262
249
263
250
if encp . encoder
264
- print_status ( "Encoded stage with #{ encp . encoder . refname } " )
251
+ if stage_enc_mod
252
+ print_status ( "Encoded stage with #{ stage_enc_mod } " )
253
+ else
254
+ print_status ( "Encoded stage with #{ encp . encoder . refname } " )
255
+ end
265
256
estg = encp . encoded
266
-
267
- break
268
257
end
269
- end
270
-
271
- if datastore [ 'StageEncodingFallback' ] && estg . nil?
272
- print_warning ( "StageEncoder failed, falling back to no encoding" )
273
- estg = stg
274
- end
275
-
276
- unless estg
277
- raise RuntimeError , "Stage encoding failed and StageEncodingFallback is disabled"
258
+ rescue
259
+ if datastore [ 'StageEncodingFallback' ] && estg . nil?
260
+ print_warning ( "StageEncoder failed, falling back to no encoding" )
261
+ estg = stg
262
+ else
263
+ raise RuntimeError , "Stage encoding failed and StageEncodingFallback is disabled"
264
+ end
278
265
end
279
266
280
267
estg
0 commit comments