본문 바로가기
HACKING/mobile_Android

Tool#1 LLVM 난독화 해제 도구 - D-810

by asdf12345 2022. 3. 9.

목차

0.  LLVM 을 이용한 난독화

1. 설치 환경

2. D-810 기능 

3. D-810 한계

4. 결론

 

0.  LLVM 을 이용한 난독화 

0) 수식  : x를 "1^1^0^x^0^(1&0)" 이와 같은 형식으로 수식을 덧입혀 코드 난독화   

1) Bogus Flow Control : 함수 시작 앞에 무의미한 로직 삽입

2) control flow flattening : 함수 분할 후, switch와 state valuable를 이용해서 로직 흐름 난독화

3) goto dispatch : 함수 분할 후, goto 문을 이용해 로직 흐름 난독화 

4) call dispatch : 함수 내 블록을 함수로 변경한 후, 스택 내 function pointer(state valuable)를 이용해 블록 로직 실행

 

 

1. 설치 환경

IDA7.6(crack VMware 에서만 설치), z3-solver package, visual studio 빌드 도구 설치

 

Download URL & Install command : 

https://github.com/jas502n/IDA_Pro_7.2/issues/14

python 3.7.6
pip3 install z3-solver
pip3 install PyQt5
https://visualstudio.microsoft.com/visual-cpp-build-tools/

 

 

 

2. D-810 기능

0) 수식 간소화

  • 변경

  • 결과

- Before

 

- After

 

 

 

1) Control Flow Flattening(제어 흐름 난독화) 해제

State value 에 따른 코드 실행 순서 파악 후 재배열

  • 변경

  • 결과( Before <-> After)

2) Indirect(goto dispatch + call dispatch + 간접 흐름 난독화(함수 분할 후 함수로 변경 & 스택변수에 분할된 함수 주소 저장 & jmp하는 어셈블리 명령어를 삽입하여 로직을 실행하는 로직 분할 및 흐름 숨김) 

jmp 로 인해 파괴된 함수 구간 복구 & 스택 변수 값을 참조 & 함수의 status value를 이용해 순서 파악 후, 연속된 흐름으로 연결해 한 블록으로 생성

  • 변경

  • 결과

 - Before

 

 - After

 

 

3. D-810 한계

동적으로 삽입되는 스택 변수 참조값을 이용하여 분할된 블록(함수)을 실행할 경우 Indirect 난독화 해제 어려움

런타임에서 스택 변수 값 변조할 경우, D-810 은 비정상적 로직 생성

 

 

4. 결론

프로그램의 실행 속도와 보안을 고려하여 중요 값을 추출하는 함수는 동적으로 삽입되는 스택 변수 이용하여 난독화

(+dump를 통한 스택 변수 값 추출을 고려해 변수 이용 후 값 변경)

 

 

 

참조

https://eshard.com/posts/D810-a-journey-into-control-flow-unflattening

https://hex-rays.com/products/ida/support/ida74_idapython_no_bc695_porting_guide.shtml