#include<stdio.h>
{ printf("%d", a + b + c + d + m + n); }
{ 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 |
댓글