리눅스 메모리 레이아웃
컴퓨터는 크게 CPU와 메모리로 구성되어 있다.
CPU에서는 ISA를 처리하고, 이 결과를 메모리에 옮긴다.
누군가 악의저으로 메모리를 조작하여 CPU에게 잘못된 연산을 수행하게 할 수 있다.
이를 메모리 오염이라 하는데, 이 취약점을 통한 여러 공격이 존재한다.
세그먼트
리눅스에서 메모리를 5가지의 세그먼트로 구분한다.
각 세그먼트는 읽기, 실행 중 하나만 실행 가능할 수 있다.
예를 들면 코드 세그먼트는 읽기, 실행이 둘 다 가능해야한다.
그러나 데이터 세그먼트는 읽기만 가능해야 한다.

코드 세그먼트
정수를 반환하는 main 함수가 컴파일 되면 기계어로 변환되는데, 이 기계어가 코드 세그먼트에 위치한다.
데이터 세그먼트
컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치하는 세그먼트
쓰기 가능한 데이터 세그먼트와 불가능한 데이터 세그먼트가 분리되어 있다.
쓰기 가능한 데이터 세그먼트는 전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터들이 위치하는 곳.
쓰기 불가능한 데이터 세그먼트는 값이 변하면 안되는, 전역 상수 등이 있다.
이는 rodata라고도 불린다.

위 그림을 보면 *str_ptr 변수는 data 세그먼트에 존재하나, 이 변수가 품고 있는 상수 값은 rodata에 저장되어 있다.
BSS 세그먼트
Block Stated By Symbol Segment
컴파일 시점에 값이 정해지지 않는 전역 변수가 위치하는 메모리 영역이다.
이 영역은 초기화 하지 않은 전역 변수가 있다.
프로그램이 시작될 때 모두 0으로 초기화 시킨다.
이 세그먼트에는 읽기, 쓰기 권한이 부여된다.
스택 세그먼트
프로세스의 스택이 위치하는 영역으로, 함수의 인자나 지역 변수와 같은 임시 변수들이 실행 중에 여기에 위치한다.
스택 세그먼트는 스택 프레임이라는 단위로 사용되고, 이는 함수 호출 및 반환시 생성, 해제가 된다.

지역 변수 choice가 스택에 위치되어 있다.
힙 세그먼트
힙 데이터가 위치하는 세그먼트다.
스택 세그먼트와 같이 동적으로 할당되며, 반대 방향으로 확장된다.
c 언어에서 malloc(), calloc()과 같은 동적 할당 함수가 실행되면 저장된다.
힙과 스택 세그먼트가 반대로 자라는 이유
두 세그먼트가 동일한 방향으로 자랄 경우 충돌이 일어날 수 있다.
이를 해결하기 위해 리눅스는 스택을 메모리의 끝에 위치시키고, 힙과 스택을 반대로 확상시키게 했다.

요약

'컴퓨터 과학 > 시스템보안' 카테고리의 다른 글
| 스택 버퍼 오버플로우 공격3 (0) | 2024.11.27 |
|---|---|
| 스택 버퍼 오버플로우 공격2 (1) | 2024.11.26 |
| 스택 버퍼 오버플로우 공격 (0) | 2024.11.22 |
| 스택 메모리의 호출 관계 (0) | 2024.11.22 |
| 컴퓨터 구조 및 x86 아키텍처 (0) | 2024.11.20 |