관리 메뉴

HeeJ's

[01] 메모리 구조 :: BOF 본문

<Information Security>/<System>

[01] 메모리 구조 :: BOF

meow00 2020. 8. 29. 22:09

1. 메모리 구조

8086 Memory Architecture

인텔 8086이란?
인텔사에서 개발한 16비트의 CPU이다. 8086은 20비트의 메모리 주소 버스를 갖고 있어 총 1MB의 물리 메모리를 다룰 수 있다. '세그멘테이션'이라는 방식을 통해 메모리에 접근하도록 되어있다.

 

High address

Available Space
Kernel

Low address

<8086 basic memory structure>

 

시스템이 초기화되기 시작하면 시스템은 커널을 메모리에 적재시키고 가용 메모리 영역을 확인하게 된다.

운영에 필요한 기본적인 명령어 집합을 커널에서 찾기 때문에

커널은 반드시 본인의 위치에 있어야 한다.

커널은 64kByte 영역에 자리잡지만 이를 확장하여 요즘 운영체제는 더 큰 영역을 사용한다.

 

운영체제는 하나의 프로세스를 실행시키면 이 프로세스를 segment 단위로 묶어

가용 메모리 영역에 저장시킨다.

 

멀티 테스킹이 가능한 환경에서는 여러 개의 프로세스가 저장되어 병렬적으로 작업을 수행할 수 있다.

그래서 가용 메모리 영역(Available space)에 여러 개의 segment들이 저장될 수 있다.

 

segment는 하나의 프로세스를 묶은 것으로 실행 시점에 실제 메모리의 어느 위치에 저장될 지가 결정된다.

하나의 segment는 최대 2^32byte의 크기를 가질 수 있다.

Stack segment
Data segment
Code segment

<세그먼트의 구조>

 

 

1. Code segment

시스템이 알아들을 수 있는 명령어(instruction)들이 들어있다.

 

instruction들은 명령을 수행하면서 많은 분기와 점프, 시스템 호출 등을 수행하는데

분기점프의 경우 메모리 상의 특정 위치에 있는 명령을 지정해주어야 한다.

 

하지만 segment는 자신이 현재 메모리 상에 어느 위치에 저장될지 컴파일 과정에서 알 수 없기 때문에

정확한 주소를 지정할 수 없다.

따라서 logical address를 사용한다.

 

logical address는 실제 메모리 상의 주소(physical address)와 매핑되어 있다.

즉, 자신의 시작 위치(offset)을 찾고, 그 시작 위치로부터의 위치에 있는 명령을 수행한다.

따라서, 실제 메모리주소(pyhsical address)는 offset+logical address 라고 할 수 있다.

 

ex) 실제로 위치하고 있는 주소 (offset)가 0x80010000이라고 가정하면

     하나의 instruction은 0x00000100이다.

     이 instruction의 실제 메모리 상의 주소는 segment offset + segment 내의 주소로 0x80010000과 0x00000100을

     더한 0x80010100이 된다.

=> segment selector가 segment의 offset을 알아내어 해당 instruction의 정확한 위치를 찾아낼 수 있게 된다.

 

2. data segment

프로그램이 실행시에 사용되는 전역 변수가 들어간다.

프로그램 내에서 전역 변수를 선언하면 그 변수가 data segment에 자리잡는다.

data segment는 다시 4개의 data segment로 나뒨다.

(1) 현재 모듈의 data structure

(2) 상위 레벨로부터 받아들이는 데이터 모듈

(3) 동적 생성 데이터

(4) 다른 프로그램과 공유하는 공유 데이터

 

3. stack segment

현재 수행되고 있는  handler, task, program이 저장하는 데이터 영역

버퍼가 자리잡는 공간

또한 프로그램이 사용하는 multiple 스택을 생성할 수 있고, 각 스택들 간의 switch가 가능하다.

스택은 처음 생성될 때 필요한 크기만큼 생성되고, 프로세스의 명령에 의해 데이터를 저장해나가는 과정을 거친다.

stack pointer(SP)가 스택의 꼭대기를 가리킨다.

 

 

출처;

달고나 버퍼오버플로우 pdf

'<Information Security> > <System>' 카테고리의 다른 글

[6] File Integrity Operator  (0) 2022.01.24
[05] Byte Order :: BOF  (0) 2020.09.13
[04] Buffer Overflow의 이해 :: BOF  (0) 2020.09.10
[03] 어셈블리어 :: BOF  (0) 2020.09.10
[02] CPU 레지스터 구조 :: BOF  (0) 2020.08.30