본문 바로가기

Reverse Engineering

9. 콜린 컨벤션 __cdecl 함수 어셈블리어 코드

9. 콜린 컨벤션 __cdecl 함수 어셈블리어 코드

 

  

 본 포스팅의 내용은 해킹 맛보기 책의 내용중 3장 리버스 엔지니어링 P133~P281 까지

 실습 내용을 따라하기 해보았습니다. 책의 내용중 일부 발췌 (수정) 하였습니다. 문제가 될 때는 비공개 하도록 하겠습니다.


   

[발췌]

 구분

__cdecl 

__stdcall 

__fastcall 

 인자 전달 방법

 스택

 스택 

 레지스터, 스택 

 스택 해제 방법

 호출한 함수  

 호출된 함수  

 호출된 함수  

 

 

 

#include <stdio.h>



int __cdecl 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;


}

 

 

[발췌-수정]

PUSH 명령어를 이용해 스택에 인자를 차례대로 쌓아가는 것을 확인할 수 있다. 윈도우 운영체제에서 스택은 높은 주소에서 낮은 주소로 

데이터를 쌓아간다. 따라서 01271432 주소의 PUSH 1 명령어까지 실행하면 스택 구조는 그림 3-30과 같고 ESP는 마지막으로 

스택에 넣은 변수 1이 저장된 스택 주소를 가리킨다. 

__cdecl 호출 규약은 아래 그림과 같이 스택을 이용해서 인자를 입력하는 것을 확인할 수 있다.



 Low Address

 

 

 

 

 1 

 

 

 

 2 

 

 

 

 3

 <- 

 ESP

 High Address

 



 --cdecl 인자 전달 스택 구조 



 Low Address

 

 

 

 

 1 

 

 

 

 2 

 

 

 

 3

 

 

 

 

 <- 

 ESP

 High Address

 

 

 

 --cdecl 스택 해제