KoreanFoodie's Study
Reversecore chap 10 - 함수 호출 규약 본문
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다.
함수 호출 규약
챕터 10은 함수 호출 규약(Calling Convention)에 대해 다룬다. 이는 '함수를 호출할 때 파라미터를 어떤 식으로 전달하는지'에 대한 일종의 약속이다.
함수 호출 규약은 cdecl, stdcall, fastcall으로 크게 3 가지로 나뉜다.
-
간단한 용어 설명
- Caller(호출자) - 함수를 호출한 쪽
- Callee(피호출자) - 호출을 당한 함수
cdecl 방식
cdecl방식은 주로 C 언어에서 사용되는 방식이며, Caller에서 스택을 정리하는 특징을 가지고 있다.
#include "studio.h"
int add(int a, int b)
{
return (a + b);
}
int main (int argc, char * argv[])
{
return add(1, 2);
}
0040101C 주소를 보면, ESP에 8을 더하여 Caller인 main()함수가 자신이 스택에 입력한 함수 파라미터를 직접 정리하고 있다.
이 방식이 바로 cdecl 방식으로, 장점은 C 언어의 printf() 함수와 같이 가변 길이 파라미터를 전달할 수 있다는 것이다.
stdcall
stdcall방식은 Win32 API 에서 사용되며, Callee에서 스택을 정리하는 것이 특징이다. (C 언어는 기본적으로 cdecl방식이다.) stdcall방식으로 컴파일 하고 싶을 때는 '_stdcall'키워드를 붙여주면 된다.
#include "studio.h"
int _stdcall add(int a, int b)
{
return (a + b);
}
int main (int argc, char * argv[])
{
return add(1, 2);
}
0040100A의 주소를 보면 RETN 8라는 명령어를 통해 호출된 함수(Callee)내부에서 스택을 정리해준다는 것을 알 수 있다.
Win32 API는 C 언어로 된 라이브러리이지만 기본 cdecl 방식이 아닌 stdcall 방식을 사용한다.이는 C 이외의 다른 언어 (Delphi(Pascal), Visual Basic 등)에서 API를 직접 호출할 때 호환성을 좋게 하기 위한 것이다!
fastcall
fastcall방식은 기본적으로 stdcall 방식과 같지만, 함수에 전달하는 파라미터 일부(2개까지)를 스택 메모리가 아닌 레지스터를 이용하여 전달한다는 것이 특징이다. 예를 들어, 어떤 함수의 파라미터가 4개이면 앞의 두 개의 파라미터는 각각 ECX,EDX 파라미터를 이용하여 전달한다
fastcall의 장점은 좀 더 빠른 함수 호출이 가능하다는 것이다. 하지만 ECX, EDX레지스터 관리를 위해 추가적인 오버헤드가 필요한 경우가 있다. 또한 앞의 레지스터들을 다른 용도로 쓸 경우 따로 백업을 해야하는 절차가 필요하다.
thiscall
아래 예제 코드를 살펴보자.
Class CTemp {
public:
int MemberFunc(int a, int b);
};
mov eax, dword ptr [ebp-14h]
push eax
mov edx, dword ptr [ebp-10h]
push edx
lea ecx, [ebp-4]
call 402000
__thiscall은 주로 C++ 클래스에서 이용되는 방법이다. 특징으로는 현재 객체의 포인터를 ecx에 전달한다는 것이 있다. Class로 생성한 각각의 객체를 구분해주기 위해, C++에서는 this 포인터를 사용하는데, 이 때 ecx로 전달되는 값이 this 포인터가 된다. 그리고 해당 클래스에서 사용하고 있는 멤버 변수나 각종 값은 다음과 같이 ecx 포인터에 오프셋 몇 번지를 더하는 식으로 사용할 수 있다.
ecx + x
ecx + y
ecx + z
'Ethical Hacking > Reversing' 카테고리의 다른 글
Reversecore chap 14 - 실행 압축 (0) | 2019.04.24 |
---|---|
Reversecore chap 13 - PE File Format (0) | 2019.04.24 |
Reversecore chap 8 - abex' crackme #2 (0) | 2019.04.24 |
Reversecore chap 7 - 스택 프레임 (0) | 2019.04.24 |
Reversecore chap 4 - IA-32 Register 기본 설명 (0) | 2019.04.24 |