Heaven's Gate 기법 분석

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 관련 모듈의 도움으로 가능하다.

32 비트 native 프로세스(좌), WOW64 프로세스(우) 의 ntdll API 호출

이 과정에서 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 코드
Heaven's Gate 코드 목적지

위 코드와 같이 정상적인 용도로 사용되는 Heaven's Gate 는 WOW64 모듈의 영역으로 점프하지만, 악성코드는 위 기법을 이용하여 64비트 모드로 스위칭 후, 64비트 악성 코드가 존재하는 위치로 점프하여 악성 행위를 실행한다.

일반적인 32비트 디버거는 64비트로 스위칭되면 컨트롤할 수 없기 때문에 동적 디버깅이 불가능하다. 반면, 64비트 디버거는 WOW64 프로세스를 실행할 수도, attach 할 수도 없다.

아래 코드는 Heaven's Gate 기법을 이용한 악성 코드를 보여준다. 이 코드는 64비트 모드로 스위칭한 후, 64비트 악성 코드를 실행하고 다시 32비트 모드로 스위칭한다.

Heaven's Gate 에 의해 실행되는 64 비트 코드

분석 도구

정적 분석

정적 분석은 특별한 방법이 없다. 분석가가 보고 싶은 내용은 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 에 대해 동적 디버깅이 가능하다.

windbg 로 Heaven's Gate 코드 추적