함수 호출 규약
1. 함수 호출 규약은 함수의 호출 및 반환에 대한 약속이다.
2. 함수 호출 규약은 아키텍처 그리고 운영체제에 따라서 달라지며, 프로그래머가 코드에 어떤 함수 호출 규약을 사용할지 선택할 수도 있다.
3. 함수 호출 규약를 분류하는 방식은 다음과 같다. 즉, 함수 호출 규약에 따라 다음의 것들이 달라진다.
1) 인자 전달 순서 ( 왼쪽 인자 -> 오른쪽 인자 or 오른쪽 인자 -> 왼쪽 인자 )
2) 인자 전달 방법 ( 스택 or 레지스터 )
3) Stack Frame을 정리하는 방법 ( 함수 호출자[caller] or 함수 피호출자[callee] )
함수 호출 규약의 종류
- x86(32bit) 아키텍처는 레지스터를 통해 피호출자의 인자를 전달하기에는 레지스터의 수가 적으므로, 스택으로 인자를 전달한다.
- x86-64(64bit) 아키텍처에서는 레지스터가 많으므로 적은 수의 인자는 레지스터만 사용해서 인자를 전달하고, 인자가 너무 많을 때만 스택을 사용
함수 호출 규약의 종류는 다음과 같다.
x86
|
x86(32bit) 아키텍처의 함수 호출 규약
x86의 함수 호출 규약에 대해선 이를 잘 정리해준 블로그 글이 있어, 다음 글을 자세히 참고해볼 것을 강하게 추천드립니다.
https://over-stack.tistory.com/23
x64(64bit) 아키텍처의 함수 호출 규약
이 글에서는 SYSV 함수 호출 규약에 대해 살펴보겠습니다.
SYSV 함수 호출 규약은 다음의 특징을 같습니다
1) 6개의 인자를 RDI, RSI, RDX, RCX, R8, R9에 순서대로 저장하여 전달합니다. 더 많은 인자를 사용해야 할 때는 스택을 추가로 이용합니다.
2) Caller에서 인자 전달에 사용된 스택을 정리합니다.
3) 함수의 반환 값은 RAX로 전달합니다.
최종 정리
x86-64 아키텍처 & x64 아키텍처의 함수 호출 규약을 정리해보면 다음과 같다
'DreamHack: System Hacking > F Stage 5' 카테고리의 다른 글
basic_exploitation_001 (0) | 2023.04.13 |
---|---|
basic_exploitation_000 (0) | 2023.04.13 |
Exploit Tech: Return Address Overwrite(리턴 주소 변경 및 실습) (0) | 2023.04.11 |
Memory Corruption: Stack Buffer Overflow(개념) (0) | 2023.04.10 |
Quiz: Calling Convention(퀴즈: 함수 호출 규약) (0) | 2023.04.10 |