목차
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
'HACKING > mobile_Android' 카테고리의 다른 글
Setting#3 Xamarin 피닝 우회 (0) | 2023.10.08 |
---|---|
Tool#2 MobSF APK & iOS 점검 자동화 도구 (0) | 2022.08.27 |
Tool#0 Burp suite 이용 방법 (0) | 2021.04.22 |
Program#1 NDK를 이용한 c언어 프로그램 build (0) | 2020.08.30 |
Custom Android#1 Kernel build (0) | 2020.08.24 |