시스템 해킹 #2

yxxun1216·2022년 10월 3일
0

System Hacking

목록 보기
2/4

Calling Convention


Background : Calling Convention✏️

1. 함수 호출 규약이란?

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

함수 호출 시 프로그램의 실행 흐름이 다른 함수로 이동하며 반환 시 원래의 함수로 돌아와 기존의 실행 흐름 이어감.

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

-> 피호출자(Callee)가 요구하는 인자 전달, 피호출자 실행 종료 시 반환값 전달받음.

2. 함수 호출 규약의 종류

컴파일러는 지원하는 호출 규약 중 CPU 아키텍처에 적합한 것을 선택.
-> ex. 인자 전달 시 x86 아키텍처는 레지스터의 수가 적어 스택으로 인자 전달, x86-64 아키텍처는 레지스터만 이용하고 인자가 너무 많을 때만 스택 이용.

CPU의 아키텍처가 같아도 컴파일러가 다르면 적용하는 호출 규약이 다를 수 있음.
-> ex. C언어 컴파일 시 윈도우는 MSVC, 리눅스는 gcc 사용.

  • 예시
    - x86 : cdecl, stdcall, fastcall, thiscall
    - x86-64 : System V AMD64 ABI의 Calling Convention, MS ABI의 Calling Convention

3. x86 호출 규약

cdecl

x86 아키텍처는 스택을 통해 인자를 전달하며 사용한 스택을 호출자가 정리함.
인자 전달 시에는 마지막 인자부터 첫 번째 인자까지 거꾸로 스택에 push.

SYSV

리눅스는 SYSTEM V(SYSV) Application Binary INterface(ABI)를 기반으로 제작.
SYSV ABI는 ELF 포맷, 링킹 방법, 함수 호출 규약 등의 내용 포함.

  • SYSV의 함수 호출 규약 특징
    - 6개의 인자를 RDI, RSI, RDX, RCX, R8, R9 순서대로 저장하여 전달하며 더 많은 인자 사용 시 스택 이용
    - Caller에서 인자 전달에 사용된 스택 정리
    - 함수 반환값은 RAX로 전달

SYSV 상세 분석

  1. 인자 전달
  2. 반환 주소 저장
  3. 스택 프레임 저장
  4. 스택 프레임 할당
  5. 반환값 전달
  6. 반환

정리📝

x86 함수 호출 규약

함수 호출 규약사용 컴파일러인자 전달 방식스택 정리
stdcallMSVCStackCallee
cdeclGCC, MSVCStackCaller
fastcallMSVCECX, EDXCallee
thiscallMSVCECX(인스턴스), Stack(인자)Callee

x86-64 함수 호출 규약

함수 호출 규약사용 컴파일러인자 전달방식스택 정리
MS ABIMSVCRCX, RDX, R8, R9Caller
System ABIGCCRDI, RSI, RDX, RCX, R8, R9, XMMO-7Caller

Memory Corruption: Stack Buffer Overflow


버퍼 오버플로우

버퍼

버퍼(Buffer)는 완충 장치 라는 뜻으로, 컴퓨터 과학에서는 데이터가 목적지로 이동되기 전에 보관되는 임시 저장소라는 뜻.

수신 측과 송신 측 사이에 버퍼라는 임시 저장소를 두고 간접적으로 데이터 전달.

  • 송신 측은 버퍼로 데이터 전송하고 수신 측은 버퍼에서 데이터 꺼내 사용
  • 버퍼가 가득 찰 때까지 유실되는 데이터 없이 통신 가능
  • 빠른 속도로 이동하던 데이터가 안정적으로 목적지 도달 가능하도록 완충 작용

최근에는 저장될 수 있는 모든 단위를 버퍼라고 부름.

  • 스택 버퍼 : 스택에 있는 지역 변수
  • 힙 버퍼 : 힙에 할당된 메모리 영역

버퍼 오버플로우

버퍼 오버플로우(Buffer Overflow)는 버퍼가 넘치는 것을 의미함.

버퍼는 각각 크기가 있는데 큰 크기의 버퍼에 들어가야 하는 데이터가 작은 크기의 버퍼에 들어가려 하면 오버 플로우 발생.

일반적으로 버퍼는 메모리상 연속해서 할당되어 어떤 버퍼에서 오버 플로우가 발생하면 뒤에 있는 버퍼들의 값이 조작될 수 있음.

버퍼 오버플로우는 모든 메모리 영역에서 발생할 수 있으며, 이를 통해 중요 데이터가 변조되거나 데이터 유출, 실행 흐름 조작 등의 문제로 이어질 수 있음.

0개의 댓글