알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

cdecl,stdcall,fastcall 함수 호출 규약 본문

리버싱

cdecl,stdcall,fastcall 함수 호출 규약

백곳 2018. 4. 25. 22:32

cdecl,stdcall,fastcall 함수 호출 규약 



해당 규약들은 c언어,C++ 기타 등등이 컴파일 이후에 cpu가 알수 있는 asm 언어로 변환을 합니다. 


이러한 변환 과정에서  함수를 부르는 쪽에서 stack을 정리 할지 함수에서 stack을 정리 할지에 대한 규약 입니다. 


이전에 리버싱강의 에서 함수 들에서 인자값 들을 stack 을 통해서 받았던것을 알수 있습니다. 


그 이후 함수가 return 할때 자신을 호출 했던 함수 쪽으로 stack을 원복 해줘야 합니다. 


예를 들면 main() 함수 안에서 add() 함수를 호출 했을때 


Caller(호출자) -- main

Callee(피호출자) -- add


라고 정의 됩니다. 


cdecl 


은 caller(호출자) 에서 stack을 정리하는것을 말하는 규약 입니다. 


cdecl.exe


#include "stdio.h"


int add(int a, int b)

{

    return (a + b);

}


int main(int argc, char* argv[])

{

    return add(1, 2);

}




main의 start 포인트가 찾아 들어가면 


위와 같이 코드가 나옵니다. 


401013~40101C 주소 코드 영역을 보면  스택에 push 을 한다음  add call 을 합니다. 


그리고 CALL 다음에  


push 2

push 1


에 대한  ADD ESP,8 로 스택을 정리 해줍니다 . 



stdcall 


은 반대 개념입니다. 


함수에 _stdcall 은 stdcall 형식으로 asm 을 만들때 (컴파일 할때 )규약을 따르는 코딩입니다. 


stdcall.exe


#include "stdio.h"


int _stdcall add(int a, int b)

{

    return (a + b);

}


int main(int argc, char* argv[])

{

    return add(1, 2);

}




이번에 보면 CALL 이후에 ADD ESP,8  이 없고 


add 함수 쪽에서  return 8 이있습니다 


return 8의 명령어는 


RETN + pop 8 입니다 


add 함수에서 stack 을 정리하고 함수를 빠져 나는것 이죠 .  주로 이함수 규약은 win32 api 언어로된 라이브러리에서 많이 


사용된다고 합니다. 



fastcall 


기본적으로 stdcall 와 같습니다. 


다만 예를 들어  push 파라 메터가 4개 이면 


이중 2개는 stack 에 쌓아서 함수에 전달하고 2개는 EDX,ECX 다른 레지스터를 사용해서 파라메터 값을 

전달한다는 규약 이죠 


그럼 push 와 pop을 2번만 하면 됩니다. 



Comments