본문 바로가기
Security/Windows System

x64 Calling Convention(Windows)

by Winduck 2018. 4. 14.
반응형
x64커널진입을 정리하면서 x64의 파라미터 전달관계를 알기 위해 진행되었던 내용들을 간단하게 정리한다.

먼저, 파라미터 전달관계를 위해 다음과 같이 코딩했는데 코딩내용은 굉장히 굉장히 간단하다. 테스트를 위한 함수를 만들고 파라미터를 14개 정도 전달받도록 만들었다. 별건아니니 코드를 보는게 더 편할것이다.

#include<stdio.h>


void X64Call(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, int n)

{

 printf("%d", a + b + c + d + m + n);
 return;

}


int main()

{

 X64Call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);

 return 0;

}



 위와 같이 하고 x64dbg를 통해 파라미터 전달이 어떻게 되는지 확인해보았다. 그냥 넘어가기 전에 위와 같이 코딩할 경우 컴파일러가 코드의 최적화를 위해 인라인 함수를 만들어 파라미터전달관계를 확인하기 어려움으로 [프로젝트 속성]-[C/C++]-[내장함수 사용]/[최적화] 옵션을 끄고 진행하였다.

 


위 과정을 통해 1~4파라미터는 순서대로 RCX, RDX, R8, R9를 통해 전달되고 나머지 파라미터는 스택을 통해 전달되는 것을 확인할 수 있다. 다음의 추가적인 5~~~의 파라미터는 스택의 [RSP+0x20]부터 차곡차곡 쌓는 것을 알 수 있었다. 그러던 중 이상한점(?)을 발견했다. 라미터 전달시 [RSP+0x20]부터 쌓이는 것이다. [RSP+0]~[RSP+0x20]에는 어떤 값들이 쌓이나?


X64CALL함수 내부를 보니 


빨간색 박스부분에 다음 함수들어가기 전에 스택에 미리 저장되는 것을 볼 수 있었다. 그리고 x64에 콜링컨벤션에 대해 조서하면서 알게된 것은 스택정리를 caller에서 처리한다는것을 알 수 있었다. 다음의 화면은 보면 알수 있다.

전달되는 파라미터는 1~14까지 총 14개이고 그래서 파라미터전달을 위해 확보되는 스택 공간은 0x70(14*8byte)이다.

하지만 위에서 0x78을 확보하는 이유는 x64Call함수의 리턴주소 확보를 위함이다.


간단하게 알게 된 것을 정리해보겠다.


첫번째, 파라미터는 RCX,RDX,R8,R9로 전달되고 나머지는 스택을 통해 정리 

두번째, [RSP+0]~[RSP+0x20]는 파라미터1~4를 위해 예약된다.

세번째,스택 세팅 및 정리는 caller에서 처리된다.


반응형

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

I/O Control Code를 정의하는 CTL_CODE  (0) 2018.07.31
Windows x64커널 진입 : 커널모드편  (1) 2018.04.14
64 Windows커널 진입 차이 : 유저모드편  (0) 2018.04.12
kernel32 vs kernelbase  (0) 2018.04.05
※Debug관련 API  (0) 2018.03.02

댓글