리버싱 입문

[리버싱 입문](6)[함수 호출 규약]

황올뱀 2025. 2. 10. 19:06

함수 호출 규약: 함수를 호출할 떄 인자가 전달되는 방식

  • 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바이트 스택 정리

 

728x90
반응형