반응형
호출 규약이란 함수 호출 시 인수 전달 방법과 반환값의 수취 방법을 정의한 것.
호출 규약에 따라 레지스터와 스택의 이용 방법이 다르기 때문에 리버싱을 통해 코드를 이해하기 위해선 호출 규약을 파악하는 것이 필수이다. 호출 규약은 아키텍처나 프로그램의 포맷, 컴파일러나 링커에 따라 변한다.
반응형
cdecl
x86의 C/C++에서 가장 일반적인 호출 규약. 함수의 인수는 역순으로 스택에 쌓이고 반환값은 EAX 레지스터에 저장되며 함수 호출원이 스택을 POP한다.
stdcall
윈도우 API에서 이용되는 호출 규약. 함수의 인수는 역순으로 스택에 쌓이고 반환값은 EAX 레지스터에 저장되지만 함수가 종료될 때 그 함수 자체가 스택을 PUSH한다. 인수를 위해 확보한 스택 영역은 RET 명령 operand에 의해 POP되는 크기가 지정된다.
fastcall
레지스터를 사용하여 인수를 넘긴다. 사용하는 레지스터는 컴파일러에 의존하다.처음 2개의 인수를 ECX와 EDX에 저장하고, 인수가 3개 이상일 경우 cdecl과 마찬가지로 나머지 인수는 역순으로 스택에 저장한다. 반환값은 EAX에 저장된다. 인수 전달에 스택을 사용한 경우 stdcall과 마찬가지로 함수가 종료될 때 그 함수 자체가 스택을 Free 한다.
thiscall
C++클래스의 멤버 함수로 이용되는 호출 규약. 윈도우 에서는 함수의 인수는 역순으로 스택에 쌓이고 반환값은 EAX 레지스터에 저장된다. 기본적으로 cdecl 규약과 동일하나 this 포인터를 ECX에 저장하는 점이 특징이다.
반응형