11. 콜린 컨벤션 __fastcall 함수의 어셈블리어 코드
본 포스팅의 내용은 해킹 맛보기 책의 내용중 3장 리버스 엔지니어링 P133~P281 까지 실습 내용을 따라하기 해보았습니다. 책의 내용중 일부 발췌 (수정) 하였습니다. 문제가 될 때는 비공개 하도록 하겠습니다. |
[발췌]
구분 |
__cdecl |
__stdcall |
__fastcall |
인자 전달 방법 |
스택 |
스택 |
레지스터, 스택 |
스택 해제 방법 |
호출한 함수 |
호출된 함수 |
호출된 함수 |
#include <stdio.h>
int __fastcall sum(int a, int b, int c)
{
return a+b+c;
}
int main()
{
int s;
s =sum(1, 2, 3);
printf("%d ", s);
return 0;
}
[발췌-수정]
__Fastcall 호출 규약은 __cdecl, __stdcall 호출 규약과 달리 인자 입력에 메모리보다 속도가 빠른 레지스터가 사용된다.
레지스터 사용에는 한계가 있어 모든 인자를 레지스터로 입력하지 않고 메모리(스택)도 같이 사용한다.
__fastcall 호출 규약을 사용하는 sum 함수
01191402 MOV ESP,EBP
01191404 POP EBP
01191405 RETN 4
인자에 사용된 스택 해제는 호출한 함수가 아니라 __stdcall 호출 규약과 같이 호출된 함수에서 한다.
ESP에 4를 더하는 이유는 인자 입력시 PUSH 명령어를 한 번만 사용했기 때문이다.
프로그램은 적어도 1개의 함수는 포함한다. 어떤 프로그램이든 정해진 호출 규약이 있으며,
해당 프로그램의 호출 규약을 이해하면 분석은 훨씬 더 수월해진다.
'Reverse Engineering' 카테고리의 다른 글
13. 함수 프롤로그,에필로그 (0) | 2016.11.14 |
---|---|
12. 함수 호출 리턴값 확인 (0) | 2016.11.14 |
10. 콜린 컨베션 __stdcall 함수의 어셈블리어 코드 (0) | 2016.11.10 |
9. 콜린 컨벤션 __cdecl 함수 어셈블리어 코드 (0) | 2016.11.10 |
8. while문이 포함된 어셈블리어 코드 (0) | 2016.11.10 |