SlideShare a Scribd company logo
1 of 43
가상화 기법으로 보호된 코드를 분석해보자
안재훈 (xxjh)
dkswognsdi@gmail.com
목차
1) 소개
2) 개요
3) 코드 가상화 구조
4) 가상화 코드 분석
5) VM 명령어 추출 자동화 도구 개발
2) 개요
시작하게 된 이유
1. 개인 욕심
가상화로 보호 되어 있는 난독화 코드를 보면 포기하고 다른 루틴을 분석했던 나날..
2. 업무에 쏟아지는 가상화된 바이너리들..
업무상 분석 해야 하는 파일들이 vmprotect로 많이 가상화 되어있었음.
2) 개요
다루고자 하는 내용
1. 코드 가상화의 구조
Initialize Routine
Dispatch Routine
Instruction Handler
코드 가상화를 위 세가지 영역으로 분류하여 각각 어떠한
역할을 수행하는 지 분석합니다.
2. CPU Emulator Framework를 활용한 코드 가상화 분석 도구 개발
Unicorn Engine과 Capstone Engine을 사용하여 실행되는
Instruction Handler를 추출하고 동적으로 분석하여
VM CPU영역에서 실행되는 코드들을 추출합니다.
VMProtect 2.13.5 Maximum Speed 옵션 기준으로 내용을 다룹니다.
3) 코드 가상화 구조
Real CPU
VM CPU
Initialize Routine
Dispatch Routine
Handler1 Handler2 Handler3 Handler4 Handler..
4) 가상화 코드 분석
1. Real CPU
위 사진은 VMProtect SDK를 적용하고 아직 VMProtect로 보호하지 않은
함수의 코드입니다.
해당 코드들은 컴파일러가 생성한 때 묻지 않은 실행 코드들 입니다.
4) 가상화 코드 분석
2. VM CPU
위 코드는 VMProtect로 보호하여 코드 가상화가 적용된 코드입니다.
.text:0041172F 주소에서 VM CPU로 제어권을 넘겨주는 것을 확인할 수 있습니다.
4) 가상화 코드 분석
2. VM CPU
VM CPU 영역의 코드입니다. 코드가 대부분 난독화 되어있으며
CPU는 Bytecode를 기반으로 명령어를 해석 및 실행하는 가상머신 코드를 실행합니다.
4) 가상화 코드 분석
3. Initialize Routine
Initialize Routine에서는 Bytecode Address를 Decode하는 작업을 수행합니다.
위 사진 기준으로 esp+50 위치에 Key가 존재하며 esi 레지스터를 기준으로 Decode 합니다.
4) 가상화 코드 분석
3. Dispatch Routine
Dispatch Routine 에서는 Bytecode에 따른 VM Instruction Handler Address Decode
작업을 수행합니다. 그 후 Instruction Handler를 실행합니다.
4) 가상화 코드 분석
4. Insturction Handler
4) 가상화 코드 분석
4. Insturction Handler
4) 가상화 코드 분석
Instruction Handler는 쓰레기 코드들로 넘쳐납니다.
4) 가상화 코드 분석
Instruction Handler에서 최대한 의미 있는 코드들만 모아보면..
엄청나게 양이 적어집니다.. 위 코드는 esi(Bytecode)에서 Encode 되어 있는
4바이트 값을 Decode 후 ebp(VM Stack) – 4 위치에 덮어씌워주는 코드입니다.
sub esp,4
mov dword ptr ss:[esp], value 명령어는 push value 명령어와 같은 동작을
수행하기 때문에 위에서 봤던 엄청난 량의 코드들은 push imm32 명령어를
수행한겁니다.
Instruction Handler에서는 원하는 동작을 다 수행하면 Dispatch Routine으로
되돌아 갑니다.
5) VM 명령어 추출 자동화 도구 개발
코드 가상화 기법으로 보호 되어있는 코드들은 엄청난 양의
코드들이 실행되기 때문에 수동으로 분석하기에는 어렵기도 하고
시간을 많이 투자해야 합니다.
우리의 시간은 소중하기 때문에 수동으로 분석하는 것 보다는
VM에서 실행하는 명령어들을 자동으로 추출해주는 도구를
개발하는 것이 몸에 이롭습니다.
저는 CPU Emulator Framework를 통해서 가상화된 영역을
에뮬레이팅 하여 분석에 필요한 정보를 추출했습니다.
5) VM 명령어 추출 자동화 도구 개발
준비물
CPU Emulator Framework
Disassembly Engine
IDE
C/C++ 개발능력
5) VM 명령어 추출 자동화 도구 개발
CPU Emulator Framework
Unicorn Engine
IDE
Visual Studio 2015
Disassembly Engine
Capstone
5) VM 명령어 추출 자동화 도구 개발
VMProtect처럼 VM 코드가 엄청나게 난독화 되어있어도 몇 가지 규칙이 존재합니다.
esi 레지스터를 통해 Bytecode를 관리한다는 것
Dispatch Routine에서 push ret 명령어로 Instruction Handler로 이동하는 것
ebp 레지스터를 VM Stack으로 사용한다는 것
위 세 개의 정보만으로도 Unicorn Engine을 통해서 많은 정보를 추출할 수 있습니다.
5) VM 명령어 추출 자동화 도구 개발
가상화 에뮬레이팅 전 필요한 정보들을 전부 설정해줍니다.
5) VM 명령어 추출 자동화 도구 개발
VM CPU 영역 진입 후 처음으로 실행되는 Ret 명령어의 주소를 기록합니다.
5) VM 명령어 추출 자동화 도구 개발
코드를 에뮬레이팅 하면서 아까 기록한 주소가 실행 될 때
실행되는 핸들러 정보와 레지스터 정보 가상 스택과 리얼 스택의
메모리 정보들을 저장해둡니다.
5) VM 명령어 추출 자동화 도구 개발
이제 가상화 영역을 전부 에뮬레이팅 하면
아래의 정보들을 전부 확인할 수 있습니다.
핸들러 정보
레지스터 정보
가상 및 리얼 스택 정보
위 정보들을 이용해서 다시 각각의 핸들러를
에뮬레이팅 할 수 있습니다.
핸들러를 에뮬레이팅 하면서 의미있는 코드만 추출해
필요한 정보와 실행 코드 패턴 매칭이 가능해집니다.
5) VM 명령어 추출 자동화 도구 개발
위 코드는 여러 정보를 이용해 핸들러를 에뮬레이팅 하고
추출한 패턴과 실행 코드 패턴과 매칭해 결과를 출력해주는 코드입니다.
5) VM 명령어 추출 자동화 도구 개발
핸들러 에뮬레이터는 전달 받은 정보를 레지스터 및 메모리 정보를
재설정합니다.
5) VM 명령어 추출 자동화 도구 개발
핸들러에서도 명령어를 처리하기 위해서는 Bytecode부터 읽어야하므로
메모리를 읽을 시 기록하는 레지스터를 저장합니다.
이제 기록된 레지스터 정보를 기반으로 의미 있는 코드를 추출합니다.
5) VM 명령어 추출 자동화 도구 개발
의미 있는 코드 추출
5) VM 명령어 추출 자동화 도구 개발
ebp는 VM Stack과 연관이 있기 때문에 추출합니다.
5) VM 명령어 추출 자동화 도구 개발
ret 명령어는 call Instruction 및 가상화 영역 탈출(vm exit) 때문에 추출합니다.
5) VM 명령어 추출 자동화 도구 개발
앞서 저장한 레지스터 정보가 포함되어 있으면 추출합니다.
5) VM 명령어 추출 자동화 도구 개발
핸들러의 모든 코드들을 추출했을 때의 모습입니다.
5) VM 명령어 추출 자동화 도구 개발
의미있는 코드들만 추출했을 때의 모습입니다.
5) VM 명령어 추출 자동화 도구 개발
모든 핸들러에서 의미 있는 코드들을 추출하여 패턴 정보를 작성합니다.
5) VM 명령어 추출 자동화 도구 개발
원본 코드 타입, 원본 코드, 패턴 정보, 추출 유무, 추출해야 할 정보가 포함되어있습니다.
5) VM 명령어 추출 자동화 도구 개발
엄청 간단한 명령어들만 가상화 했는데도 VM CPU 내부에서는
이렇게 많은 명령어들이 에뮬레이팅 됩니다.
5) VM 명령어 추출 자동화 도구 개발
이제 모든 패턴을 매칭시켜 VM에서 에뮬레이팅 되는 코드들을 추출해보면?..
5) VM 명령어 추출 자동화 도구 개발
아.. 저는 컴파일러가 생성한 원본 코드가 나올 줄 알았습니다.
5) VM 명령어 추출 자동화 도구 개발
5) VM 명령어 추출 자동화 도구 개발
그래도 사람이 읽기 쉬운 가공된 코드가 출력됩니다.
호출하는 API 및 함수 목록도 확인 가능하기 때문에
가상화 영역 내에서 OS 의존적인 동작을 수행할 경우 확인이 가능합니다.
5) VM 명령어 추출 자동화 도구 개발
Q & A
5) VM 명령어 추출 자동화 도구 개발
감사합니다.
5) VM 명령어 추출 자동화 도구 개발
Thank you for dbghlpr
https://github.com/dbghlpr/pegasus
Windbg emulation plugin

More Related Content

What's hot

Db설계 프로젝트 1조 _중간제출
Db설계 프로젝트 1조 _중간제출Db설계 프로젝트 1조 _중간제출
Db설계 프로젝트 1조 _중간제출
Matthew Chang
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
Seungjae Lee
 
[0119 박민근] 기술 면접시 자주 나오는 문제들(ver 2013)
[0119 박민근] 기술 면접시 자주 나오는 문제들(ver 2013)[0119 박민근] 기술 면접시 자주 나오는 문제들(ver 2013)
[0119 박민근] 기술 면접시 자주 나오는 문제들(ver 2013)
MinGeun Park
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
Esun Kim
 
16.03.24 sos project 컨셉 기획서_남진우
16.03.24 sos project 컨셉 기획서_남진우16.03.24 sos project 컨셉 기획서_남진우
16.03.24 sos project 컨셉 기획서_남진우
Nam Jinwoo
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
devCAT Studio, NEXON
 
이승재, 실시간 HTTP 양방향 통신, NDC2012
이승재, 실시간 HTTP 양방향 통신, NDC2012이승재, 실시간 HTTP 양방향 통신, NDC2012
이승재, 실시간 HTTP 양방향 통신, NDC2012
devCAT Studio, NEXON
 

What's hot (20)

Db설계 프로젝트 1조 _중간제출
Db설계 프로젝트 1조 _중간제출Db설계 프로젝트 1조 _중간제출
Db설계 프로젝트 1조 _중간제출
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
 
C++과 Lua script연동
C++과 Lua script연동C++과 Lua script연동
C++과 Lua script연동
 
[0119 박민근] 기술 면접시 자주 나오는 문제들(ver 2013)
[0119 박민근] 기술 면접시 자주 나오는 문제들(ver 2013)[0119 박민근] 기술 면접시 자주 나오는 문제들(ver 2013)
[0119 박민근] 기술 면접시 자주 나오는 문제들(ver 2013)
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
 
물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다 공개용
물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다  공개용물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다  공개용
물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다 공개용
 
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
 
서비스중인 게임 DB 설계 (쿠키런 편)
서비스중인 게임 DB 설계 (쿠키런 편)서비스중인 게임 DB 설계 (쿠키런 편)
서비스중인 게임 DB 설계 (쿠키런 편)
 
16.03.24 sos project 컨셉 기획서_남진우
16.03.24 sos project 컨셉 기획서_남진우16.03.24 sos project 컨셉 기획서_남진우
16.03.24 sos project 컨셉 기획서_남진우
 
장재화, Replay system, NDC2011
장재화, Replay system, NDC2011장재화, Replay system, NDC2011
장재화, Replay system, NDC2011
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
 
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) Unite Seoul Ver.
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) Unite Seoul Ver.유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) Unite Seoul Ver.
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) Unite Seoul Ver.
 
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
 
이승재, 실시간 HTTP 양방향 통신, NDC2012
이승재, 실시간 HTTP 양방향 통신, NDC2012이승재, 실시간 HTTP 양방향 통신, NDC2012
이승재, 실시간 HTTP 양방향 통신, NDC2012
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x
 
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
 
AAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptxAAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptx
 

Similar to 가상화된 코드를 분석해보자

[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
Jaeseung Ha
 
Amazon EC2 Deep Dive - 이창수 (AWS 솔루션 아키텍트) : 8월 온라인 세미나
Amazon EC2 Deep Dive - 이창수 (AWS 솔루션 아키텍트) : 8월 온라인 세미나Amazon EC2 Deep Dive - 이창수 (AWS 솔루션 아키텍트) : 8월 온라인 세미나
Amazon EC2 Deep Dive - 이창수 (AWS 솔루션 아키텍트) : 8월 온라인 세미나
Amazon Web Services Korea
 
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
Jeongsang Baek
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 

Similar to 가상화된 코드를 분석해보자 (20)

피니엔진
피니엔진피니엔진
피니엔진
 
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
 
[2008 CodeEngn Conference 02] 송민호 - 임베디드 시스템에서의 펌웨어 보호
[2008 CodeEngn Conference 02] 송민호 - 임베디드 시스템에서의 펌웨어 보호[2008 CodeEngn Conference 02] 송민호 - 임베디드 시스템에서의 펌웨어 보호
[2008 CodeEngn Conference 02] 송민호 - 임베디드 시스템에서의 펌웨어 보호
 
Amazon EC2 Deep Dive - 이창수 (AWS 솔루션 아키텍트) : 8월 온라인 세미나
Amazon EC2 Deep Dive - 이창수 (AWS 솔루션 아키텍트) : 8월 온라인 세미나Amazon EC2 Deep Dive - 이창수 (AWS 솔루션 아키텍트) : 8월 온라인 세미나
Amazon EC2 Deep Dive - 이창수 (AWS 솔루션 아키텍트) : 8월 온라인 세미나
 
Hardware Virtualization
Hardware VirtualizationHardware Virtualization
Hardware Virtualization
 
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
 
강좌 02 ARM 펌웨어 개발 환경 개요
강좌 02 ARM 펌웨어 개발 환경 개요강좌 02 ARM 펌웨어 개발 환경 개요
강좌 02 ARM 펌웨어 개발 환경 개요
 
[오픈소스컨설팅] OpenShift PaaS Platform How-to
[오픈소스컨설팅] OpenShift PaaS Platform How-to[오픈소스컨설팅] OpenShift PaaS Platform How-to
[오픈소스컨설팅] OpenShift PaaS Platform How-to
 
Virtualization technology for security
Virtualization technology for securityVirtualization technology for security
Virtualization technology for security
 
ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
Create document automatically (1)
Create document automatically (1)Create document automatically (1)
Create document automatically (1)
 
Service Worker 101 (한국어)
Service Worker 101 (한국어)Service Worker 101 (한국어)
Service Worker 101 (한국어)
 
150625 마이크로커널 운영체제 김지은
150625 마이크로커널 운영체제 김지은150625 마이크로커널 운영체제 김지은
150625 마이크로커널 운영체제 김지은
 
[E-commerce & Retail Day] 인공지능서비스 활용방안
[E-commerce & Retail Day] 인공지능서비스 활용방안[E-commerce & Retail Day] 인공지능서비스 활용방안
[E-commerce & Retail Day] 인공지능서비스 활용방안
 
가상화와 보안 발표자료
가상화와 보안 발표자료가상화와 보안 발표자료
가상화와 보안 발표자료
 
윈도우 커널 익스플로잇
윈도우 커널 익스플로잇윈도우 커널 익스플로잇
윈도우 커널 익스플로잇
 
Amazon SageMaker 모델 배포 방법 소개::김대근, AI/ML 스페셜리스트 솔루션즈 아키텍트, AWS::AWS AIML 스페셜 웨비나
Amazon SageMaker 모델 배포 방법 소개::김대근, AI/ML 스페셜리스트 솔루션즈 아키텍트, AWS::AWS AIML 스페셜 웨비나Amazon SageMaker 모델 배포 방법 소개::김대근, AI/ML 스페셜리스트 솔루션즈 아키텍트, AWS::AWS AIML 스페셜 웨비나
Amazon SageMaker 모델 배포 방법 소개::김대근, AI/ML 스페셜리스트 솔루션즈 아키텍트, AWS::AWS AIML 스페셜 웨비나
 
Red Hat Enterprise Virtualization
Red Hat Enterprise VirtualizationRed Hat Enterprise Virtualization
Red Hat Enterprise Virtualization
 

가상화된 코드를 분석해보자

  • 1. 가상화 기법으로 보호된 코드를 분석해보자 안재훈 (xxjh) dkswognsdi@gmail.com
  • 2. 목차 1) 소개 2) 개요 3) 코드 가상화 구조 4) 가상화 코드 분석 5) VM 명령어 추출 자동화 도구 개발
  • 4. 1. 개인 욕심 가상화로 보호 되어 있는 난독화 코드를 보면 포기하고 다른 루틴을 분석했던 나날..
  • 5. 2. 업무에 쏟아지는 가상화된 바이너리들.. 업무상 분석 해야 하는 파일들이 vmprotect로 많이 가상화 되어있었음.
  • 6. 2) 개요 다루고자 하는 내용 1. 코드 가상화의 구조 Initialize Routine Dispatch Routine Instruction Handler 코드 가상화를 위 세가지 영역으로 분류하여 각각 어떠한 역할을 수행하는 지 분석합니다. 2. CPU Emulator Framework를 활용한 코드 가상화 분석 도구 개발 Unicorn Engine과 Capstone Engine을 사용하여 실행되는 Instruction Handler를 추출하고 동적으로 분석하여 VM CPU영역에서 실행되는 코드들을 추출합니다. VMProtect 2.13.5 Maximum Speed 옵션 기준으로 내용을 다룹니다.
  • 7. 3) 코드 가상화 구조 Real CPU VM CPU Initialize Routine Dispatch Routine Handler1 Handler2 Handler3 Handler4 Handler..
  • 8. 4) 가상화 코드 분석 1. Real CPU 위 사진은 VMProtect SDK를 적용하고 아직 VMProtect로 보호하지 않은 함수의 코드입니다. 해당 코드들은 컴파일러가 생성한 때 묻지 않은 실행 코드들 입니다.
  • 9. 4) 가상화 코드 분석 2. VM CPU 위 코드는 VMProtect로 보호하여 코드 가상화가 적용된 코드입니다. .text:0041172F 주소에서 VM CPU로 제어권을 넘겨주는 것을 확인할 수 있습니다.
  • 10. 4) 가상화 코드 분석 2. VM CPU VM CPU 영역의 코드입니다. 코드가 대부분 난독화 되어있으며 CPU는 Bytecode를 기반으로 명령어를 해석 및 실행하는 가상머신 코드를 실행합니다.
  • 11. 4) 가상화 코드 분석 3. Initialize Routine Initialize Routine에서는 Bytecode Address를 Decode하는 작업을 수행합니다. 위 사진 기준으로 esp+50 위치에 Key가 존재하며 esi 레지스터를 기준으로 Decode 합니다.
  • 12. 4) 가상화 코드 분석 3. Dispatch Routine Dispatch Routine 에서는 Bytecode에 따른 VM Instruction Handler Address Decode 작업을 수행합니다. 그 후 Instruction Handler를 실행합니다.
  • 13. 4) 가상화 코드 분석 4. Insturction Handler
  • 14. 4) 가상화 코드 분석 4. Insturction Handler
  • 15. 4) 가상화 코드 분석 Instruction Handler는 쓰레기 코드들로 넘쳐납니다.
  • 16. 4) 가상화 코드 분석 Instruction Handler에서 최대한 의미 있는 코드들만 모아보면.. 엄청나게 양이 적어집니다.. 위 코드는 esi(Bytecode)에서 Encode 되어 있는 4바이트 값을 Decode 후 ebp(VM Stack) – 4 위치에 덮어씌워주는 코드입니다. sub esp,4 mov dword ptr ss:[esp], value 명령어는 push value 명령어와 같은 동작을 수행하기 때문에 위에서 봤던 엄청난 량의 코드들은 push imm32 명령어를 수행한겁니다. Instruction Handler에서는 원하는 동작을 다 수행하면 Dispatch Routine으로 되돌아 갑니다.
  • 17. 5) VM 명령어 추출 자동화 도구 개발 코드 가상화 기법으로 보호 되어있는 코드들은 엄청난 양의 코드들이 실행되기 때문에 수동으로 분석하기에는 어렵기도 하고 시간을 많이 투자해야 합니다. 우리의 시간은 소중하기 때문에 수동으로 분석하는 것 보다는 VM에서 실행하는 명령어들을 자동으로 추출해주는 도구를 개발하는 것이 몸에 이롭습니다. 저는 CPU Emulator Framework를 통해서 가상화된 영역을 에뮬레이팅 하여 분석에 필요한 정보를 추출했습니다.
  • 18. 5) VM 명령어 추출 자동화 도구 개발 준비물 CPU Emulator Framework Disassembly Engine IDE C/C++ 개발능력
  • 19. 5) VM 명령어 추출 자동화 도구 개발 CPU Emulator Framework Unicorn Engine IDE Visual Studio 2015 Disassembly Engine Capstone
  • 20. 5) VM 명령어 추출 자동화 도구 개발 VMProtect처럼 VM 코드가 엄청나게 난독화 되어있어도 몇 가지 규칙이 존재합니다. esi 레지스터를 통해 Bytecode를 관리한다는 것 Dispatch Routine에서 push ret 명령어로 Instruction Handler로 이동하는 것 ebp 레지스터를 VM Stack으로 사용한다는 것 위 세 개의 정보만으로도 Unicorn Engine을 통해서 많은 정보를 추출할 수 있습니다.
  • 21. 5) VM 명령어 추출 자동화 도구 개발 가상화 에뮬레이팅 전 필요한 정보들을 전부 설정해줍니다.
  • 22. 5) VM 명령어 추출 자동화 도구 개발 VM CPU 영역 진입 후 처음으로 실행되는 Ret 명령어의 주소를 기록합니다.
  • 23. 5) VM 명령어 추출 자동화 도구 개발 코드를 에뮬레이팅 하면서 아까 기록한 주소가 실행 될 때 실행되는 핸들러 정보와 레지스터 정보 가상 스택과 리얼 스택의 메모리 정보들을 저장해둡니다.
  • 24. 5) VM 명령어 추출 자동화 도구 개발 이제 가상화 영역을 전부 에뮬레이팅 하면 아래의 정보들을 전부 확인할 수 있습니다. 핸들러 정보 레지스터 정보 가상 및 리얼 스택 정보 위 정보들을 이용해서 다시 각각의 핸들러를 에뮬레이팅 할 수 있습니다. 핸들러를 에뮬레이팅 하면서 의미있는 코드만 추출해 필요한 정보와 실행 코드 패턴 매칭이 가능해집니다.
  • 25. 5) VM 명령어 추출 자동화 도구 개발 위 코드는 여러 정보를 이용해 핸들러를 에뮬레이팅 하고 추출한 패턴과 실행 코드 패턴과 매칭해 결과를 출력해주는 코드입니다.
  • 26. 5) VM 명령어 추출 자동화 도구 개발 핸들러 에뮬레이터는 전달 받은 정보를 레지스터 및 메모리 정보를 재설정합니다.
  • 27. 5) VM 명령어 추출 자동화 도구 개발 핸들러에서도 명령어를 처리하기 위해서는 Bytecode부터 읽어야하므로 메모리를 읽을 시 기록하는 레지스터를 저장합니다. 이제 기록된 레지스터 정보를 기반으로 의미 있는 코드를 추출합니다.
  • 28. 5) VM 명령어 추출 자동화 도구 개발 의미 있는 코드 추출
  • 29. 5) VM 명령어 추출 자동화 도구 개발 ebp는 VM Stack과 연관이 있기 때문에 추출합니다.
  • 30. 5) VM 명령어 추출 자동화 도구 개발 ret 명령어는 call Instruction 및 가상화 영역 탈출(vm exit) 때문에 추출합니다.
  • 31. 5) VM 명령어 추출 자동화 도구 개발 앞서 저장한 레지스터 정보가 포함되어 있으면 추출합니다.
  • 32. 5) VM 명령어 추출 자동화 도구 개발 핸들러의 모든 코드들을 추출했을 때의 모습입니다.
  • 33. 5) VM 명령어 추출 자동화 도구 개발 의미있는 코드들만 추출했을 때의 모습입니다.
  • 34. 5) VM 명령어 추출 자동화 도구 개발 모든 핸들러에서 의미 있는 코드들을 추출하여 패턴 정보를 작성합니다.
  • 35. 5) VM 명령어 추출 자동화 도구 개발 원본 코드 타입, 원본 코드, 패턴 정보, 추출 유무, 추출해야 할 정보가 포함되어있습니다.
  • 36. 5) VM 명령어 추출 자동화 도구 개발 엄청 간단한 명령어들만 가상화 했는데도 VM CPU 내부에서는 이렇게 많은 명령어들이 에뮬레이팅 됩니다.
  • 37. 5) VM 명령어 추출 자동화 도구 개발 이제 모든 패턴을 매칭시켜 VM에서 에뮬레이팅 되는 코드들을 추출해보면?..
  • 38. 5) VM 명령어 추출 자동화 도구 개발 아.. 저는 컴파일러가 생성한 원본 코드가 나올 줄 알았습니다.
  • 39. 5) VM 명령어 추출 자동화 도구 개발
  • 40. 5) VM 명령어 추출 자동화 도구 개발 그래도 사람이 읽기 쉬운 가공된 코드가 출력됩니다. 호출하는 API 및 함수 목록도 확인 가능하기 때문에 가상화 영역 내에서 OS 의존적인 동작을 수행할 경우 확인이 가능합니다.
  • 41. 5) VM 명령어 추출 자동화 도구 개발 Q & A
  • 42. 5) VM 명령어 추출 자동화 도구 개발 감사합니다.
  • 43. 5) VM 명령어 추출 자동화 도구 개발 Thank you for dbghlpr https://github.com/dbghlpr/pegasus Windbg emulation plugin