CPU가 필요한 데이터를 읽고 처리하는데, 연산의 결과를 메모리 다시 적재를 한다.
그래서 CPU의 동작과 메모리 사이의 관련은 크고, 메모리 값의 조작으로 CPU의 잘못된 동작을 유도 할 수 있다.
이 오염된 메모리를 메모리 오염 취약점이라고 한다. (드림핵 커리큘럼에서는 메모리 오염에 관련 취약점을 공부함)
리눅스 프로세스의 메모리 구조
리눅스에서 프로세스는 크게 5가지의 세그먼트(Segment)로 구분한다.
세그먼트 : 적재되는 데이터의 용도별로 메몰의 구획을 나눈 것.
용도별로 나누어, 용도에 맞게 적절한 권한이 부여 되는데, 이 권한은 읽기, 쓰기, 실행이 존재하며, CPU는 이 권한이 부여된 행위만 할 수 있다.
코드(Text) 세그먼트(Code Segment) - 실행 가능한 기계코드가 위치하는 영역
프로그램 실행을 위해 읽기 권한과 실행 권한이 부여 된다.
악의 적인 코드 삽입 공격이 쉬우므로 대부분 쓰기 권한이 없다.
데이터 세그먼트(Data Segment) - 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들 위치
CPU가 데이터를 읽어야 하므로, 읽기 권한이 부여 된다.
데이터 세그먼트 내에서 쓰기 권한의 여부로 한번 더 분류가 되는데, 쓰기가 가능한 세그먼트는 전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터가 위치하며, 이 세그먼트를 data 세그먼트라고 한다.
쓰기권한이 없는 세그먼트는 값이 변하는 안되는 데이터들이 위치하고, 전역으로 선언된 상수가 포함된다. 이 세그먼트를 rodata(read-only data) 세그먼트 라고 한다.
BSS 세그먼트(BSS Segment, Block Started By Symbol Segment) - 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치
개발자가 초기화를 하지 않은 전역 변수 등이 포함이 되며, 이 세그먼트의 메모리 영역은 프로그램이 시작될 때, 모두 0으로 값이 초기화 도니다. 그래서 C 소스코드에서 전역변수를 초기화 하지 않을 경우 0이 된다. 이 세그먼트는 읽기와 쓰기 권한이 부여 된다.
스택 세그먼트(Stack Segment) - 프로세스의 스택이 위치하는 영역
함수의 인자나 지역 변수와 같은 임시 변수들이 실행 중에 저장된다.
스택 세그먼트는 Stack Frame 단위로 사용된다. 스택 프레임은 함수가 호출될 때 생성되고, 반환도리 때 해제 된다.
프로세스가 실행될 때, 얼마 만큼의 스택 프레임을 사용하게 될 지 계산 할 수 없으므로, 운영체제에서는 작은 크기의 스택 세그먼트를 먼저 할당한다. 이때 할당 공간이 부족해 질 때마다 확장해주는데, 기존 주소보다 낮은 주소로 확장되어 아래로 자란다고 표현한다. 이 세그먼트에는 CPU가 자유롭게 읽고 써야 하므로 읽기와 쓰기 권한이 부여 된다.
힙 세그먼트(Heap Segment) - 힙 데이터가 존재
스택과 마찬가지로 실행 중에 동적으로 할당될 수 있으며, 리눅스에서는 스택 세그먼트와 반대 방향으로 자란다.
C언어에성의 malloc(), calloc() 등을 호출하여 할당받는 메모리가 이 세그먼트에 위치하며 일반적으로 읽기와 쓰기권한이 부여된다.