본문 바로가기

Reversing

리버싱 기초 지식 : 함수호출규약(Calling Convention)

함수호출규약(Calling Convention)

함수호출규약이란 함수를 호출하기 위한 규칙이며, 인자를 넘겨주는 방식과 함수 종료 시 스택 공간을 정리하는 방법에 따라 분류한다.


위 그림은 함수의 호출과정에 대한 내용입니다.

여기서 함수호출규약을 결정하는 방법은 인자를 넘겨주는 방식과 스택 정리를 누가 하는가에

따라 달라진다.

 

Stdcall(Standard Call)

Windows API Default Call

스택 정리를 콜리가 한다.

• 인자 전달순서는 오른쪽부터 왼쪽으로 전달한다.

위 그림은 메시지 박스를 출력하는 프로그램이다.

먼저 Call하는 부분의 위에 인자가 4개가 들어 간다는 것을 알 수 있다.

Stdcall은 불려지는 함수가 스택을 정리한다고 하니 함수의 안을 들여다 보겠습니다.

함수의 마지막을 보게 되면 4개의 인자만큼의 공간을 정리합니다.

 

Cdecl

C/C++ Default Call

• 스택 정리를 콜러가 한다.

• 인자 전달순서는 오른쪽부터 왼쪽으로 전달한다.

함수가 끝난 후를 보면 함수의 인자가 3개였으며 그 공간을 콜러가 정리를 한다.

 

Fastcall

• 메모리를 참고하지 않고 ECX EDX레지스터를 이용해서 인자를 전달한다.

(3개 이상의 인자 전달 시에는 스택을 이용한다.)

• 스택 정리를 콜리가 한다.

• 인자 전달순서는 오른쪽부터 왼쪽으로 전달한다.