Iriton's log

Background: Linux Memory Layout 본문

Pwnable/Study

Background: Linux Memory Layout

Iriton 2024. 3. 19. 14:15

*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다.

리눅스 프로세스의 메모리 구조


세그먼트

리눅스에서는 프로세서의 메모리를 크게 5가지의 세그먼트로 구분한다.

용도에 맞게 적절한 권한을 부여할 수 있다는 장점이 있다.

 

코드 세그먼트

실행 가능한 기계 코드가 위치하는 영역으로 텍스트 세그먼트라고도 불린다.

프로그램이 동작하려면 코드를 실행할 수 있어야 돼서 r-x 권한이 부여된다.

쓰기 권한이 없는 이유는 공격자가 악의적인 코드를 삽입하는 것을 방지하기 위해서이다.

 

데이터 세그먼트

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

CPU가 데이터를 읽을 수 있어야 하므로 r— 권한이 부여된다.

  • data segment
    • 쓰기 가능한 세그먼트
    • 전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터가 위치
  • rdata(read-only) segment
    • 쓰기 불가능한 세그먼트
    • 전역으로 선언되어 값이 변하면 안 되는 데이터들이 위치한다.

 

BSS 세그먼트

컴파일 시점에 값이 정해지지 않은 전역 변수가 위치한다.

선언만 하고 초기화하지 않은 전역변수 등이 포함된다.

모두 0으로 값이 초기화된다.

rw- 권한이 부여된다.

 

스택 세그먼트

프로세스의 스택이 위치한다.

함수의 인자나 지역 변수와 같은 임시 변수들이 실행 중에 여기에 저장된다.

스택 프레임이라는 단위로 사용된다.

운영체제는 해당 프로세스가 얼마 만큼의 스택 프레임을 사용하게 될지 미리 계산하기 어렵기 때문에 작은 크기의 스택 세그먼트를 먼저 할당해준 후 부족해질 때마다 이를 확장해 준다.

자유롭게 값을 읽고 쓸 수 있게 rw- 권한이 부여된다.

 

힙 세그먼트

힙 데이터가 위치한다.

프로그램 실행 중에 동적으로 할당될 수 있으며 리눅스에서는 스택 세그먼트와 반대 방향으로 데이터가 쌓인다.(충돌방지를 위해)

C 언어에서 malloc(), calloc() 등을 호출해서 할당받는 메모리가 이 세그먼트에 위치하게 되며, 일반적으로 rw- 권한이 부여된다.

 

요약

코드 세그먼트 실행 가능한 코드가 저장된 영역 읽기, 실행 main() 등의 함수 코드
데이터 세그먼트 초기화된 전역 변수 또는 상수가 위치하는 영역 읽기와 쓰기 또는 읽기 전용 초기화된 전역 변수, 전역 상수
BSS 세그먼트 초기화되지 않은 데이터가 위치하는 영역 읽기, 쓰기 초기화되지 않은 전역 변수
스택 세그먼트 임시 변수가 저장되는 영역 읽기, 쓰기 지역 변수, 함수의 인자 등
힙 세그먼트 실행중에 동적으로 사용되는 영역 읽기, 쓰기 malloc(), calloc() 등으로 할당 받은 메모리

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

Background: Calling Convention  (0) 2024.04.01
Exploit Tech: Shellcode  (0) 2024.03.27
Tool: gdb & pwntools  (0) 2024.03.20
x86 Assembly  (0) 2024.03.19
Background: Computer Architecture  (1) 2024.03.19
Comments