[포너블] Calling Convention

Chris Kim·2024년 10월 13일

시스템해킹

목록 보기
6/33

본 문서는 드림핵 커리큘럼 강의를 수강하고 요약한 문서입니다.

함수 호출 규약

함수 내에서 다른 함수를 호출할 때에는 호출자의 상태(스택 프레임), 반환 주소를 저장해야한다. 그리고 호출자는 피호출자가 요구하는 인자를 전달해줘야 한다. 피호출자의 실행이 종료되면 호출자는 반환 값을 전달받아야 한다.
함수 호출 규약 적용은 일반적으로 컴파일러의 책임이나, 저수준 언어로 프로그래밍 하는 경우, 이 규약을 알고 있어야 한다.

함수 호출 규약의 종류

아키텍처와, 컴파일러의 종류에 따라 적용되는 호출 규약의 종류는 다양하다.

x86

  • cdecl
  • stdcall
  • fastcall
  • thiscall

x86-64

  • System V AMD64 ABI의 Calling Convention
  • MS ABI의 Calling Convention

x86-64호출 규약

SYSV

SYSV 호출 규약은 다음 특징을 갖는다.
1. 6개의 인자를 RDI, RSI, RDX, RCX, R8, R9 순서대로 저장하여 전달한다. 더 필요하면 스택을 이용한다.
2. Caller에서 인자 전달에 사용된 스택을 정리한다.
3. 함수의 반환 값은 RAX에 전달한다.

함수가 호출되더라도 지역변수를 사용하지 않으면 스택프레임을 할당하지 않는다. 종결부에 도착하면, 반환값을 rax에 옮긴다.

print $(registers): 레지스터 내용 확인

cdecl

x86아키텍처는 레지스터의 수가 적으므로, 스택들 통해 인자를 전달한다. 그리고 호출자가 인자 전달을 위한 스택을 정리한다. 인자를 스택에 마지막 인자부터 역순으로 push한다.

Summary


위의 표를 숙지하자.

profile
회계+IT=???

0개의 댓글