'한빛아카데미 - 시스템 해킹과 보안' 교재에 관한 내용입니다.
• 80x86 시스템 메모리 구조
• 스택
- 후입선출(LIFO : Last-In, First Out) 방식에 의해 정보를 관리
- Top이라고 불리는 스택의 끝부분에서 데이터의 삽입과 삭제가 발생
- 가장 나중에 삽입된 정보가 가장 먼저 읽힘
- 컴퓨터 메모리 상의 스택은 프로그램 함수 내부에서 정의
- 함수 종료와 동시에 사라지는 자동 변수가 저장되고 함수를 호출할 때 함수 내부의 로컬 변수 등이 저장되는 곳
- 스택은 함수 실행 동안에만 존재하며, 종료 시 해당 변수들도 사라짐
- ESP 레지스터는 항상 스택의 가장 위(스택의 끝)를 가리킴
• 힙(Heap)
- 프로그램의 실행 중 필요한 기억 장소를 할당하기 위해 운영체제에 예약되어 있는 기억 장소영역
- 데이터를 저장하기 위해 기억 장소를 요청하면 운영체제는 힙에 존재하는 기억 장소를 프로그램에 할당
- 기억 장치가 더 이상 필요 없으면 할당 받았던 기억 장소를 운영체제에 반납, 운영체제에서는 반납된 기억 장소를 다시 힙에 돌려줌
- 힙에 대한 기억 장소는 포인터를 통해 동적으로 할당되거나 반환
- 연결 리스트, 트리, 그래프처럼 동적인 특성이 있는 데이터 구조에서 널리 사용
char * p = new char[1000];
• BSS 세그먼트
- 초기화 되지 않은 데이터 세그먼트(Uninitalized data segment)라고 불리며, 프로그램이 실행될 때 0이나 NULL 포인터로 초기화
- 외부 변수나 static 변수 중 초기화 되지 않은 변수들을 저장하는 영역
static int a;
• 데이터 세그먼트
- 초기화된 외부 변수나 static 변수 등이 저장되는 영역
static int a = 1;
• 텍스트 세그먼트
- CPU로 실행되는 머신 코드가 있는 영역으로, EIP가 다음에 실행하는 명령을 가짐
• 초기 8086 시스템 메모리 구조
- 초기 8086 CPU 사용하던 컴퓨터는 메모리 크기가 1MB 였음
• 메모리 접근 모드
1 | 실제모드
- X86계열로 처음 등장한 8086 CPU에 사용
- 프로그램이 실제 메모리에 바로 접근하는 방식
2 | 보호모드 - 80286부터 도입된 보호 모드(Protected Mode)는 32비트 CPU 80386에서 완성
- 프로그램이 각자의 가상 메모리 영역에 할당됨 - 다른 프로그램의 접근을 막는 데이터 보호 기능 제공
• 실제 모드
- 20비트 주소 버스로 총 1MB(𝟐 𝟐𝟎 = 𝟏, 𝟎𝟒𝟖, 𝟓𝟔𝟕) 메모리 사용 가능
- 16비트 레지스터로 20비트 주소를 나타내기 위해 세그먼트 레지스터 도입
- 아래 그림 처럼, 16비트 세그먼트 레지스터와 16비트 오프셋을 중첩시켜 20비트의 물리 주소 생성
- 세그먼트 주소인 CS 레지스터가 0x2525h
- 오프셋인 IP가 0x95F3h면 0x2525h 뒤에 한 자리의 0x0h를 붙여 0x95F3h를 더한 0x2E843h가 실제 가리키는 물리 주소가 됨
- 이를 2525h:95F3h 또는 [CS]: 95F3h
세그먼트 레지스터 | 오프셋 레지스터 |
CS | IP |
DS | SI, DI, BX |
SS | SP, BP |
ES | SI, DI, BX |
- 모든 메모리 접근에는 세그먼트와 오프셋이 함께 필요하며, 세그먼트 하나를 사용하면 64KB (2^16 = 65,536) 메모리 사용 가능
- 모든 프로그램은 처음 시작할 때는 실제 모드에서 동작
- 실제 모드에서 동작하는 프로그램은 메모리의 어떤 영역이든지 마음대로 접근 가능
• 보호 모드
- 32비트 주소 버스를 통해 4GB의 메모리를 사용 가능
- 메모리 보호 기능과 페이징(Paging) 등을 통해 가상 메모리 구현
- 세그먼테이션(Segmentation)과 페이징을 이용하여 메모리 관리
- 세그먼테이션은 4GB의 메모리를 세그먼트 단위로 쪼갠 것
- 16비트의 셀렉터(Selector)와 32비트의 오프셋을 이용해 32비트 선형 주소(linear address)를 만듦
- 선형주소는 4KB 단위로 쪼개서 관리하는 페이징을 이용하여 물리주소로 변환됨