함수호출규약
- 함수호출규약(Function Calling Convention)이란?
함수를 호출하는 방식에 대한 일종의 약속이다. 인수 전달 방법, 인자 전달 순서, 인자 정리 방법에 따라 그 종류를 구분한다.
호출하는 쪽과 호출되는 쪽의 어느 한쪽이 약속을 어길 경우 함수도 제대로 동작하지 않으며 메모리가 엉망이 되기 때문에
프로그램을 정상적인 실행을 계속할 수 없다.
- 스택프레임
스택프레임을 보면 높은 주소에서 낮은 주소로 쌓여지며, 함수를 호출 할 때 마다 새로운 스택프레임이 생성되는 것을 볼 수 있다.
- 함수 호출시 스택의 변화순서
- 함수 호출 규약의 구분
인자 전달 방법 : 스택 / 레지스터
인자 전달 순서 : 역방향(←)
인자 정리 방법 : Caller, Callee
* Caller(호출자) : 다른 함수를 호출한 함수
* Callee(피호출자) : 호출을 당한 함수
- cdecl
C언어와 C++에서의 표준 함수 호출 규약이다.
Caller가 인자를 정리하며, printf() 함수와 같은 가변 인자 함수를 사용 가능하다.
인자 전달 방법 : 스택
인자 전달 순서 : 역방향(←)
인자 정리 방법 : Caller
소스코드
어셈블리코드
- stdcall
Window API, Visual Basic에서 사용하는 표준 함수 호출 규약이다.
코드가 간결하고 가변 인자 함수를 사용할 수 없다.
인자 전달 방법 : 스택
인자 전달 순서 : 역방향(←)
인자 정리 방법 : Callee
소스코드
어셈블리코드
- fastcall
Delphi 에서 사용되는 함수 호출 규약이다.
인자 2개까지는 레지스터(ECX, EDX)를 사용해서 인자를 전달하므로 속도가 빠르다.
인자 3개 이상일 경우 스택과 함께 사용한다.
인자 전달 방법 : 스택 + 레지스터
인자 전달 순서 : 역방향(←)
인자 정리 방법 : Callee
소스코드
어셈블리코드
'보안 > 리버싱' 카테고리의 다른 글
Reversing -2 레지스터 (0) | 2017.02.01 |
---|---|
Reversing -1 어셈블리언어 (0) | 2016.05.16 |