[Dreamhack]Calling Convention

최윤지·2024년 4월 3일

System Hacking

목록 보기
8/9

함수 호출 규약

: 함수의 호출 및 반환에 대한 약속

호출한 함수가 반환하면 다시 원래의 함수로 돌아와서 기존의 실행 흐름을 이어나감
=> 함수를 호출할 때 반환된 이후를 위해 호출자(Caller)의 상태(Stack frame) 및 반환 주소(Return Address)를 저장해야 함, 호출자는 피호출자(Callee)가 요구하는 인자를 전달해줘야 하고, 피호출자의 실행이 종료될 때는 반환 값을 전달받아야 함

컴파일러는 지원하는 호출 규약 중, CPU 아키텍처에 적합한 것을 선택
=> CPU의 아키텍처가 같아도 컴파일러가 다르면 적용하는 호출 규약이 다를 수 있음

SYSV

: x86-64호출 규약

리눅스는 SYSTEM V(SYSV) Application Binary Interface(ABI)를 기반으로 만들어짐
SYSV ABI는 ELF 포맷, 링킹 방법, 함수 호출 규약 등의 내용을 담고 있음

SYSV에서 정의한 함수 호출 규약
1. 6개의 인자를 RDI, RSI, RDX, RCX, R8, R9에 순서대로 저장하여 전달(더 많은 인자를 사용해야 할 때는 스택을 추가로 이용)
2. Caller에서 인자 전달에 사용된 스택을 정리
3. 함수의 반환 값은 RAX로 전달

cdecl

: x86호출 규약

x86아키텍처 레지스터의 수가 적음 -> 스택을 통해 인자 전달
인자 전달을 위해 사용한 스택을 호출자가 정리
스택을 통해 인자를 전달할 때는 마지막 인자부터 첫 번째 인자까지 거꾸로 스택에 push

0개의 댓글