본문 바로가기
Security/Pwnable

Buffer Overflow 원리 - 8086 메모리구조

by J0DEV 2021. 8. 6.
반응형

8086 메모리 구조

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

기본적인 명령어 집합을 커널에서 찾기 때문에 반드시 저위치에 있어야한다.

 

기본적으로 커널은 64KByte 영역에 자리잡지만 이를 확장하여 오늘날의 운영체제들은 더 큰 영역을 사용한다.

 

32bit시스템에서는 한꺼번에 처리할 수 있는 데이터가 32bit단위로 되어 있기 때문에 메모리 영역에 주소를 할당할 수 있는 범위가 0~2^32-1이다.

64bit는 0~2^64-1의 범위를 가진다.

 

 

하나의 프로그램이 실행되기 위한 메모리 구조(운영체제는 하나의 프로세스를 실행시키면 이 프로세스를 segment라는 단위로 묶어서 가용 메모리에 저장시킨다.

 

이 그림과 같이

오늘날 시스템은 멀티태스킹이 가능하므로 메모리에는 여러 개의 프로세스가 저장되어 병렬적으로 작업을 수행한다.

 

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

segment는 실행시점에 실제 메모리의 어느 위치에 저장될 지가 결정된다.

 

하나의 세그먼트는 stack segment, data segment, code(text) segment의 구조를 가지고 있다. 시스템에는 최대 16383개의 segment가 생성될 수 있고 그 크기와 타입은 모두 다양하게 생성될 수 있다.

하나의 segment는 최대 2^32byte의 크기를 가질 수 있다. (32bit운영체제)

 


Code Segment

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

기서은 기계어 코드로로써 컴파일러가 만들어낸 코드이다.

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

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

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

 

따라서 segment에서는 logical address를 사용한다. Logical address는 실제 메모리 상의 주소와 매핑되어 있다.

즉 segment는 segment selector에 의해서 자신의 시작 위치(offset)을 찾을 수 있고 자신의 시작 위치로부터의 위치(logical address)에 있는 명령을 수행할 지를 결정하게 되는 것이다.

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

 

segment가 실제로 위치하고 있는 메모리상의 주소가 0x80010000이라 가정할때

code segment내에 들어있는 하나의 instrument IS1을 가르키는 주소는 0x00000100이다.

이것은 logical address이고 이 instruction의 실제 메모리 상의 주소는 segment offset인 0x80010000과 segment내의 주소 0x00000100을 더한 0x80010100이 된다.

따라하서 이 segment가 메모리상의 어느 위치에 있더라도 segment selector가 segment offset을 알아내어 해당 instruction의 정확한 위치를 찾아낼 수 있게 된다.

 


Data Segment

data segment에는 프로그램이 실행시에 사용되는 데이터(전역 변수)가 들어간다. data segment는 다시 4개의 data segment로 나뉘는데 각각 현재 모듈의 data structure, 상위 레벨로부터 받아들이는 데이터 모듈, 동적 생성 데이터, 다른 프로그램과 공유하는 공유데이터 부분이다.

 


Stack Segment

stack segment는 현재 수행되고 있는 handler, task, program이 저장하는 데이터 영역으로 우리가 사용하는 버퍼가 바로 이 stack segment에 자리잡기 된다.

또한 프로그램이 사용하는 multiple 스텍을 생성할 수 있고 각 스택들 간의 switch가 가능하다. 지역변수들이 자리 잡는 공간이다.

스택은 처음 생성될 때, 그 필요한 크기만큼 만들어지고 프로세스의 명령에 의해 데이터를 저장해 나가는 과정을 거치게 되는데 이것은 stack pointer (SP)라고 하는 레지스터가 스텍의 맨 꼭대기에서 가리키고 있다.

 

스텍에 데이터를 저장하고 읽어 들이는 과정은 PUSH와 POP instruction에 의해서 수행된다.

 

 

 

참고 : 해커 지망생이 알아야할 bof 기초 -달고나

 

 

반응형

'Security > Pwnable' 카테고리의 다른 글

Buffer Overflow 원리 - 프로그램 구동시의 segment (1)  (0) 2021.08.06
Buffer Overflow 원리 - 8086CPU 레지스터 구조  (0) 2021.08.06
FTZ Level 10  (0) 2021.08.06
FTZ Level 9  (0) 2021.08.06
FTZ Level 8  (0) 2021.08.06