memory layout

agnusdei·2025년 9월 11일

CTF

목록 보기
110/185

🔹 1. 코드 영역 (Text Segment, .text)

  • 하는 일: 프로그램의 실행 코드(기계어 명령) 가 저장되는 영역.

  • 특징:

    • 보통 읽기 전용(Read-Only) 으로 설정 → 실행 중에 코드가 변조되지 않도록 보호.
    • 함수, 제어문 등 실제 실행 명령들이 들어 있음.
  • 예: main() 함수 내부의 명령들이 여기 저장되어 실행됨.


🔹 2. 데이터 영역 (Data Segment)

데이터를 저장하는 두 부분으로 나뉩니다.

  1. 초기화된 데이터 영역 (Initialized Data, .data)

    • 전역 변수(Global Variable), 정적 변수(Static Variable) 중 초기값이 있는 것이 저장됨.
    • 예: int a = 10;
  2. 초기화되지 않은 데이터 영역 (Uninitialized Data, .bss)

    • 전역/정적 변수 중 초기값이 없는 것이 저장됨.
    • 프로그램 시작 시 자동으로 0으로 초기화됨.
    • 예: int count;

🔹 3. 힙 영역 (Heap)

  • 하는 일: 실행 중에 동적으로 할당되는 메모리.

  • 특징:

    • 사용자가 malloc, new 같은 함수를 통해 직접 관리.
    • 필요할 때 할당하고, 다 쓰면 free, delete로 해제해야 함.
    • 올바르게 관리하지 않으면 메모리 누수(Memory Leak)취약점(Heap Overflow) 가 발생.
  • 예: 동적으로 배열 만들기 → int *arr = malloc(100 * sizeof(int));


🔹 4. 스택 영역 (Stack)

  • 하는 일: 함수 호출 시 지역 변수, 매개변수, 리턴 주소 등이 저장되는 공간.

  • 특징:

    • 컴파일러가 자동으로 관리 (함수 호출하면 쌓이고, 끝나면 정리).
    • LIFO (Last In, First Out, 후입선출) 구조.
    • 크기가 한정되어 있어서 너무 큰 배열을 선언하면 Stack Overflow(스택 오버플로우) 발생.
  • 예:

    void foo(int x) {
        int y = 5;  // 지역 변수 y는 스택에 저장됨
    }

🔹 5. 기타 (시스템 관련 영역)

  • 커널 영역 (Kernel Space)

    • 사용자 프로그램이 직접 접근할 수 없는 영역.
    • 운영체제가 관리하는 메모리와 장치 제어 코드 저장.
  • 라이브러리 영역 (Shared Libraries, .so, .dll)

    • 동적 라이브러리 코드들이 로딩되는 공간.

📊 정리 (간단 표)

영역저장 내용특징
.text (코드)실행 명령어읽기 전용, 프로그램 실행 코드
.data초기화된 전역/정적 변수실행 중에도 값 변경 가능
.bss초기화 안 된 전역/정적 변수실행 시 0으로 초기화
Heap (힙)동적 메모리개발자가 직접 관리 (malloc/free)
Stack (스택)지역 변수, 매개변수, 함수 호출 정보자동 관리, LIFO, 크기 제한 있음
Kernel운영체제 코드/데이터사용자 프로그램 직접 접근 불가

👉 정리하면:

  • .text / .data / .bss → 프로그램이 메모리에 올라갈 때 고정된 부분
  • Heap → 실행 중 필요에 따라 늘었다 줄었다 하는 영역 (개발자가 관리)
  • Stack → 함수 호출 시 자동으로 관리되는 임시 저장소

profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글