▶ 함수 호출 규약 (Calling Convention)

 

→ 함수를 호출할 때 파라미터를 어떤 방식으로 전달할지 정해놓은 규약

 

함수 호출 시에는 유효하지 않은 파라미터를 삭제하는 과정이 필요하고, 유효하지 않은 파라미터를 가리키고 있는 ESP를 증가시켜 스택을 정리해주어야 한다. 이때 스택을 정리하는 방식에 대한 규약을 함수 호출 규약이라고 한다.

 

 

▶ 32bit 함수 호출 규약

 

▷ cdecl

 

- call(호출자)을 하는 쪽에서 스택을 정리하는 방식

- 인자를 오른쪽에서 왼쪽으로 넣음

- 가변인자 전달이 가능하다는 장점

- 함수 앞에 _를 추가하여 구분 가능

- ex) main( ) 함수에서 add( ) 함수를 호출하는 경우 add( ) 함수가 끝나고 main( ) 함수에서 스택에 저장되었던 파라미터를 정리하기 위해 esp 값을 증가시켜 스택 정리

 

▷ stdcall

 

- cdecl과 반대로 호출된 함수에서 스택을 정리하는 방식

- stdcall 형식으로 asm을 컴파일할 때 규약을 따름

- 호출된 함수의 마지막 부분에서 RETN 명령을 사용하여 함수 내에서 스택을 정리하고 함수를 빠져나옴

- 인자를 오른쪽에서 왼쪽으로 넣음

- main( ) 함수에 따로 스택을 정리하는 명령이 필요없기 때문에 코드 길이가 짧아진다는 장점

- 함수 앞에 _를 추가하고, 함수 이름 뒤에는 @를 추가

 

▷ fastcall

 

- stdcall 방식과 같은데, 함수에 전달하는 파라미터 일부(최대 2개)를 레지스터를 사용하여 전달

- 이용하는 레지스터는 ECX, EDX

- 레지스터를 이용하기 때문에 빠르게 함수를 호출할 수 있는 장점

- 스택 정리는 호출된 함수 내에서 함

- 함수 앞에 @를 추가하고, 함수 이름 뒤에는 @가 추가됨

- 스택 이용 바이트 수 표현

 

 

▶ 64bit 함수 호출 규약

 

- 32bit 함수 호출 규약과 다르게 fastcall 방식만 이용

- 파라미터 전달

 

  정수 실수
리눅스 EDI, ESI, EDX, E8, CX, R8, R9 XMM0~XMM7
윈도우 ECX,EDX,R8,R9 XMM0~XMM4

 

- ex) add(int a, int b)는 파라미터가 정수형이므로 EDI, ESI 레지스터에 들어가고, 오른쪽에서 왼쪽 방향으로 파라미터가 들어가기 때문에 int b는 EDI 레지스터, int a는 ESI 레지스터에 들어간다.

 

 

※ ROP할 때

 

32bit : 함수 호출 → pr → 인자

64bit: pr → 인자 → 함수 호출

'2021-2 STUDY > Reversing Study' 카테고리의 다른 글

Week02_Dreamhack rev-basic-2, rev-basic-3  (0) 2021.09.25
Week02_PE 파일 구조  (0) 2021.09.25
Week01_abex' crackme #1  (0) 2021.09.11
Week01_Dreamhack rev-basic-0, rev-basic-1  (0) 2021.09.11
Week01_64bit 레지스터  (0) 2021.09.11

+ Recent posts