Successfully reported this slideshow.
Your SlideShare is downloading. ×

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

Ad

고통스러운 디컴파일러 제작기
가천대학교 정보보호 동아리 Pay1oad
김 기 병
김 성 운
최 한 동
- PL길만 걷자

Ad

INDEX
1 디컴파일러?
2 제작 과정
3 Sample
4 Q&A
가천대학교 No.1 정보보호 동아리

Ad

1. 디컴파일러?
02
01
03
04
가천대학교 No.1 정보보호 동아리
Hex-Rays 디컴파일러, Boomerang, JEB 등
- 다양한 언어 지원!

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Loading in …3
×

Check these out next

1 of 25 Ad
1 of 25 Ad
Advertisement

More Related Content

Advertisement

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

×