diff --git a/modules/generators/structured_content/metactf_challenge/secgen_local/local.rb b/modules/generators/structured_content/metactf_challenge/secgen_local/local.rb index 82e6baf51..b2eac30bd 100644 --- a/modules/generators/structured_content/metactf_challenge/secgen_local/local.rb +++ b/modules/generators/structured_content/metactf_challenge/secgen_local/local.rb @@ -56,150 +56,41 @@ class MetaCTFChallengeGenerator < StringGenerator end def generate + candidate_challenges = src_angr + src_csp + src_malware - # TODO : run through the challenges and adjust difficulty to something more appropriate - src_angr = [ - {:difficulty => 'medium', :path => 'src_angr/00_angr_find'}, - {:difficulty => 'medium', :path => 'src_angr/01_angr_avoid'}, - {:difficulty => 'medium', :path => 'src_angr/02_angr_find_condition'}, - {:difficulty => 'medium', :path => 'src_angr/03_angr_symbolic_registers'}, - {:difficulty => 'medium', :path => 'src_angr/04_angr_symbolic_stack'}, - {:difficulty => 'medium', :path => 'src_angr/05_angr_symbolic_memory'}, - {:difficulty => 'medium', :path => 'src_angr/06_angr_symbolic_dynamic_memory'}, - {:difficulty => 'medium', :path => 'src_angr/07_angr_symbolic_file'}, - {:difficulty => 'medium', :path => 'src_angr/08_angr_constraints'}, - {:difficulty => 'hard', :path => 'src_angr/09_angr_hooks'}, - {:difficulty => 'hard', :path => 'src_angr/10_angr_simprocedures'}, - {:difficulty => 'hard', :path => 'src_angr/11_angr_sim_scanf'}, - {:difficulty => 'hard', :path => 'src_angr/12_angr_veritesting'}, - {:difficulty => 'hard', :path => 'src_angr/13_angr_static_binary'}, - {:difficulty => 'hard', :path => 'src_angr/14_angr_shared_library'}, - # TODO: Replacing 'Good Job with a printflag(); call requires more thought for task 15 - omit for now - # '{:difficulty => 'easy', :path => 'src_angr/15_angr_arbitrary_read'}, - {:difficulty => 'hard', :path => 'src_angr/16_angr_arbitrary_write'}, - {:difficulty => 'hard', :path => 'src_angr/17_angr_arbitrary_jump'}, - ] - - src_csp = [ - {:difficulty => 'easy', :path => 'src_csp/Ch1-2/Ch1_Ltrace'}, - {:difficulty => 'easy', :path => 'src_csp/Ch1-2/Ch1_Readelf'}, - {:difficulty => 'easy', :path => 'src_csp/Ch1-2/Ch2_01_Endian'}, - {:difficulty => 'easy', :path => 'src_csp/Ch1-2/Ch2_01_Showkey'}, - {:difficulty => 'easy', :path => 'src_csp/Ch1-2/Ch2_03_IntOverflow'}, - {:difficulty => 'easy', :path => 'src_csp/Ch1-2/Ch2_03_TwosComplement'}, - {:difficulty => 'medium', :path => 'src_csp/Ch1-2/Ch2_03_XorInt'}, - {:difficulty => 'medium', :path => 'src_csp/Ch1-2/Ch2_05_FloatConvert'}, - {:difficulty => 'medium', :path => 'src_csp/Ch3-ExtraFormatStr/Ch3_Format0_Leak'}, - {:difficulty => 'medium', :path => 'src_csp/Ch3-ExtraFormatStr/Ch3_Format1_LeakDollar'}, - {:difficulty => 'medium', :path => 'src_csp/Ch3-ExtraFormatStr/Ch3_Format2_nCorruptKey'}, - {:difficulty => 'medium', :path => 'src_csp/Ch3-ExtraFormatStr/Ch3_Format3_nWriteKey'}, - {:difficulty => 'medium', :path => 'src_csp/Ch3-ExtraFormatStr/Ch3_Format4_nWriteFnP'}, - {:difficulty => 'medium', :path => 'src_csp/Ch3-ExtraFormatStr/Ch3_Format5_nTargetWrite'}, - {:difficulty => 'medium', :path => 'src_csp/Ch3-ExtraFormatStr/Ch3_Format6_PLTHijack'}, - {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_00_GdbIntro'}, - {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_00_GdbRegs'}, - {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_00_GdbSetmem'}, - {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_01_GdbPractice'}, - {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_02_AsciiInstr'}, - {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_04_FnPointer'}, - {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_04_LinkedList'}, - {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_05_XorLong'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.1-3.5/Ch3_05_XorStr'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_06_Conditionals'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_06_LoopMulti'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_06_SwitchTable'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_07_FloatReturn'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_07_ParamsRegs'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_07_ParamsStack'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_07_SegvBacktrace'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_07_StaticInt'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_07_StaticStrcmp'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.7-3.9/Ch3_07_CanaryBypass'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.7-3.9/Ch3_07_HijackPLT'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.7-3.9/Ch3_07_ScanfOverflow'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.7-3.9/Ch3_07_StackSmash'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.7-3.9/Ch3_08_2DArrays'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.7-3.9/Ch3_08_Matrix'}, - {:difficulty => 'hard', :path => 'src_csp/Ch3.7-3.9/Ch3_09_Structs'}, - {:difficulty => 'hard', :path => 'src_csp/Ch5-8/Ch5_08_LoopUnroll'}, - {:difficulty => 'hard', :path => 'src_csp/Ch5-8/Ch7_13_LdPreloadGetUID'}, - {:difficulty => 'hard', :path => 'src_csp/Ch5-8/Ch8_05_PsSignals'}, - {:difficulty => 'hard', :path => 'src_csp/Ch5-8/Ch8_05_Signals'}, - ] - - src_malware = [ - {:difficulty => 'easy', :path => 'src_malware/Ch01-08/Ch01StatA_Readelf'}, - {:difficulty => 'easy', :path => 'src_malware/Ch01-08/Ch03DynA_Ltrace'}, - {:difficulty => 'easy', :path => 'src_malware/Ch01-08/Ch04x86_AsciiInstr'}, - {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch04x86_AsciiStrcmp'}, - {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch06CAsm_Conditionals'}, - {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch06CAsm_LinkedList'}, - {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch06CAsm_LoopMulti'}, - {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch06CAsm_SwitchTable'}, - {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_GdbIntro'}, - {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_GdbParams'}, - {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_GdbPractice'}, - {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_GdbRegs'}, - {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_GdbSetmem'}, - {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_InputFormat'}, - {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_Radare2Intro1'}, - {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_Radare2Intro2'}, - {:difficulty => 'hard', :path => 'src_malware/Ch01-08/Ch08Dbg_StaticInt'}, - {:difficulty => 'hard', :path => 'src_malware/Ch01-08/Ch08Dbg_StaticRE'}, - {:difficulty => 'hard', :path => 'src_malware/Ch01-08/Ch08Dbg_StaticStrcmp'}, - {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch11MalBeh_HijackPLT'}, - {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch11MalBeh_LdPreloadGetUID'}, - {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch11MalBeh_LdPreloadRand'}, - {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch11MalBeh_NetcatShovel'}, - {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch12Covert_ForkFollow'}, - {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch12Covert_ForkPipe'}, - {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch13DataEnc_BaseEnc'}, - {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch13DataEnc_XorEnc'}, - {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch15AntiDis_FakeCallInt'}, - {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch15AntiDis_FakeCond'}, - {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch15AntiDis_FakeMetaConds'}, - {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch15AntiDis_InJmp'}, - {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch15AntiDis_PushRet'}, - {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch16AntiDbg_BypassPtrace'}, - {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch16AntiDbg_GdbCheckTrace'}, - {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch16AntiDbg_Int3Scan'}, - {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch16AntiDbg_SigtrapCheck'}, - {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch16AntiDbg_SigtrapEntangle'}, - {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch16AntiDbg_SigtrapHijack'}, - {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch16AntiDbg_TimeCheck'}, - {:difficulty => 'hard', :path => 'src_malware/Ch18-21/Ch18PackUnp_UnpackEasy'}, - {:difficulty => 'hard', :path => 'src_malware/Ch18-21/Ch18PackUnp_UnpackGdb'}, - {:difficulty => 'hard', :path => 'src_malware/Ch18-21/Ch21x64_ParamsRegs'}, - {:difficulty => 'hard', :path => 'src_malware/Ch18-21/Ch21x64_ParamsStack'}, - ] - - challenges = src_angr + src_csp + src_malware - + # Exclusion list to remove duplicate challenges from the candidate pool if self.existing_challenges != [] Print.local("Removing #{self.existing_challenges.size.to_s} existing challenge(s)") self.existing_challenges.each do |json_challenge| challenge = JSON.parse(json_challenge) - challenges.delete_if do |cha| + candidate_challenges.delete_if do |cha| cha[:path] == challenge['challenge_path'] end end end + # Select a specific challenge if challenge_path is provided. + # If candidate_challenges is empty because we already have it, raise an error. if self.challenge_path != '' - challenges.delete_if do |challenge| - challenge[:path] != self.challenge_path + candidate_challenges.delete_if do |cha| + cha[:path] != self.challenge_path + end + if candidate_challenges.size > 0 + challenge = candidate_challenges.first + else + Print.err("Error: Challenge declared by challenge_path is either invalid or has already been selected and is included in the existing_challenges exclusion list.") + Print.err("self.challenge_path: " + self.challenge_path) + Print.err("self.existing_challenges: " + self.existing_challenges.to_s) + exit(1) end - challenge = challenges.first elsif self.challenge_path == '' and self.difficulty != '' - challenges.delete_if do |challenge| + candidate_challenges.delete_if do |challenge| challenge[:difficulty] != self.difficulty end - - challenge = challenges.sample + challenge = candidate_challenges.sample else - # throw an errorr Print.err('Error: MetaCTF Challenge Generator. ') - Print.err('Either provide a challenge path or a difficulty.') # TODO: more meaningful error messages here + Print.err('Either provide a challenge path or a difficulty.') exit(1) end @@ -207,11 +98,125 @@ class MetaCTFChallengeGenerator < StringGenerator self.group = SecureRandom.hex.slice(1..8) end - outputs << {'challenge_name' => challenge[:path].split('/')[-1], 'challenge_path' => challenge[:path], 'flag' => self.flag, 'group' => self.group }.to_json end + # TODO : run through the challenges and adjust difficulty to something more appropriate + def src_angr + [{:difficulty => 'medium', :path => 'src_angr/00_angr_find'}, + {:difficulty => 'medium', :path => 'src_angr/01_angr_avoid'}, + {:difficulty => 'medium', :path => 'src_angr/02_angr_find_condition'}, + {:difficulty => 'medium', :path => 'src_angr/03_angr_symbolic_registers'}, + {:difficulty => 'medium', :path => 'src_angr/04_angr_symbolic_stack'}, + {:difficulty => 'medium', :path => 'src_angr/05_angr_symbolic_memory'}, + {:difficulty => 'medium', :path => 'src_angr/06_angr_symbolic_dynamic_memory'}, + {:difficulty => 'medium', :path => 'src_angr/07_angr_symbolic_file'}, + {:difficulty => 'medium', :path => 'src_angr/08_angr_constraints'}, + {:difficulty => 'hard', :path => 'src_angr/09_angr_hooks'}, + {:difficulty => 'hard', :path => 'src_angr/10_angr_simprocedures'}, + {:difficulty => 'hard', :path => 'src_angr/11_angr_sim_scanf'}, + {:difficulty => 'hard', :path => 'src_angr/12_angr_veritesting'}, + {:difficulty => 'hard', :path => 'src_angr/13_angr_static_binary'}, + {:difficulty => 'hard', :path => 'src_angr/14_angr_shared_library'}, + # TODO: Replacing 'Good Job with a printflag(); call requires more thought for task 15 - omit for now + # '{:difficulty => 'easy', :path => 'src_angr/15_angr_arbitrary_read'}, + {:difficulty => 'hard', :path => 'src_angr/16_angr_arbitrary_write'}, + {:difficulty => 'hard', :path => 'src_angr/17_angr_arbitrary_jump'}] + end + + def src_csp + [{:difficulty => 'easy', :path => 'src_csp/Ch1-2/Ch1_Ltrace'}, + {:difficulty => 'easy', :path => 'src_csp/Ch1-2/Ch1_Readelf'}, + {:difficulty => 'easy', :path => 'src_csp/Ch1-2/Ch2_01_Endian'}, + {:difficulty => 'easy', :path => 'src_csp/Ch1-2/Ch2_01_Showkey'}, + {:difficulty => 'easy', :path => 'src_csp/Ch1-2/Ch2_03_IntOverflow'}, + {:difficulty => 'easy', :path => 'src_csp/Ch1-2/Ch2_03_TwosComplement'}, + {:difficulty => 'medium', :path => 'src_csp/Ch1-2/Ch2_03_XorInt'}, + {:difficulty => 'medium', :path => 'src_csp/Ch1-2/Ch2_05_FloatConvert'}, + {:difficulty => 'medium', :path => 'src_csp/Ch3-ExtraFormatStr/Ch3_Format0_Leak'}, + {:difficulty => 'medium', :path => 'src_csp/Ch3-ExtraFormatStr/Ch3_Format1_LeakDollar'}, + {:difficulty => 'medium', :path => 'src_csp/Ch3-ExtraFormatStr/Ch3_Format2_nCorruptKey'}, + {:difficulty => 'medium', :path => 'src_csp/Ch3-ExtraFormatStr/Ch3_Format3_nWriteKey'}, + {:difficulty => 'medium', :path => 'src_csp/Ch3-ExtraFormatStr/Ch3_Format4_nWriteFnP'}, + {:difficulty => 'medium', :path => 'src_csp/Ch3-ExtraFormatStr/Ch3_Format5_nTargetWrite'}, + {:difficulty => 'medium', :path => 'src_csp/Ch3-ExtraFormatStr/Ch3_Format6_PLTHijack'}, + {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_00_GdbIntro'}, + {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_00_GdbRegs'}, + {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_00_GdbSetmem'}, + {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_01_GdbPractice'}, + {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_02_AsciiInstr'}, + {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_04_FnPointer'}, + {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_04_LinkedList'}, + {:difficulty => 'medium', :path => 'src_csp/Ch3.1-3.5/Ch3_05_XorLong'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.1-3.5/Ch3_05_XorStr'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_06_Conditionals'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_06_LoopMulti'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_06_SwitchTable'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_07_FloatReturn'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_07_ParamsRegs'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_07_ParamsStack'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_07_SegvBacktrace'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_07_StaticInt'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.6-3.7/Ch3_07_StaticStrcmp'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.7-3.9/Ch3_07_CanaryBypass'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.7-3.9/Ch3_07_HijackPLT'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.7-3.9/Ch3_07_ScanfOverflow'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.7-3.9/Ch3_07_StackSmash'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.7-3.9/Ch3_08_2DArrays'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.7-3.9/Ch3_08_Matrix'}, + {:difficulty => 'hard', :path => 'src_csp/Ch3.7-3.9/Ch3_09_Structs'}, + {:difficulty => 'hard', :path => 'src_csp/Ch5-8/Ch5_08_LoopUnroll'}, + {:difficulty => 'hard', :path => 'src_csp/Ch5-8/Ch7_13_LdPreloadGetUID'}, + {:difficulty => 'hard', :path => 'src_csp/Ch5-8/Ch8_05_PsSignals'}, + {:difficulty => 'hard', :path => 'src_csp/Ch5-8/Ch8_05_Signals'}] + end + + def src_malware + [{:difficulty => 'easy', :path => 'src_malware/Ch01-08/Ch01StatA_Readelf'}, + {:difficulty => 'easy', :path => 'src_malware/Ch01-08/Ch03DynA_Ltrace'}, + {:difficulty => 'easy', :path => 'src_malware/Ch01-08/Ch04x86_AsciiInstr'}, + {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch04x86_AsciiStrcmp'}, + {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch06CAsm_Conditionals'}, + {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch06CAsm_LinkedList'}, + {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch06CAsm_LoopMulti'}, + {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch06CAsm_SwitchTable'}, + {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_GdbIntro'}, + {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_GdbParams'}, + {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_GdbPractice'}, + {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_GdbRegs'}, + {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_GdbSetmem'}, + {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_InputFormat'}, + {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_Radare2Intro1'}, + {:difficulty => 'medium', :path => 'src_malware/Ch01-08/Ch08Dbg_Radare2Intro2'}, + {:difficulty => 'hard', :path => 'src_malware/Ch01-08/Ch08Dbg_StaticInt'}, + {:difficulty => 'hard', :path => 'src_malware/Ch01-08/Ch08Dbg_StaticRE'}, + {:difficulty => 'hard', :path => 'src_malware/Ch01-08/Ch08Dbg_StaticStrcmp'}, + {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch11MalBeh_HijackPLT'}, + {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch11MalBeh_LdPreloadGetUID'}, + {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch11MalBeh_LdPreloadRand'}, + {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch11MalBeh_NetcatShovel'}, + {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch12Covert_ForkFollow'}, + {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch12Covert_ForkPipe'}, + {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch13DataEnc_BaseEnc'}, + {:difficulty => 'hard', :path => 'src_malware/Ch11-13/Ch13DataEnc_XorEnc'}, + {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch15AntiDis_FakeCallInt'}, + {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch15AntiDis_FakeCond'}, + {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch15AntiDis_FakeMetaConds'}, + {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch15AntiDis_InJmp'}, + {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch15AntiDis_PushRet'}, + {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch16AntiDbg_BypassPtrace'}, + {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch16AntiDbg_GdbCheckTrace'}, + {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch16AntiDbg_Int3Scan'}, + {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch16AntiDbg_SigtrapCheck'}, + {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch16AntiDbg_SigtrapEntangle'}, + {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch16AntiDbg_SigtrapHijack'}, + {:difficulty => 'hard', :path => 'src_malware/Ch15-16/Ch16AntiDbg_TimeCheck'}, + {:difficulty => 'hard', :path => 'src_malware/Ch18-21/Ch18PackUnp_UnpackEasy'}, + {:difficulty => 'hard', :path => 'src_malware/Ch18-21/Ch18PackUnp_UnpackGdb'}, + {:difficulty => 'hard', :path => 'src_malware/Ch18-21/Ch21x64_ParamsRegs'}, + {:difficulty => 'hard', :path => 'src_malware/Ch18-21/Ch21x64_ParamsStack'}] + end end MetaCTFChallengeGenerator.new.run \ No newline at end of file