본문 바로가기

Reversing/Theory

Chapter 5. Calling Convention

Chapter 5. Calling Convention
1. Calling Convention(함수 호출 규약)
 - 함수를 호출할 때 Stack(Buffer)에 인자 값(Parameter)을 어떤 식으로 전달할 것인지에 대한 규약을 정의한 것
 - 함수 호출 후에 ESP를 어떻게 정리하는지에 대한 규약
 - Stack(Buffer)의 특징
  · Process 내에서 Stack(Buffer)은 주소가 점점 줄어드는 방향으로 값이 채워진다.
  · 해당 Process의 PE Header에 Stack의 크기가 명시된다.
  · Stack(Buffer)에 채워지는 변수 값은 지역변수이며 malloc/new와 같은 함수를 이용해 동적 할당되는 변수와는 다르다.
  · Stack(Buffer)에 채워지는 변수는 해당 Process가 종료될 때까지 사라지지 않으며 Process가 종료될 때까지 CPU 자원이 소모된다.
  · Process 내에서 함수가 실행되면 ESP는 원래 할당되어 있던 Stack 범위와 다른 영역에 다른 Stack(Buffer)이 생성되며 ESP가 해당 Stack의 지점으로 이동하게 되며 해당 함수가 종료되면 ESP는 원래 Stack의 지점으로 되돌아가게 된다.
  · ESP가 Stack(Buffer)의 끝을 가리키게 되면 해당 Stack에 더 이상 값을 넣는 것은 불가능하다.
 - Calling Convention Terms
  · Caller
  ◦ 함수를 호출한 쪽
  · Callee
  ◦ 호출을 당한 함수
  · Caller & Callee 예

  ◦ Caller → main()
  ◦ Callee → add()
 - 주요 함수 호출 규약
  · cdecl

  ◦ Caller인 함수가 자신이 Stack에 입력한 매개변수를 직접 정리하는 방식의 규약

  ◦ C 언어의 기본 호출 규약
  ◦ 특징
   ▹ Caller가 직접 정리해 매개변수를 전달하기 때문에 printf, scanf와 같은 가변길이의 매개변수를 갖는 함수에게 인자 값을 전달해줄 수 있다.
   ▹ 반면에 가변길이의 매개변수를 갖는 함수는 다른 호출 규약방식에서는 구현하기 어렵다.
  ◦ cdecl의 예

   ▹ 위 예에서 보면 Main 함수 내에서 add 함수에 인자 값을 직접 정리해 Stack에 전달하고 있다.
   ▹ add 함수를 마친 후에는 'ADD ESP 8'을 통해 ESP 지점을 증가시켜 Stack을 정리하는 것으로 보면 Main함수 내에서 인자 값을 직접 정리하는 것을 알 수 있다.
  · stdcall

  ◦ Callee인 함수가 자신이 Stack에 입력한 매개변수를 직접 정리하는 방식의 규약
  ◦ 사용 방법은 간단하게 함수의 반환형 바로 다음에 '_stdcall'을 붙여주면 사용 가능하다
  ◦ 특징
   ▹ C 언어에서 Win32 API와 다른 언어(ex. Visual Basic)에서 주로 사용하는 함수 호출 규약
   ▹ 함수 내에서 Stack을 정리하기 때문에(RETN 8)cdecl 방식에 비해서 Program의 Code가 작아진다.
  ◦ stdcall의 예

   ▹ 위 예에서 보면 add 함수가 호출되고 해당 함수가 인자 값을 정리해 Stack에 전달하고 정리하고 있다.
   ▹ cdecl은 add 함수가 종료되기 전 'RETN'으로 종료되고 있지만 stdcall에서는 'RETN 8' 명령을 이용해 ESP Register의 값을 이전에 Main 함수에서의 값으로 되돌리고 있다.
  · fastcall
  ◦ Callee인 함수가 자신이 Stack에 입력한 매개변수를 직접 정리하는 방식의 규약
  ◦ stdcall과 방식은 같지만 Stack이 아닌 Register를 이용해 매개변수를 전달한다.
  ◦ 특징
   ▹ Register를 이용하기 때문에 stdcall보다 빠르다.
   ▹ 함수 호출 후 또한 Register에 값을 저장하기 때문에 함수 호출 전에 Register 값을 Backup할 필요가 있으며 이러한 Backup을 위해 명령어가 늘어나 Program의 Code가 길어질 수 있다.



'Reversing > Theory' 카테고리의 다른 글

Chapter 7. PE Header II - RVA to RAW  (0) 2015.08.16
Chapter 6. PE header I - PE Format  (0) 2015.08.16
Chapter 4. Stack  (0) 2015.08.16
Chapter 3. Memory & Assembly Language  (0) 2015.08.16
Chapter 2. Register & Byte Ordering  (0) 2015.08.16