미친해커

[WoW] 32Bit 응용 프로그램에서의 Kernel 함수 호출 본문

Windows/Heaven's Gate (Windows on Windows x64)

[WoW] 32Bit 응용 프로그램에서의 Kernel 함수 호출

미친해커 2022. 5. 4. 00:35
반응형

Windows 64Bit에서 32Bit 응용 프로그램을 실행하고 디버거로 커널 함수의 어셈블리를 확인하면 대부분 다음과 같은 형식을 띄게 된다.

mov    eax, 0x00000026              # Windows System Call Number
mov    edx, Wow64SystemServiceCall  # 64비트 모드 전환 함수
call   edx                          # 모드 전환 함수 호출
ret                                 # 리턴

우리가 알고 있는 커널 함수의 호출은 syscall 어셈블리를 사용해 커널에 호출하게 된다. 하지만 Windows on Windows로 돌아가고 있는 32Bit 응용 프로그램은 syscall이 아닌 Wow64SystemServiceCall 이라는 함수를 호출하고 있다. 해당 함수는 Windows 64Bit 운영체제의 32Bit용 ntdll.dll에 존재하는 함수로써 32Bit 응용 프로그램이 커널 함수를 호출하면 해당 호출을 가로채게 된다.

그 이유는 응용 프로그램은 32비트이지만 커널은 64비트로 동작하기 때문에 32Bit 응용 프로그램이 직접적으로 커널에 요청하지 못하도록 한다. 대신 Wow64SystemServiceCall 함수를 통하여 64비트 모드로 변경 후에 syscall 수행하고 다시 32비트 모드로 변경해 해당 반환값을 전달해준다.

jmp dword ptr ds:[Wow64Transition] # Wow64Transition = wow64cpu.dll + 0x6000

Wow64SystemServiceCall은 x86 ntdll.dll의 Wow64Transition이라는 전역변수의 값을 참조하여 wow64cpu.dll의 어느 공간으로 점프한다. 해당 주소는 wow64cpu.dll + 0x6000 주소로 점프한다. 치트엔진으로 해당 주소를 가보면 다음과 같은 어셈블리어를 볼수 있다.

해당 어셈블리를 확인해보면 처음보는 jmp insturction과 x64 시스템의 레지스터와 어셈블리어를 사용하는 것을 확인할 수 있었다.

 

이로써 32Bit 응용 프로그램은 64Bit로 모드를 전환하여 무언가를 수행한다는 것을 확인할 수 있었다. 

반응형
Comments