리눅스 메모리 구조(Linux Memory Structure) 정리

리눅스 메모리 구조(Linux Memory Structure) 정리

in

컴퓨터는 크게 CPU와 메모리로 구성되어 있습니다. CPU는 실행할 명령어와 명령어 처리에 필요한 데이터를 메모리에서 읽어오고, ISA(Instruction Set Architecture)에 따라 이를 처리합니다. 그리고 연산의 결과를 다시 메모리에 적재합니다. 이는 CPU의 동작과 메모리 사이에 밀접한 연관이 있음을 의미합니다.

만일 공격자가 메모리를 악의적으로 조작할 수 있다면 조작된 메모리 값에 의해 CPU도 잘못된 동작을 수행 할 수 있습니다. 이를 메모리가 오염되었다고 표현하며 이러한 메모리 오염을 유발하는 취약점을 “Memory Corruption” 이라고 부릅니다.

시스템 해킹에는 다양한 공격기법들이 존재하지만, 많은 공격 기법들이 “Memory Corruption”을 기반으로 하고 있습니다. 이러한 “Memory Corruption”과 관련된 취약점으로는 “Stack Buffer Overflow”, “Off by One”, “Format String Bug”, “Double Free Bug”, “Use After Free” 등 여러 기법들이 존재합니다. 또한 해당 취약점의 원리를 이해하기 위해서는 기본적으로 메모리 구조에 대해 이해하고 있어야 합니다.

Segment

리눅스에서는 프로세스의 메모리를 크게 5가지의 Segment로 분류합니다.

세그먼트 역할 일반적인 권한 사용 예시
Code(Text) 실행 가능한 코드가 저장된 영역 Read, Write main() 등 실행 가능한 함수의 코드
Data 초기화된 전역 변수 또는 상수가 위치하는 영역 Read, Write or Read Only 초기화된 전역 변수, 전역 상수
BSS 초기화되지 않는 데이터가 위치하는 영역 Read, Write 초기화되지 않은 전역 변수
Heap 프로그램 실행시 동적으로 할당되는 영역 Read, Write malloc, calloc() 등의 함수로 동적 할당 받은 메모리
Stack 임시 변수가 저장되는 영역 Read, Write 지역 변수, 매개변수 등