가상머신 탐지
이 문서의 테스트 환경은 다음과 같다.
Host OS |
Windows 8.1 K x64 |
VMware Workstation Version |
11.0.0 build-2305329 |
Guest OS(VS2010 installed) |
Windows XP Professional K SP3 x86 |
Guest OS(TEST VICTIM) | Windows XP Professional K SP3 x86 |
이 문서의 기법들은 위 환경에서 모두 테스트되었다.
개요
악성 소프트웨어(멀웨어; Malware)들은 사용자의 컴퓨터 사용환경 자체를 감염시켜 문제를 일으키므로, 가상머신 같은 독립 환경을 구축하여 안전하게 샘플을 분석하게 된다.
악성 소프트웨어는 이런 가상환경 내에서 자신이 동작하고 있다는 것을 알아챔으로써, 분석당할 것임을 눈치챌 수 있으며 숨거나 스스로를 제거하는 등의 행동을 취한다.
악성코드 외에도 한 대의 PC에서 여러 접속을 허용하지 않도록 제한하는 온라인 게임 등의 상용 프로그램이 가상머신 우회 기법을 포함하는 패커 등을 이용하기도 한다.
가상화 프로그램
널리 사용되는 유명한 가상화 프로그램들은 가상머신을 우회하는 기법들의 주요 대상이 된다.
- VMware Workstation
- Parallels Desktop(맥 전용)
- Oracle VirtualBox
- Windows Virtual PC
이 문서의 대부분은 VMware Workstation에 대해 다룬다.
소스 코드에 관하여
Visual Studio 2010 Ultimate SP1로 작성하였으며,
테스트 OS에는 Visual Studio가 설치되어있지 않으므로 MSVCR100.dll 라이브러리 파일이 존재하지 않아 테스트 프로그램이 실행되지 않는다.
이에 따라 프로젝트 속성 - 구성 속성 - C/C++ - 코드 생성 - 런타임 라이브러리의 옵션을 다중 스레드 (/MT)로 하여 릴리스 모드시 정적링크하도록 컴파일하였다.
실행파일의 크기가 커지는 것은 감수하기로 한다.
다음으로 C 런타임 라이브러리의 사용을 자제하기 위하여 C 관련 함수는 최대한 사용하지 않았다.
상세
프로세스 이름Process
Process32First(), Process32Next() 등의 프로세스 열거 API 함수로 프로세스 이름을 열거하고, 가상 머신에서 동작하는 특정 프로세스가 있는지 찾는다.
가상머신 내에서 실행중인 프로세스 중 검사를 위한 알려진 이름들은 다음과 같다.
vmsrvc.exe, vmusrvc.exe, vboxtray.exe, vmtoolsd.exe, df5serv.exe, vboxservice.exe 등
레지스트리Registry
레지스트리 질의 API를 사용
VMware Workstation 전용
VMware는 다음 경로들에 가상 디스크 컨트롤러를 위한 레지스트리 키를 만든다.
Vmware 문자열을 검색하여 VMware 환경에서 동작중인지 조사한다.
다음과 같이 여러곳에서 "VMware"가 포함된 문자열이라는 레지스트리 흔적들을 찾을 수 있으며 이를 이용하여 가상머신 환경을 판별한다.
종류 |
시스템 |
경로 |
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum |
서브키 |
0 |
값(XP 게스트 환경 기준) |
IDE\DiskVMware_Virtual_IDE_Hard_Drive___________00000001\3030303030303030303030303030303030303130 |
값(8.1 호스트 환경 기준) |
SCSI\DiskRomex___RAMDISK_________2011\1&1a590e2c&0&000 |
종류 |
시스템 |
경로 |
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000 |
서브키 |
DriverDesc |
값(XP 게스트 환경 기준) |
VMware SVGA II |
값(8.1 호스트 환경 기준) |
Intel(R) HD Graphics Family |
종류 |
시스템 |
경로 |
위와 동일 |
서브키 |
ProviderName |
값(XP 게스트 환경 기준) |
VMware, Inc. |
값(8.1 호스트 환경 기준) |
Intel Corporation |
종류 |
시스템 |
경로 |
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\IDE |
서브키 |
Vmware 관련 하위 키들이 존재 |
종류 |
하드웨어 |
경로 |
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0 |
서브키 |
Identifier |
값(XP 게스트 환경 기준) |
VMware Virtual IDE Hard Drive |
값(8.1 호스트 환경 기준) |
Romex RAMDISK 2011 |
종류 |
하드웨어 |
경로 |
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi\Scsi Port 1\Scsi Bus 0\Target Id 0\Logical Unit Id 0 |
서브키 |
Identifier |
값(XP 게스트 환경 기준) |
NECVMWar VMware IDE CDR10 |
값(8.1 호스트 환경 기준) |
SAMSUNG MZMTE128HMGR-000EXT4 |
종류 |
소프트웨어 |
경로 |
HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet |
서브키 |
Vmware 관련 하위 키가 존재 |
예전 소스 코드 작성시에는 RegQueryValue() 를 사용하였으나 최근 제대로 작동하지 않아 RegQueryValueEx() 로 변경하여 테스트하였다.
사이클 측정Timing based
x86 CPU에는 64비트 크기의 TSC(Time Stamp Counter) 레지스터가 있으며, RDTSC(ReaD Time Stamp Counter) 어셈블리 명령을 통해 TSC를 읽어 EDX:EAX 형태로 반환해서 저장한다.
TSC
컴퓨터가 리셋된 이후의 사이클을 측정(counts)한다.
[위키백과] http://en.wikipedia.org/wiki/Time_Stamp_Counter
두 개의 사이클 측정 명령어 수행시 발생하는 서로간의 차이를 토대로 가상환경을 판단한다.
호스트 PC(Physical Computer)는 대개 100 미만의 TSC 차이값을 갖고, 에뮬레이트(Emulated)되는 코드는 그와 다르게 아주 큰 차이값을 가진다.
(테스트 시 아주 가끔씩 100 이하의 값이 측정되기도 하였으나 대부분 천 단위 ~ 만 단위 이상 값을 가짐)
printf()를 사용하여 직접 ulTime2 - ulTime1 값을 출력해서 테스트 해보면 실제로 차이를 느낄 수 있다.
백도어 I/O 포트Backdoor I/O Port
VMware Workstation, VMware Fusion, Virtual PC, Parallels 등과 같은 대부분의 가상 머신 소프트웨어에서 하이퍼바이저는 게스트 운영체제와 통신할 수 있는 백도어를 사용한다.
VMware의 게스트 운영체제와 통신하는데 사용되는 하이퍼바이저 VMX 백도어의 존재를 확인하는 방법은 공식 문서화된 방법으로 제공된다(VMware provides official documented ways of VM detection). 즉 이미 공론화 된 방법이라고 할 수 있다(VirtualPC 및 VirtualBox에는 해당되지 않는다).
인텔 x86에서 I/O 작업을 위하여 정의한 명령어 중 'IN'과 'OUT'이 있다.
이들 명령어는 보통 I/O 포트(즉 디바이스, 모뎀, 연결된 컴퓨터)로부터 바이트, 워드 또는 더블워드(dword) 데이터를 읽거나 내보낼 목적으로 사용된다.
이 명령은 CPL(현재 실행 권한; Current Privilege Level)이 IOPL(입출력 권한; I/O Privilege Level)권한보다 높아야 실행할 수 있다. 대부분의 운영체제는 IOPL을 0으로 정의한다.
즉 커널 레벨(Ring 0)에서만 접근 가능하며, 따라서 사용자 레벨(Ring 3)의 어플리케이션에서 IN 또는 OUT 명령 접근에 시도하면 예외가 발생한다.
하지만 가상머신은 Ring 3레벨에서 접근하여도 예외가 발생하지 않는다. 자세한 사항은 소스코드를 참고한다.
CPU 코어 수Number of cores
대개 멀웨어 분석은 단일 프로세스 코어가 할당된 샌드박스에서 이루어진다.
그러나 오늘날 대부분의 컴퓨터들은 멀티코어를 갖추고 있다.
Process Environment Block을 체크함으로써 CPU 코어 수를 찾을 수 있다.
이것은 사소한 방법인 것처럼 보일 수 있지만, 의외로 허를 찌르는 것일 수도 있을 것이다.
디스크립터 테이블 레지스터Descriptor Table Registers
SIDT(Store Interrupt Descriptor Table)를 이용하는 Red Pill 이라는 유명한 가상머신 탐지 기법이 소개된 후 SLDT, SGDT, STR, SMSW 등을 이용한 기술이 여러 공개되었으나 VMware가 업데이트 됨에 따라 더 이상 적용되지 않는다.
Redpill.exe, ScoopyNG.exe 등이 이 기법을 사용했다.
Red Pill을 기본으로 하여 이 방법의 기본적인 골자는 아래 링크에 자세히 설명되어 있으니 참조하라.
Red Pill and More https://www.bpak.org/blog/2009/07/red-pill-and-more/
아래에서는 추가로 설명한다.
80486에서 GDTR, LDTR, IDTR레지스터가 새로 추가되었다.
IDTR과 GDTR은 시스템 테이블 레지스터이다.LDTR은 시스템 세그먼트 레지스터이다.
IDTR, GDTR, LDTR
리얼모드 & 보호모드 http://manggong.org/41
시스템 디스크립터 http://egloos.zum.com/anster/v/2138204두서없는 보호모드 입문강좌 http://mdhlife.tistory.com/70
CPU는 셀렉터를 참고하여 세그먼트의 선두번지(32비트)를 구한 다음 이 값에 오프셋(32비트)를 더해서 실제 번지(32비트)를 얻는다.
기본적인 IDT 베이스값은 다음과 같다.
Host Operating Systems |
Windows |
0x80FFFFFF |
Linux |
0xC0FFFFFF | |
VirtualPC guest machines |
0xE8xxxxxx | |
VMware guest machines |
0xFFxxxxxx |
그러나 호스트 OS와 게스트 OS간의 충돌을 피하기 위해, 가상 머신은 IDT, GDT, LDT를 다음과 같이 재배치 한다.
Instruction |
VMware |
Host PC(Windows) |
Host PC(Linux) |
SIDT |
IDT는 일반적으로 0xFFxxxxxx에 위치 |
IDT는 보다 낮은 위치에 있다. 약 0x80FFFFFF |
0xC0FFFFFF |
SLDT |
0xdead0000에 위치하지 않는다 |
|
|
SGDT |
GDT는 IDT와 동일 | ||
STR |
TR의 셀렉터 세그먼트 값은 0x40000000 other |
TR의 셀렉터 세그먼트 값은 0x40000000 |
|
다시 말하지만 이 기술은 요즘의 VMware 버전에서는 차단되어 동작하지 않는다.
참고문헌
웹페이지
Anti-VM 기법이 적용된 악성코드 분석 및 우회 방법 연구 http://moaimoai.tistory.com/127
PEB구조체 http://dbckdgns0515.tistory.com/entry/PEB-%EA%B5%AC%EC%A1%B0%EC%B2%B4
영)Department of Computer Science and Engineering http://slidegur.com/doc/1193135/slides---department-of-computer-science-and-engineering
영)Anti-debugging and Anti-VM techniques and anti-emulation http://resources.infosecinstitute.com/anti-debugging-and-anti-vm-techniques-and-anti-emulation/
영)The Dead Giveaways of VM-Aware Malware https://www.fireeye.com/blog/threat-research/2011/01/the-dead-giveaways-of-vm-aware-malware.html
영)Just Another VM Detection http://m.blog.csdn.net/blog/lionzl/5852913
영)How does malware know the difference between the virtual world and the real world? http://vrt-blog.snort.org/2009/10/how-does-malware-know-difference.html
영)Breaking the SandBox https://www.exploit-db.com/docs/34591.pdf
영)Five Anti-Analysis Tricks That Sometimes Fool Analysts http://www.infosecisland.com/blogview/24011--Five-Anti-Analysis-Tricks-That-Sometimes-Fool-Analysts-.html
문서
영)Virtual Machines Detection Enhanced http://artemonsecurity.com/vmde.pdf
영)On the Cutting Edge:Thwarting Virtual MachineDetection http://handlers.sans.org/tliston/ThwartingVMDetection_Liston_Skoudis.pdf
'IT Security' 카테고리의 다른 글
[역공학] Reversing.Kr (0) | 2015.11.07 |
---|---|
[취약점] 해커스쿨 LOB_Redhat (0) | 2015.09.02 |
[취약점] 해커스쿨 FREE TRAINING ZONE(FTZ) (0) | 2015.08.28 |
Themida Anti VM Bypass (3) | 2015.06.25 |