본문 바로가기

보안

[시스템해킹] Background: Calling Convention(함수 호출 규약)

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

- 함수에서 다른 함수를 호출할 때, 프로그램의 실행 흐름은 다른 함수로 이동

- 호출한 함수가 반환하면 다시 원래의 함수로 돌아와 기존의 실행 흐름대로

- 함수 호출 시 반환 이후를 위해 호출자(Caller)의 상태(Stack frame) 및 반환 주소(Return Address)를 저장해야 함

- 호출자는 피호출자(Callee)가 요구하는 인자를 전달해줘야 하며, 피호출자의 실행이 종료될 때 반환 값을 전달받아야 함

 

  • CPU 아키텍처에 따라, 컴파일러에 따라 호출 규약이 다를 수 있음
  • x86-64 아키텍처에서는 MSVC(컴파일러)는 MS x64 호출 규약 적용, gcc는 SYSTEM V 호출 규약 적용
x86-64 호출 규약: SYSV

1. 6개의 인자를 RDI, RSI, RDX, RCX, R8, R9에 순서대로 저장하여 전달, 더 많은 인자는 스택에 저장

2. Caller에서 인자 전달에 사용된 스택 정리

3. 함수 반환 값은 RAX로 전달