프로그래밍을 공부한 내용을 정리하며 기록하고 있습니다 📝
주소값
프로그램에서 선언한 변수 등을 메모리에 저장할 때, 해당 데이터가 메모리 어디에 저장되었는지 나타내는 값이 주소값입니다. 주소값은 메모리 상의 특정 바이트 위치를 가리키는데, 이를 통해 프로그램은 해당 데이터를 찾고 읽거나 수정할 수 있습니다.
메모리의 주소값은 16진수로 표기되며, 32비트는 8자리 (ex : 0x7FFFFFFF) , 64비트는 16자리 (ex : 0x000000E65211FC94) 로 운영체제의 비트에 따라 주소값의 자리수가 다릅니다.
이는 운영체제에서 접근 가능한 메모리 최대 용량 차이 때문이기도 합니다. 32비트는 대략 4GB, 64비트는 이론적으로는 16EB이나, 운영체제 또는 하드웨어에 따라 달라질 수 있습니다.
메모리 할당
즉, 프로그램에서 데이터를 메모리에 저장하고 해당 메모리를 가르키는 주소값을 받는 과정이 메모리 할당 입니다.
메모리 영역과 데이터의 종류와 방식에 따라, 각각 다른 시점이나 다른 영역에 저장되게 됩니다. (CS : 소프트웨어 기초 - 메모리 할당과 구조 글 참고)
메모리 할당이 이루어진 뒤, 프로그램을 재시작하면 메모리가 할당된 주소값은 변경됩니다.
이는 다음과 같은 여러가지 이유들로 인해 발생하게 됩니다.
1. 운영 체제의 가상 메모리 관리
운영 체제는 가상 메모리 관리 시스템을 통해 각 프로그램 별로 메모리 공간을 분리합니다. 이러한 프로그램들이 종료 또는 실행될 때마다 운영 체제는 메모리를 임의로 할당하며, 이전에 실행했을 때와 다른 주소값을 받게 되는 경우가 생길 수 있습니다.
2. ASLR (Adress Space Layout Randomization, 주소 공간 배치 무작위화)
ASLR은 보안 기능 중 하나로, 프로그램을 재실행할 때마다 메모리 주소를 무작위로 변경해 공격을 어렵게 만듭니다. 특히 특정 메모리를 공격하는 방식인 버퍼 오버플로우 공격에서 시스템을 보호하는 데 사용됩니다.
특히 운영체제에서 제공하는 라이브러리, 스택, 힙 메모리 등에서 주소값을 랜덤화하여 프로그램의 메모리 배치를 예측하기 어렵게 만듭니다. 이 과정에서 프로그램이 재실행될 때 주소값이 변경되게 됩니다.
(ASLR 에 대한 더 자세한 내용은 아래 블로그 글을 추천드립니다.)
ASLR
ASLR(Address Space Layout Randomization)은 시스템 보안을 강화하기 위한 기법 중 하나로, 프로세스가 메모리에 로드되는 주소를 무작위로 배치하여 공격자가 특정 메모리 주소를 예측하기 어렵게 만드는
drdbg.com
이 외에도 GC(가비지 컬렉션) 을 통한 메모리 할당 및 해제 과정에서 주소값이 변경되는 경우 등 여러가지 경우들이 존재하는데,
결국 주소값은 고정되지 않은 변동될 수 있는 값이라는 것을 기억하고 넘어가겠습니다.
출처
Window 문서 - 윈도우 운영체제 버전 별 최대 메모리 제한값
'Programming' 카테고리의 다른 글
CS : 소프트웨어 기초 (0) | 2024.10.19 |
---|