프로세스 주소 공간에 대해 공부하며 스택 오버플로우, 힙 오버플로우에 대한 궁금증이 생겼다.
메모리에서 스택 영역은 큰 주소값에서 작은 주소값으로 할당되고, 힙 영역은 작은 주소값에서 큰 주소값으로 할당된다.
(이는 버퍼 오버플로우를 막기 위해서 이다. 스택 영역 뒤에는 커널 영역이 있는데, 만약 스택 영역을 초과하는 크기의 데이터를 저장하면 커널 영역을 침범해 데이터를 조작하는 등 해킹이 일어날 수 있다. 때문에 스택 영역은 큰 주소에서 작은 주소로 메모리를 할당한다.)
- 버퍼 오버플로우
- 연속된 메모리 공간을 사용하는 프로그램이 할당된 메모리 영역을 벗어난 위치에서 데이터를 읽거나 쓰려고 할 때 발생하는 것
- 버퍼 오버플로우가 발생하면 프로그램이 오작동하거나, 공격자가 임의의 코드를 삽입시켜 해킹할 수 있다.
스택 오버플로우
스택 영역은 함수의 호출과 함께 할당되고, 함수가 종료하면 해제되는 공간이다.
만약 프로그램에서 함수의 재귀 호출이 무한히 반복되면 스택 오버플로우가 발생할 수 있다.
- 함수의 재귀 호출이 무한히 발생한다.
- 스택 프레임이 스택 영역에 계속 쌓이게 된다.
- 스택 영역의 모든 공간이 찼을 때, 다시 함수를 호출하게 되면 그때 생기는 스택 프레임은 스택 영역을 넘어가서 저장하게 된다.
- 이렇게 되면 해당 프로그램은 오작동을 하거나 보안상 큰 취약점을 가지게 된다. 따라서 프로그래밍 언어에서는 스택 오버플로우가 발생하면 에러를 발생시키고 프로그램을 강제 종료 시킨다.
힙 오버플로우
힙 영역은 런타임 시에 애플리케이션에 의해 동적으로 할당, 해제되는 메모리 영역이다.
힙에 문자열, 객체 등이 저장될 때 미리 지정한 크기의 힙 메모리 사이즈를 초과하여 저장될 경우 버퍼 오버플로우가 발생한다.
(ex) 악의적으로 힙 영역을 벗어나 데이터를 변경하거나 함수 주소를 변경
'CS' 카테고리의 다른 글
[CS 스터디] PCB (Process Control Block) (0) | 2023.07.21 |
---|---|
[CS 스터디] 시스템 콜, fork() wait() exec() (0) | 2023.07.21 |
[Java] HashMap (0) | 2023.07.20 |
[알고리즘] 최대 공약수 구하기 - 유클리드 호제법 (0) | 2023.07.18 |
[CS 스터디] 프로세스 주소 공간 (0) | 2023.07.17 |