본문 바로가기

Reverse Engineering

11. 콜린 컨벤션 __fastcall 함수의 어셈블리어 코드

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개의 함수는 포함한다. 어떤 프로그램이든 정해진 호출 규약이 있으며,

해당 프로그램의 호출 규약을 이해하면 분석은 훨씬 더 수월해진다.