본문 바로가기

악성코드 정보

GandCrab v5.2 랜섬웨어에서 사용된 동적분석 우회기법

최근 활발히 유포되고 있는 Gandcrab 랜섬웨어에서는 동적 분석 장비를 우회하기 위한 코드가 삽입되어 있다. 이로 인해 동적 분석 장비에서 제대로 동작하지 않고 종료되거나 시간 지연을 통해 분석에 다수의 시간이 소요되도록 하여 탐지를 우회 하고 있다.


현재 확인된 동석 분석 장비 우회 코드는 아래와 같다.


- SetErrorMode 함수를 통한 Anti-Sandbox

- SetTimer 함수를 통한 시간 지연



1. SetErrorMode 함수를 통한 Anti-Sandbox


먼저 Gandcrab 에서 주로 사용하는 Packer 에서는 [그림-1]과 같이 SetErrorMode 함수를 활용하여 Cuckoo Sandbox를 우회 하도록 하는 코드가 존재한다.


[-1] SetErrorMode를 통한 Anti-Sandbox


SetErrorMode 함수는 ProcessDefaultHardErrorMode를 설정하고, 이전에 설정된 ErrorMode를 반환하는 함수이다. ErrorMode는 시스템에서 오류가 발생 했을 때 처리하는 방법에 대해 설정한다. 이 때 [그림-1] 의 코드를 보면 일반적인 상황에서는 아래와 같은 흐름을 보인다.


[그림-2] 일반적인 상황에서의 실행 흐름


(1) SetErrorMode(0x400)

- ErrorMode로 0x400을 설정 하고, 이전에 설정된 ErrorMode 값을 반환 받는다.


(2) SetErrorMode(0x0)

- ErrorMode로 0x0을 설정하고, 바로 이전에 설정된 1번의 인자 값 0x400을 반환 받는다.


(3) CMP, JE, ExitProcess

- (2)의 결과로 반환 받은 값 0x400이 1번의 인자 값으로 사용된 0x400 과 같은지 확인하여 분기(랜섬웨어 실행) 한다.


여기서 문제가 되는 것은 Cuckoo Sandbox 등에서 활용되고 있는 SEM_NOALIGNMENTFAULTEXCEPT (0x0004) ErrorMode 이다. 

(출처 : https://github.com/cuckoosandbox/monitor/blob/master/bin/monitor.c)


[그림-3] Cuckoo Sandbox 에서 활용되는 ErrorMode


해당 값은 Memory alignment fault를 자동으로 수정하도록 하는 값으로, 한번 설정 시 이후에 해당 값을 초기화 하려는 시도를 무시하는 특성이 있다. 이로 인해 해당 ErrorMode 가 설정된 이후 [그림-1] 코드의 흐름은 앞서 보이는 [그림-2] 흐름과 달라지게 되며, 아래의 [그림-4]와 같은 흐름을 갖게 된다.


[그림-4] SEM_NOALIGNMENTFAULTEXCEPT 가 설정된 환경에서의 실행 흐름


(1) SetErrorMode(0x400)

- ErrorMode로 0x400을 설정하려 하지만 앞서 설정된 SEM_NOALIGNMENTFAULTEXCEPT 를 초기화 하려는 시도가 무시되고 0x404가 설정 된다. 반환 값은 [그림-3] 설정으로 인해 0x8007을 반환 받는다.


(2) SetErrorMode(0x0)

- ErrorMode로 0x0을 설정하려 하지만 앞서 설정된 SEM_NOALIGNMENTFAULTEXCEPT 를 초기화 하려는 시도가 무시되고 0x4가 설정 된다. 반환 값은 1번에 의해 설정된 0x404 를 반환 받는다


(3) CMP, JE, ExitProcess

- (2)의 결과로 반환 받은 값 0x404은 1번의 인자 값으로 사용된 0x400 과 달라 프로세스를 종료한다.


이와 같이 SetErrorMode 함수를 활용하여 Sandbox를 감지하고 프로세스 종료를 통해 동적 분석 장비에서 정확한 결과가 나오지 않도록 방해하는 기법이 존재한다.



2. SetTimer 함수를 통한 시간 지연


다음은 SetTimer 함수를 이용하여 GandCrab의 주요 암호화 동작을 일부 시간 후에 발생시키는 부분에 대하여 설명하고자 한다. SetTimer를 설정하고 실행시키는 방법으로 해당 GandCrab에서는 윈도우 프로시저 및 메시지를 이용하였다. 


‘AnaLab_sucks'이라는 클래스명으로 윈도우 프로시저를 생성하고, 해당 프로시저가 SetTimer의 기능을 하도록 한다. 이 때 GandCrab에서는 1.337초의 타이머를 설정한다.


[그림-5] CreateWindowExW 를 통해 윈도우 프로시저 생성


[그림-6] SetTimer 1337ms 설정


그리고 DispatchMessage 함수를 통해 'AnaLab_sucks'라는 프로시저가 호출되도록 하는데, 위와 같이 'AnaLab_sucks'는 SetTimer를 수행되도록 했기 때문에 DispatchMessage로 'AnaLab_sucks'를 발생시킬 때마다 1.337초의 지연이 발생된다. 


최근 유포중인 GandCrab에서는 DispatchMessage20번 발생시키기 때문에 26.74초의 지연이 발생한다.


[그림-7] DispatchMessageW'AnaLab_sucks' 프로시저 호출

[그림-8] 20(0x14)번 발생 체크 후 KillTimer로 지연 종료


이렇게 시간 지연을 의도적으로 발생 시킴으로써 동적 분석 장비의 즉각적 모니터링 탐지를 어렵게 한다. 자사에서는 지속적 확인 및 분석을 통해 최신 파일들이 우회되지 않고 탐지 될 수 있도록 신속히 적용 및 대응 중이다.


GandCrab은 현재 V3에서 다음과 같이 진단하고 있다.


파일진단 : Trojan/Win32.GandCrab

행위진단 : Malware/MDP.Ransom.M1711