Without a Break

[Dreamhack] Linux Memory Layout 본문

Pwnable/Dreamhack

[Dreamhack] Linux Memory Layout

와븨 2022. 10. 5. 00:32

세그먼트

: 적재되는 데이터의 용도별로 메모리의 구획을 나눈 것

  • 리눅스에서는 프로세스의 메모리를 크게 5가지의 세그먼트로 구분
  • 운영체제가 메모리를 용도별로 나누면, 각 용도에 맞게 권한(읽기,쓰기,실행)을 부여할 수 있다는 장점이 있음
  • 코드 세그먼트, 데이터 세그먼트, BSS 세그먼트, 힙 세그먼트, 스택 세그먼트로 구분

 

코드 세그먼트

: 실행 가능한 기계 코드가 위치하는 영역

  • 텍스트 세그먼트(Text Segment)라고도 불림
  • 읽기 권한실행 권한이 부여 => 프로그램이 동작하려면 코드를 실행할 수 있어야 하기 때문에

 

데이터 세그먼트

: 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치함

  • 읽기 권한이 부여 => CPU가 세그먼트의 데이터를 읽을 수 있어야 하기 때문에
  • 쓰기가 가능한 세그먼트(data 세그먼트)와 쓰기가 불가능한 세그먼트(rodata 세그먼트)로 분류
data 세그먼트 전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터들이 위치
rodata 세그먼트 프로그램이 실행되면서 값이 변하면 안되는 데이터들이 위치
ex) 전역으로 선언된 상수

 

BSS 세그먼트

: 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리 영역

  • 개발자가 선언만하고 초기화하지 않은 전역 변수 등이 포함됨
  • BSS 세그먼트의 메모리 영역은 프로그램이 시작될 때, 모두 0으로 값이 초기화 됨 => C 코드를 작성할 때, 초기화되지 않은 전역 변수의 값은 0이 됨
  • 읽기 권한, 쓰기 권한 부여

 

스택 세그먼트

: 프로세스의 스택이 위치하는 영역

  • 함수의 인자나 지역 변수와 같은 임시 변수들이 실행 중에 여기에 저장됨
  • 스택 프레임 단위로 사용 => 스택 프레임은 함수가 호출될 때 생성되고, 반환될 때 해제
  • 운영체제는 프로세스를 시작할 때 작은 크기의 스택 세그먼트를 먼저 할당하고 부족해 질 때마다 이를 확장해줌
  • 스택이 확장 될 때, 기존 주소보다 낮은 주소로 확장되기 때문에 '아래로 자란다'라는 표현을 씀
  • 읽기 권한, 쓰기 권한 => CPU가 자유롭게 값을 읽고 쓸 수 있어야 하기 때문에

 

힙 세그먼트

: 힙 데이터가 위치하는 세그먼트

  • 실행 중에 동적으로 할당
  • 리눅스에서는 스택 세그먼트와 반대 방향으로 자람
  • c언어에서 malloc(), calloc() 등을 호출해서 할당받는 메모리가 이 세그먼트에 위치
  • 읽기 권한, 쓰기 권한

'Pwnable > Dreamhack' 카테고리의 다른 글

[Dreamhack] Memory Corruption: Stack Buffer Overflow  (0) 2022.10.30
[Dreamhack] Exploit Tech: Shellcode  (0) 2022.10.30
[Dreamhack] Tool: gdb  (0) 2022.10.12
[Dreamhack] Computer Architecture  (0) 2022.10.05
[Dreamhack] Tool: Enviroment Setup  (0) 2022.09.27