1. 함수 호출 규약(Calling Convention)
함수 호출 후에 ESP(스택 포인터)를 어떻게 정리하는에 대한 약속
● 함수를 호출할 때 파라미터를 어떻게 처리할까?
- 함수 실행 전 : 스택을 통하여 파라미터를 전달
- 함수 실행 후 : 사용한 스택 정리
- → 스택에 저장된 파라미터는 삭제되지 않는다
- → ESP 값을 수정하여 저장된 파라미터가 더 이상 유효한 데이터가 아님을 명시적으로 기록해둔다.
● 함수 실행 후, 누가 어떻게 스택을 정리할까?
- 함수 호출 규약 : cdelcl, stdcall, fastcall
1.1 cdecl
- 주로 C언어에서 사용되는 방식
- Caller (함수를 호출한 쪽)에서 스택을 정리한다.

cdecl 방식의 예제 코드이다. 컴파일후 x64dbg로 열어보면

add() 함수의 파라미터 1,2 를 역순으로 스택에 저장하고
add()함수 <401000> 을 호출한후
add esp, 8 명열으로 스택을 정리하고있다.
※ cdecl 방식의 장점은 C 언어의 printf() 함수와 같이 가변 길이 파라미터를 전달할 수 있다는것이다.
하지만 이러한 가변 길이 파라미터는 다른 호출 규약에서는 구현이 어렵다.
1.2 stdcall
- win32 API 에서 사용
- Callee (피호출자, 호출되는함수) 에서 스택을 정리한다.
- C언어는 기본적으로 cdecl 방식이지만, _stdcall 키워드를 사용하여 컴파일 하면 된다.

stdcall 방식의 예제코드이다 컴파일후 x64dbg 로 열어보면

위의 사진과 같이 스택의 정리는
add() 함수의 마지막 RETN 8 명령에서 수행된다.
여기서 RETN 8 명령어는 RETN + POP8바이트 를 의미한다.
즉 리턴 후 지정도니 크기만큼 ESP를 증가시키는 것이다.
※ stdcall 방식의 장점은 호출되는 함수 내부에 스택정리 코드가 존재하므로,
호출 때마다 스택을 정리하기 위한 코드를 Caller에 추가할 필요가 없어
전체 코드 크기를 줄일 수 있다
1.3 fastcall
- 기본적 stdcall 방식
- 함수에 전달하는 파라미터 일부(2개까지)를 스택 메모리가 아닌 레지스터(ECX, EDX)를 이용하여 전달한다.
- 함수 호출 시, 보다 빠른 처리가 가능하다.
'Reverse Engineernig > study' 카테고리의 다른 글
[리버싱 핵심원리] ch13. PE File Format (0) | 2023.01.08 |
---|---|
[리버싱 핵심원리] ch08. abex' crackme2 (0) | 2022.12.30 |
[리버싱 핵심원리] ch07. 스택 프레임 (0) | 2022.12.28 |
[리버싱 핵심원리] ch06. abex' crackeme #1 분석 (0) | 2022.12.28 |
[리버싱 핵심원리] ch05. 스택 (0) | 2022.12.27 |
1. 함수 호출 규약(Calling Convention)
함수 호출 후에 ESP(스택 포인터)를 어떻게 정리하는에 대한 약속
● 함수를 호출할 때 파라미터를 어떻게 처리할까?
- 함수 실행 전 : 스택을 통하여 파라미터를 전달
- 함수 실행 후 : 사용한 스택 정리
- → 스택에 저장된 파라미터는 삭제되지 않는다
- → ESP 값을 수정하여 저장된 파라미터가 더 이상 유효한 데이터가 아님을 명시적으로 기록해둔다.
● 함수 실행 후, 누가 어떻게 스택을 정리할까?
- 함수 호출 규약 : cdelcl, stdcall, fastcall
1.1 cdecl
- 주로 C언어에서 사용되는 방식
- Caller (함수를 호출한 쪽)에서 스택을 정리한다.

cdecl 방식의 예제 코드이다. 컴파일후 x64dbg로 열어보면

add() 함수의 파라미터 1,2 를 역순으로 스택에 저장하고
add()함수 <401000> 을 호출한후
add esp, 8 명열으로 스택을 정리하고있다.
※ cdecl 방식의 장점은 C 언어의 printf() 함수와 같이 가변 길이 파라미터를 전달할 수 있다는것이다.
하지만 이러한 가변 길이 파라미터는 다른 호출 규약에서는 구현이 어렵다.
1.2 stdcall
- win32 API 에서 사용
- Callee (피호출자, 호출되는함수) 에서 스택을 정리한다.
- C언어는 기본적으로 cdecl 방식이지만, _stdcall 키워드를 사용하여 컴파일 하면 된다.

stdcall 방식의 예제코드이다 컴파일후 x64dbg 로 열어보면

위의 사진과 같이 스택의 정리는
add() 함수의 마지막 RETN 8 명령에서 수행된다.
여기서 RETN 8 명령어는 RETN + POP8바이트 를 의미한다.
즉 리턴 후 지정도니 크기만큼 ESP를 증가시키는 것이다.
※ stdcall 방식의 장점은 호출되는 함수 내부에 스택정리 코드가 존재하므로,
호출 때마다 스택을 정리하기 위한 코드를 Caller에 추가할 필요가 없어
전체 코드 크기를 줄일 수 있다
1.3 fastcall
- 기본적 stdcall 방식
- 함수에 전달하는 파라미터 일부(2개까지)를 스택 메모리가 아닌 레지스터(ECX, EDX)를 이용하여 전달한다.
- 함수 호출 시, 보다 빠른 처리가 가능하다.
'Reverse Engineernig > study' 카테고리의 다른 글
[리버싱 핵심원리] ch13. PE File Format (0) | 2023.01.08 |
---|---|
[리버싱 핵심원리] ch08. abex' crackme2 (0) | 2022.12.30 |
[리버싱 핵심원리] ch07. 스택 프레임 (0) | 2022.12.28 |
[리버싱 핵심원리] ch06. abex' crackeme #1 분석 (0) | 2022.12.28 |
[리버싱 핵심원리] ch05. 스택 (0) | 2022.12.27 |