Heaven's Gate 기법 분석

Heaven's Gate 는 32 비트 프로세스에서 64 비트 코드를 실행하는 기법으로, 안티 디버깅 기법으로서 널리 사용된다. 일반적인 디버깅 프로그램으로는 Heaven's Gate 기법으로 실행되는 코드를 동적으로 분석할 수 없기 때문에 이것을 이해하지 못하면 분석가의 의지와 상관 없이 디버거가 Run 하다가 프로그램이 종료되는 모습을 보게 될 것이다.
Windows on Windows 64-bit
Heaven's Gate 기법을 설명하기에 앞서 WOW64 (Windows on Windows 64-bit)에 대해 이해할 필요가 있다. WOW64 는 64비트 Windows OS 에서 32 비트로 빌드된 응용 프로그램을 실행할 수 있도록 돕는 서브 시스템이다. 64 비트 OS 에서 실행된 32 비트 프로세스는 레지스터, 주소 체계, 등의 문제로 인해 직접적으로 시스템 콜을 호출할 수 없으나, 64 비트 모드로 스위칭 후 WOW64 관련 모듈의 도움으로 가능하다.

이 과정에서 WOW64 모듈 실행 전 64 비트 모드로 스위칭하는 코드를 이용하는 것을 Heaven's Gate 라고 부른다. 실행 모드를 스위칭하기 위해선 CS 레지스터 값을 변경해야하나, 일반적인 방법으론 변경 불가능하며 jmp far
, call far
, ret far
명령어를 통해서만 가능하다. 각 모드에 대한 CS 레지스터 값은 다음과 같다.
모드 | CS 값 |
---|---|
32 비트 native | 0x1B |
32 비트 WOW64 | 0x23 |
64비트 native | 0x33 |
예를 들어 아래 코드는 CS 레지스터 값을 0x33 으로 변경하여 64 비트 모드로 스위칭하고, wow64cpu.dll 의 주소에 속한 0x7407271E 로 점프하는 Heaven's Gate 코드이다.


위 코드와 같이 정상적인 용도로 사용되는 Heaven's Gate 는 WOW64 모듈의 영역으로 점프하지만, 악성코드는 위 기법을 이용하여 64비트 모드로 스위칭 후, 64비트 악성 코드가 존재하는 위치로 점프하여 악성 행위를 실행한다.
일반적인 32비트 디버거는 64비트로 스위칭되면 컨트롤할 수 없기 때문에 동적 디버깅이 불가능하다. 반면, 64비트 디버거는 WOW64 프로세스를 실행할 수도, attach 할 수도 없다.
아래 코드는 Heaven's Gate 기법을 이용한 악성 코드를 보여준다. 이 코드는 64비트 모드로 스위칭한 후, 64비트 악성 코드를 실행하고 다시 32비트 모드로 스위칭한다.

분석 도구
정적 분석
정적 분석은 특별한 방법이 없다. 분석가가 보고 싶은 내용은 Heaven's Gate 기법 도중 실행되는 64비트 코드이니, 해당 코드를 잘라내어 x64dbg, IDA, ghidra 와 같이 정적 분석이 가능한 툴로 해석하면 된다.
앞서 설명했듯이, 모드 스위칭은 jmp far
, call far
, ret far
명령어에 의해 발생되며, CS 레지스터 값이 0x33 이면 64비트로 모드 스위칭, 0x23 이면 32비트 WOW64 로 모드 스위칭이니, 이러한 점을 고려하여 코드를 잘라서 해석해야 한다.
동적 분석
앞서 언급했듯이, 일반적으로 32비트 디버거는 64비트 스위칭된 상태에서 컨트롤이 불가능하며, 64비트 디버거는 WOW64 프로세스를 실행하거나 attach 할 수 없다. 하지만 유일하게 64비트 windbg는 64비트 모드로 스위칭해도 컨트롤이 가능하여 Heaven's Gate 에 대해 동적 디버깅이 가능하다.
