최근에 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 |
댓글