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 |