함수호출규약


- 함수호출규약(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

+ Recent posts