들어가기 전에


멀웨어 코더들은 분석을 방해할 목적으로 안티 가상머신 기법을 사용한다. 이 기법을 이용해 악성코드가 가상머신 내에 실행 여부를 탐지할 수 있으며, 가상 머신을 탐지하면 악성코드는 원래와 다르게 실행하거나 전혀 실행하지 않는다. 여기서는 일반적으로 VMware를 대상으로 하는 안티 가상머신기법에 대하여 알아볼 것이다.



VMware Artifacts


VMware환경은 시스템에 많은 흔적을 남기며, 특히 VMware Tools를 설치했을 경우 그렇다.악성코드는 파일 시스템이나 레지스트리, 프로세스 목록에 존재하는 흔적을 VMware를 탐지하는데 사용한다.

아래의 그림은 VMware를 설치해놓고 사용을 했던 나의 PC의 프로세스 목록이다. 확실히 많은 프로세스가 실행 중임을 알 수 있고, 이들 중 하나를 선택하여 악성코드는 프로세스 목록에서 VMwae와 관련된 문자열을 검색하는 방식으로 탐지가 가능하다.



프로세스 목록 뿐만 아니라 시스템에 설치한 서비스를 찾기 위해 레지스트리를 검색하거나 다음 명령어를 사용하여 서비스 목록에 위치한 VMware와 관련된 항목들을 나열할 수가 있고 이를 통하여 악성코드는 가상 머신의 여부를 확인할 수가 있다.

또한 가상머신은 다양한 방법으로 네트워크에 연결할 수 있는데, 이 모든 방시은 가상머신이 고유의 가상 네트워크 인터페이스 카드(NIC)를 가진다. VMware가 NIC를 가상화하려면 가상머신의 MAC 주소를 만들어야하며, 설정에 따라 네트워크 어댑터를 이용해 VMware 사용 여부도 확인할 수 있다.

MAC 주소의 처음 3 바이트는 일반적으로 업체를 명시하는데, VMware는 00:0C:29로 시작하는 MAC 주소를 할당한다(*하지만 내 PC에서 확인해본 결과 00-50-56으로 시작하였다. 일반적으로 버전마다 변한다.).



Bypassing VMware Artifact Searching

Vmware 흔적을 검색하는 악성코드 무력화는 일반적으로 간단히 검사확인과 패치 두 단계를 거친다. 예를 들어 아래의 그림을 보자. 악성코드가 프로세스 목록을 가져 온 뒤 Vmware와 관련이 있는 문자열 "VMwareTray.exe"를 가져온 후 strncmp 함수를 호출하여 악성코드가 가상 머신의 여부를 판단할 수가 있다.

이 탐지를 피하기 위해서는 4010A5에 있는 점프를 실행하지 않게 디버깅 도중에 바이너리를 패치하거나 해당 문자열을 수정하여 걸리지 않도록하는 등 회피 방법이 존재하고 있다.


Checking for Memory Artifacts

VMware는 가상화 프로세스의 결과로 메모리에 많은 흔적을 남긴다. 일부는 중요한 프로세서 구조인데, 가상머신에서 이를 이동하거나 변경해서 인지할 수 있는 흔적을 남기기 때문이다. 일반적으로 메모리 흔적을 탐지할 때 사용되는 기술은 물리적 메모리에서 문자열 VMware을 탐지하는 방식으로 발견한 흔적에서 수백개의 문자열을 탐지해 낼 수 있다.



Vulnerable Instructions


가상머신 모니터 프로그램은 가상머신의 실행을 모니터링한다. 이는 가상 플랫폼과 함께 게스트 운영체제를 나타낼 수 있게 호스트 운영체제 이ㅜ에서 동작한다. 이 역시 악성코드가 가상화를 탐지할 수 있는 일부 보안 취약점을 갖고 있다.

일부 x86 명령어는 하드웨어 기반 정보에 접근하지만 인터럽트를 생성하지 않는다. 그런 명령어에는 sidt, sgdt, sldt, cupid 등이 있다. 이 명령어를 적절히 가상화시키려면 VMware는 모든 명령어에서 바이너리 해석하는 과정이 필요한데, 이는 결과적으로 엄청난 성능 저하를 가져온다. 이러한 성능 저하를 막기 위해 VMware는 특정 명령어의 경우 제대로 가상화하지 않고 실행한다.


Using the Red Pill Anti-VM Technique

레드 필은 sidt 명령어를 실행해서 IDTR 레지스터 값을 얻는 안티 VM 기법이다. 가상 모니터는 게스트의 IDTR을 재배치해서 호스트의 IDTR과 충돌을 피해야한다. 가상머신 모니터는 가상머신이 sidt 명령어를 실행하는 시점을 알지 못하므로 가상머신의 IDTR을 반환한다. 레드 필은 이 불일치함을 테스트해서 VMware의 사용 여부를 탐지한다.

악성코드는 sidt 명령어를 이용해 EAX가 가리키는 메모리 위치로 IDTR 내용을 저장한다. IDTR은 6바이트이고 다섯번째 바이트 오프셋이 베이스 메모리 주소 시작점을 갖고 있다. 다섯 번째 바이트를 VVMware 시그니처인 0xFF와 비교한다.

이러한 레드 필은 단일 프로세서를 사용하는 장비에서만 성공한다. 그러므로 멀티프로세서 장비에서 실행하거나 sidt 명령어를 삭제하면 우회가 가능하다.


Using the No Pill Technique

VMware 탐지에 사용하는 sgdt와 sldt 명령어 기법은 주로 No Pill로 알려져있다. 레드필과는 다르게 LDT 구조체를 운영체제가 아닌 프로세서에 할당한다는 사실에 의존한다. 호스트 머신에서 LDT 위치는 0이고, 가상머신에서는 0이 아니다. sldt 방식은 가속 기능을 비활성화해서 VMware에서 사용하지 못하게 할 수 있다. 이를 위해 VM > Settings > Processors를 선택하고 Disable Acceleration 체크박스에 체크한다.


Querying the I/O Communication Port

현재 사용하는 가장 대중적인 안티VMware 기법은 I/O 통신 포트를 질의하는 방식일 것이다. Vmware는 가상 I/O 포트를 이용해 가상머신과 호스트 운영체제 사이에서 두 시스템 간의 복사와 붙여넣기 같은 기능을 지원한다. 포트를 질의하고 VMware 사용을 식별하는 매직넘버와 비교할 수 있다.

VMware는 명령어 사용을 모니터링하고 통신 채널 포트 0x5668(VX)로 목적지 I/O를 캡처한다. 따라서 두번째 오퍼랜드는 VMware를 확인할 목적으로 VX를 로드할 필요가 있으며, EAX 레지스터는 매직 넘버인 0x564D5868(VMXh)을 로드한다.

우선 악성코드는 매직 넘버인 0x564D5868을 1의 EAX 레지스터로 로드한다. 그 후 ECX는 0xA 값을 로드해서 VMware 버전 유형을 알아낸다. 2에서는 해당 값을 통해 VMware I/O 통신 포트를 지정하는 in 명령어에 사용한다. 실행시 in 명령어는 가상머신이 트랩해서 실행을 에뮬레이션한다. 3에서 코드가 가상 머신 동작 여부를 확인한다.

이 기법을 우회하는 가장 간단한 방법은 in 명령어를 NOP 처리하거나 조건부 점프를 패치해서 비교 결과와 상관없이 점프하는 방식이다.


Using the str Instruction

str 명령어는 실행중인 TSS(Task State Segment)를 가리킨다. 악성코드 제작자는 str 명령어가 가상머신과 실제 시스템이 다른 값을 반환한다는 사실을 이용해 이 명령어로 가상머신 존재여부를 탐지한다.


Anti-VM x86 Instructions

지금까지 안티 VM 기법에 이용하는 악성코드의 가장 일반적인 명령어를 살펴봤다. 이 명령어에는 다음과 같은 것들이 있다.

-sidt    -sgdt    -sldt    -smsw    -str    -in    -cpuid

악성코드는 전형적으로 VMware 탐지를 수행하지 않는 경우 이 명령어를 실행하지 않으며, 탐지 우회는 역시 이 명령어 호출을 피하는 바이너리로 패치만 하면 되므로 간단하다. 이 명령어는 기본적으로 사용자 모드에서 실행할 경우 무의미하므로 이 명령어가 보이면 안티 VMware 코드의 일부일 가능성이 있음을 알 수 있다.


요약


- 프로세스 목록    - 서비스와 레지스트리    - MAC 주소

- sidt, sgdt, sldt, cpuid    - in 통신포트 VMxh, VX, 0x5668, 0x564D5868    - str 명령어



'Reversing > Theory' 카테고리의 다른 글

Packer  (0) 2015.09.05
Contents of the TIB (32-bit Windows)  (0) 2015.09.04
Anti Debugging  (0) 2015.09.03
Anti disassembly  (0) 2015.09.01
DLL Injection  (0) 2015.08.29