Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

2018 고통스러운 디컴파일러 제작기 - PL길만 걷자

3 views

Published on

2018 가천대 Pay1oad x 건국대 SecurityFACT 연합 세미나에서 발표한 자료입니다.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

2018 고통스러운 디컴파일러 제작기 - PL길만 걷자

  1. 1. 고통스러운 디컴파일러 제작기 가천대학교 정보보호 동아리 Pay1oad 김 기 병 김 성 운 최 한 동 - PL길만 걷자
  2. 2. INDEX 1 디컴파일러? 2 제작 과정 3 Sample 4 Q&A 가천대학교 No.1 정보보호 동아리
  3. 3. 1. 디컴파일러? 02 01 03 04 가천대학교 No.1 정보보호 동아리 Hex-Rays 디컴파일러, Boomerang, JEB 등 - 다양한 언어 지원!
  4. 4. 02 01 03 04 가천대학교 No.1 정보보호 동아리1. 디컴파일러? DSP? Disassembler - IDA Pro Decompiler - ?
  5. 5. 02 01 03 04 가천대학교 No.1 정보보호 동아리1. 디컴파일러? [일반적인 디컴파일 과정] [DSP 디컴파일 과정]
  6. 6. 2. 제작 과정 가천대학교 No.1 정보보호 동아리 02 03 04 01 0. Structure IDA Pro Disasm Parsing (Python) SDK Instruction JSON(Output) Lifting(Rust) File I/O Rearrange(Rust)Rearrange(Rust) Array(Type)Array(Type) Aggregation (Rust) Array(Type) Array(Type) CFG(Rust) Type Check (Rust) Array(Type)
  7. 7. 2. 제작 과정 가천대학교 No.1 정보보호 동아리 02 03 04 01 1. Disassemble
  8. 8. 2. 제작 과정 가천대학교 No.1 정보보호 동아리 02 03 04 01 2. Parsing(구조) IDA Pro Disasm Regex( instruction ) Delay Slot Mapping Instruction(opcode) argument Parallel JSON(Output)
  9. 9. 2. 제작 과정 가천대학교 No.1 정보보호 동아리 02 03 04 01 2. Parsing(코드) Delay Slot Mapping Regex Parsing
  10. 10. 2. 제작 과정 가천대학교 No.1 정보보호 동아리 02 03 04 01 2. Parsing(형식)
  11. 11. 2. 제작 과정 가천대학교 No.1 정보보호 동아리 02 03 04 01 2.1 Type Definition
  12. 12. 2. 제작 과정 가천대학교 No.1 정보보호 동아리 02 03 04 01 3. Lifting { "opcode": [{ "function_name": "_main", "mem_index": 0, "delay_slot": 0, "instruction_set": "MVK", "functional_unit": ".S2", "argument": [ ["const_", "64h"], ["var_", "B5"] ], "conditional": "", "mem_register": "", "address": "0x0", "parallel": "" }, { "function_name": "_main", "mem_index": 0, "delay_slot": 0, "instruction_set": "MVK", "functional_unit": ".S1", "argument": [ ["const_", "1"], ["var_", "A3"] ], "conditional": "", "mem_register": "", "address": "0x4", "parallel": "||" }, Stmt::Assign( str_to_arg(i.argument[1].0.clone(), i.argument[1].1.clone()), Box::new(Exp::UnOp(str_to_arg( i.argument[0].0.clone(), i.argument[0].1.clone(), ))), ) [추출한 JSON 파일] [중간언어 Lifting Code]
  13. 13. 2. 제작 과정 가천대학교 No.1 정보보호 동아리 02 03 04 01 3. Lifting [중간언어로 Lifting 한 결과] [IDA Pro Disasm]
  14. 14. 2. 제작 과정 가천대학교 No.1 정보보호 동아리 02 03 04 01 4. Rearrange
  15. 15. 2. 제작 과정 가천대학교 No.1 정보보호 동아리 02 03 04 01 4. Rearrange B5 = 64h A3 = 1 B0 = (B5 > A3) if( !B0 ) then ( JUMP loc_3c ) B15 = (-8 + B15) B6 = 0 *"B15"["2"] = B6 B4 = A3 *"B15"["1"] = A3 B6 = 64h B0 = (B4 < B6) if( B0 ) then ( JUMP loc_24 ) B5 = (1 + B4) *"B15"["2"] = B5 NOP = 3 JUMP B3 B15 = (8 + B15) A4 = 0 NOP = 3 B5 = 64h A3 = 1 B0 = (B5 > A3) B15 = (-8 + B15) B6 = 0 *"B15"["2"] = B6 B4 = A3 *"B15"["1"] = A3 if( !B0 ) then ( JUMP loc_3c ) B6 = 64h B0 = (B4 < B6) B5 = (1 + B4) *"B15"["2"] = B5 NOP = 3 B15 = (8 + B15) if( B0 ) then ( JUMP loc_24 ) A4 = 0 NOP = 3 [Rearrange 한 결과] [Lifting 된 결과]
  16. 16. 2. 제작 과정 가천대학교 No.1 정보보호 동아리 02 03 04 01 5. SSA
  17. 17. 2. 제작 과정 가천대학교 No.1 정보보호 동아리 02 03 04 01 5. SSA B5 = 64h A3 = 1 B0 = (B5 > A3) B15 = (-8 + B15) B6 = 0 *"B15"["2"] = B6 B4 = A3 *"B15"["1"] = A3 if( !B0 ) then ( JUMP loc_3c ) B6 = 64h B0 = (B4 < B6) B5 = (1 + B4) *"B15"["2"] = B5 NOP = 3 B15 = (8 + B15) if( B0 ) then ( JUMP loc_24 ) A4 = 0 NOP = 3 B5_1 = 64h A3_1 = 1 B0_1 = (B5_1 > A3_1) B15_1 = (-8 + B15_0) B6_1 = 0 *"B15_1"["2"] = B6_1 B4_1 = A3_1 *"B15_1"["1"] = A3_1 if( B1 ) then ( JUMP loc_3c ) B6_2 = 64h B0_2 = (B4_1 < B6_2) B5_2 = (1 + B4_1) *"B15_1"["2"] = B5_2 B1 = 3 B15_2 = (8 + B15_1) if( B0_2 ) then ( JUMP loc_24 ) A4_1 = 0 B1 = 3 [Rearrange 된 결과] [SSA 한 결과]
  18. 18. 2. 제작 과정 가천대학교 No.1 정보보호 동아리 02 03 04 01 6. Aggregation fn write_agg_table(arg: Vec<Stmt>) -> std::io::Result<()> { let mut agg_table: HashMap<String, Exp> = HashMap::new(); let mut dst_str; let mut src_exp: Exp; for i in arg { match i { Stmt::Assign(dst, src) => { dst_str = exp_to_str(dst); src_exp = unbox(src); agg_table.insert(dst_str, src_exp); } Stmt::Conditional(cond, ins) => match unbox(ins) { Stmt::Assign(dst, src) => { let dst_condition = exp_to_str(dst); let src_exp_condition = unbox(src); agg_table.insert(dst_condition, src_exp_condition); } _ => continue, }, _ => continue, } } let j = serde_json::to_string(&agg_table)?; let mut f = File::create("./agg_table.json").unwrap(); write!(&mut f, "{}", j).unwrap(); Ok(()) }
  19. 19. 2. 제작 과정 가천대학교 No.1 정보보호 동아리 02 03 04 01 [SSA 한 결과] B5_1 = 64h A3_1 = 1 B0_1 = (B5_1 > A3_1) B15_1 = (-8 + B15_0) B6_1 = 0 *"B15_1"["2"] = B6_1 B4_1 = A3_1 *"B15_1"["1"] = A3_1 if( B1 ) then ( JUMP loc_3c ) B6_2 = 64h B0_2 = (B4_1 < B6_2) B5_2 = (1 + B4_1) *"B15_1"["2"] = B5_2 B1 = 3 B15_2 = (8 + B15_1) if( B0_2 ) then ( JUMP loc_24 ) A4_1 = 0 B1 = 3 [Aggregation 한 결과] *"B15_1"["2"] = 0 *"B15_1"["1"] = 1 if( 3 ) then ( JUMP loc_3c ) *"B15_1"["2"] = (1 + 1) if( (1 < 64h) ) then ( JUMP loc_24 ) 6. Aggregation
  20. 20. 3. Sample 가천대학교 No.1 정보보호 동아리 02 03 04 01
  21. 21. 3. Sample 가천대학교 No.1 정보보호 동아리 02 03 04 01
  22. 22. 3. Sample 가천대학교 No.1 정보보호 동아리 02 03 04 01
  23. 23. 3. Sample 가천대학교 No.1 정보보호 동아리 02 03 04 01
  24. 24. 4. Q&A 가천대학교 No.1 정보보호 동아리 02 03 04 01 Any Questions?
  25. 25. Thank you for your attention 가천대학교 Pay1oad / 김성운 TEL: 010-7456-7746 E-mail: sungwoon2608@naver.com 가천대학교 Pay1oad / 김기병 TEL: 010-6597-4018 E-mail: kkbg001@naver.com 가천대학교 Pay1oad / 최한동 TEL: 010-2576-1110 E-mail: henry1110@naver.com

×