함수 호출 규약 (Calling Convention)
'함수를 호출할 때 파라미터를 전달하는 방식에 대한 약속'
주요한 함수 호출 규약은 아래와 같다.
- cdecl
- stdcall
- fastcall
*caller(호출자) - 함수를 호출한 쪽
callee(피호출자) - 호출을 당한 함수
main()에서 print()함수를 실행할 경우 main()[Caller], print()[Callee]
cdecl 방식
c언어 에서 주로 사용되는 방식으로 Caller에서 Stack을 정리
main() 쪽에서 함수 호출뒤 ADD ESP. 8 을 실행
CALL 00401000
ADD ESP, 8 ; 함수 호출뒤 stack 정리
컴파일 뒤 어셈블리어를 확인하면 CALL 00401000 함수 호출 뒤 ADD ESP, 8로 Stack을 정리한다.
장점 : print()함수와 같이 가변 길이 파라미터를 전달 가능
* stdcall, fastcall에서는 가변 길이 파라미터를 전달하는 기능을 구현하기 어렵다.
stdcall 방식
Win32 API에서 사용되는 방식으로 Callee에서 Stack을 정리
c언어에서 컴파일 하고 싶다면 함수 앞에 _stdcall 키워드를 붙여주면 된다.
#include "stdio.h"
int _stdcall add(int a, int b) {
return a + b;
}
CALL 00401000 ; 함수 호출 뒤 ADD ESP, 8이 없다.
컴파일 뒤 어셈블리어를 확인하면 CALL 00401000 뒤에 ADD ESP, 8이 없다.
장점 : Callee에 Stack 정리 코드가 있어서 Caller의 크기가 cdecl방식에 비해 작아진다.
fastcall 방식
기본적으로 stdcall과 방식이 같다.
함수에 전달하는 파라미터 일부(2개까지)를 스택 메모리가 아닌 레지스터를 이용하여 전달한다.
함수의 파라미터가 4개라면 앞의 두개는 ECX, EDX파라미터를 이용하여 전달
장점 ; 파라미터 전달시 스택이 아닌 레지스터에 접근하기 때문에 훨씬 더 빠르다.
'Security_ > Reversing' 카테고리의 다른 글
[풀이] abex' carckme #4 (0) | 2021.09.19 |
---|---|
[풀이] abex' crackme #3 (0) | 2021.09.16 |
[풀이] abex' crackme #2 (0) | 2021.09.15 |
[풀이] abex' crackme #1 (2) | 2021.09.15 |
[Themida / WinLicense] OllyDbg 오류 해결 정리! (0) | 2021.09.14 |
댓글