함수 호출 규약: 함수를 호출할 떄 인자가 전달되는 방식
- cdecl: C의 기본 호출 규약
인자가 오른쪽에서 왼쪽으로 스택에 전달
함수가 종료될 때 호출자가 피호출자의 스택 프레임 정리
가변인자 사용 가능 - stdcall: 주로 Windows API에서 사용
인자가 오른쪽에서 왼쪽으로 스택에 전달
함수가 종료될 때 피호출자가 스스로 스택 프레임 정리
가변인자 사용 불가 - fastcall
인자가 오른쪽에서 왼쪽으로 레지스터를 사용해 전달, 2개의 인자까지는 EDX, ECX레지스터로 그 이후로는 스택으로 저장.
피호출자가 스택 정리
가변인자 사용 불가능
레지스터를 써서 속도가 빠름 - 예) void Func(int a, int b)라는 함수가 있을때
- cdecl
push b push a <- 스택에서 꺼내서 쓸 땐 a, b순서 call Func add ESP 8 <- 스택프레임 정리
- stdcall
push a push b call Func Func: ... pop ebp retn 8 <- 스택 영역 정리
- fastcall: 인수가 2개 이하
mov EDX b mov ECX a call Func Func: ... ECX, EDX를 이용해 뭐 함 retn
- fastcall: 인수가 2개 초과
void Func(int a, int b, int c)
push c
mov EDX b
mov ECX a
call Func
Func:void Func(int a, int b, int c) push c mov EDX b mov ECX a call Func Func: ... DWORD PTR [EBP+8], ECX, EDX를 이용해 뭐 함 retn 4 <- c가 int(4바이트)이므로 4바이트 스택 정리
- cdecl
728x90
반응형
'리버싱 입문' 카테고리의 다른 글
[리버싱 입문](8)[abex crackme 5] (0) | 2025.02.18 |
---|---|
[리버싱 입문](7)[abex crackme 4] (0) | 2025.02.11 |
[리버싱 입문](5)[abex crackme 3] (1) | 2025.02.07 |
[리버싱 입문](4)[abex crackme 2] (1) | 2025.02.06 |
[리버싱 입문](3)[abex crackme 1] (0) | 2025.02.05 |