메모리 구조에 대해 이야기하기 전 프로그램의 실행순서를 알아보겠습니다.
메모리는 크게 4가지 영역으로 나눌 수 있습니다.
- Code/Text 영역
- Data 영역
- Heap 영역
- Stack 영역
Code/Text 영역
프로그램의 소스코드가 저장되는 영역, 기계어 형태로 저장
Code영역 또는 Text영역이라고도 부릅니다.
CPU는 Code영역에 저장된 명령어들을 하나씩 가져가 실행합니다.
Code영역은 프로그램이 시작하고 종료될 때까지 메모리에 계속 남아있습니다.
Data 영역
전역변수와 static변수가 할당되는 영역
main함수 전에 선언되어 프로그램 시작과 동시에 할당되고 프로그램이 종료하면 메모리에서 소멸됩니다.
Data 영역은 Rodata, BSS, Data 3가지 영역으로 나뉩니다.
Rodata(Read Only data)영역은 읽기 전용 data들이 들어갑니다.
주로 상수, 상수형 문자열 등의 값이 들어갑니다.
읽기 전용 영역이기 때문에 쓰는것은 불가능합니다.
Data영역과 BSS영역
data영역과 bss영역은 둘다 전역 변수를 저장하는건 동일합니다.
정적변수(static)도 이 영역에 저장됩니다.
data영역과 bss영역의 차이는 값이 초기화 되어있는가 되어있지 않은가의 차이입니다.
data영역은 초기화 된 변수, bss영역은 초기화 하기 전의 변수를 저장합니다.
이 영역들은 읽기 쓰기 모두 가능합니다.
Heap 영역
동적으로 선언된 변수가 할당되는 영역
메모리 위쪽 주소부터 할당되는 선입선출(FIFO) 구조
런타임 시 크기가 결정
프로그래머가 원하는 시점에 변수를 할당하고 소멸 가능하도록 하는 영역
사용하고 난 후 메모리 해제를 해주지 않으면 memory leak이 발생하기 때문에 반드시 메모리 해제를 해줘야 합니다.
Stack 영역
함수 호출 시 생성되는 지역변수와 매개변수가 저장되는 영역
메모리 아래쪽 주소부터 할당되는 후입선출(LIFO) 구조
컴파일 타임에 크기가 결정
함수의 호출과 함께 할당되며 함수의 호출이 완료(종료)되면 소멸합니다.
stack영역에 저장되는 함수의 호출 정보를 스택 프레임(Stack Frame)이라고 합니다.
오버 플로우(Overflow)
오버플로우란, 한정된 메모리 공간이 부족하여 메모리 내의 데이터가 넘쳐 흐르는 현상입니다.
Heap Overflow
Heap이 위에서부터 주소를 채워 내려오다가 Stack영역을 침범하는 경우
Stack Overflow
Stack이 아래에서부터 주소를 채워 올라가다가 Heap영역을 침범하는 경우
'Security > Pwnable' 카테고리의 다른 글
Stack의 구조와 Stack Frame Pointer (0) | 2023.04.01 |
---|