본문 바로가기
Security/Windows System

64 Windows커널 진입 차이 : 유저모드편

by Winduck 2018. 4. 12.
반응형

최근에 x64를 보면서 x86과 커널진입이 다른것을 발견하게 되어 정리하게 되었다....

본내용은 x64에서의 커널진입과 x86과의 차이점에 대해서 이야기해본다. (분석환경 : Windows 7 x86/x64)



먼저, x86에서 커널진입에 대해서 알아보도록 한다. 그 예로  Kernel32.CreateFileA x86의 커널진입은 다음 그림과 같다.


진입순서 : Kernel32!CreateFileA -> Kernel32!CreateFileW -> ntdll!ZwCreateFile -> ntdll!KiFastSystemCall()로 진입하게 된다.

큰 특징으로는 커널진입 이전에 ntdll!KiFastSystemCall을 지나야 한다는 점이다. 그러나 ntdll!KiFastSystemCall는 유저레벨에서 커널진입하기전 최하위 함수는 아니다. 위 그림에서 나오진 않았지만 ntdll!KiFastSystemCall의 내부에는 최종적으로 sysenter를 통하여 커널진입을 한다.



그러면 x64의 경우, Kernel32!CreateFileA 커널진입이 어떻게 되는지 확인해보자.



위 그림과 같이 x86과는 다르게 ntdll!KiFastSystemCall이 사라지고 ntdll!ZwCreateFile을 통해 커널로 바로 진입하는것을 볼수있다.

그렇다면 내부적으로 어떻게 커널진입이 바뀌었는지 다음의 그림을 보겠다. 



위 그림은 ntdll!ZwCreateFile의 내부코드이다. 커널진입시 x86과 차이를 보이는 것을 알 수 있다.  이를 자세하게 다루기 위해 먼저 x64에서 커널진입을 위해 사용되는 syscall에 대해 알아본다. 위 코드에 대한 다음의 주석으로 간단히 설명한다.


ntdll!ZwCreateFile:

0033:00000000`77b91860 4c8bd1          mov     r10,rcx                          ; 첫번째 인수를 r10 백업시킨다. 이는 syscall이후 반환주소가 rcx 전달되기 때문

0033:00000000`77b91863 b852000000      mov     eax,52h                   ; ServiceNumber전달

0033:00000000`77b91868 0f05            syscall                                           ; 커널진입

0033:00000000`77b9186a c3              ret

x86의 sysenter에서 x64의 sysenter로 바뀐것을 유저모드에서 비교하면 큰차이가 느껴지지 않을수있다. 하지만 커널진입이후에는 많은 내용들이 바뀐다.

해당내용은 다음의 커널모드편에서 다루겠다.



이상 x64커널진입 유저모드편을 마무리합니다. 부족한 내용이나 틀린내용있으면 말씀해주시면 감사하겠습니다.

반응형

'Security > Windows System' 카테고리의 다른 글

Windows x64커널 진입 : 커널모드편  (1) 2018.04.14
x64 Calling Convention(Windows)  (0) 2018.04.14
kernel32 vs kernelbase  (0) 2018.04.05
※Debug관련 API  (0) 2018.03.02
IO_STACK_LOCATION란?  (0) 2018.02.03

댓글