[시스템 해킹] 메모리 구조, 레지스터 종류
Buffer Overflow 공격을 알기전에 알아야할 내용입니다.
메모리 구조, CPU 레지스터 종류에 대한 내용입니다.
해당 내용은 달고나님의 문서를 참고해서 작성했습니다.
메모리 구조
1. 커널(운영체제에 필요한 기본 명령어 집합이 있음.)을 메모리에 적재
→ 가용 메모리 영역(32bit : 0~2^32-1, 64bit : 0~2^64-1)을 확인
2. 하나의 프로세스 = 하나의 프로그램이 실행되기 위한 메모리 구조.
- 하나의 segment 구조 : stack - data - code
- 최대 segment 개수 : 16,383개
- 최대 segment 크기 : 2^32 bytes
1) code segment
- 시스템이 알아들을 수 있는 명령어(instruction)들이 들어 있음.
- 하지만, segment는 자신의 현재 메모리 상에 어느 위치에 저장될지 컴파일 과정에서 알 수 없기 때문에 정확한 주소 지정 불가
👉 logic address(논리 주소) 사용
* physical address(물리주소)=offset + logical adress(논리 구조)
2) data segment
- 프로그램이 실행시에 사용되는 데이터가 들어감. 데이터 = 전역 변수.
- data segment 는 4가지로 나눠짐 : data structure, 데이터 모듈, 동적 생성 데이터, 다른 프로그램과 공유하는 공유 데이터
3) stack segment
- 현재 수행되고 있는 handler, task, program이 저장하는 데이터 영역.
- 지역변수들이 자리 잡는 공간.
CPU 레지스터 종류
명령어 집합(Instruction set)과 데이터들을 적절하게 집어내고 읽고 저장하기 위해서 저장공간.
CPU 내부에 존재하는 메모리가 레지스터(register)
- 레지스터 종류
[ 목적에 따라 ]
(1) 범용 레지스터 : 논리연산, 수리연산에 사용되는 피연산자, 주소를 계산하는데 사용되는 피연산자, 메모리 포인터가 저장되는 레지스터. 프로그래머가 임의로 조작 허용.
- 각 레지스터 목적
EAX | 피연산자와 연산결과 저장소 |
EBX | DB segment안의 데이터를 가리키는 포인터 |
ECX | 문자열 처리나 루프를 위한 포인터 |
EDX | I/O 포인터 |
ESI | DS 레지스터가 가리키는 data segment 내의 어느 데이터를 가리키고 있는 포인터. 문자열 처리에서 source를 가리킴. |
EDI | ES 레지스터가 가리키고 있는 data segment 내의 어느 데이터를 가리키고 있는 포인터. 문자열 처리에서 destination을 가리킴. |
ESP | SS 레지스터가 가리키는 stack segment의 맨 꼭대기를 가리키는 포인터 |
EBP | SS 레지스터가 가리키는 스택상의 한 데이터를 가리키는 포인터 |
(2) 세그먼트 레지스터
- code/data/stack segment를 가르키는 주소가 들어 있는 레지스터.
- 프로세스의 특정 세그먼트를 가리키는 포인터 역할.
- CS(code segment), DS, ES, FS, GS(data segment), SS(stack segment)가 있음.
(3) 플래그 레지스터
- 프로그램의 현재 상태나 조건을 검사하는데 사용되는 플래그들이 있는 레지스터.
- Status Flags (상태 플래그)
CF : carry flag. 연산 수행하면서 carry 또는 borrow가 발생하면 1이 됨.
PF : Parity flag. 연산 결과 최하위 바이트 값이 1이 짝수 일때 1이 됨.
AF : Adjust flag. 연산 결과 carry 또는 borrow가 3bit이상 발생할 경우 1이 됨.
ZF : Zero flag. 결과가 zero.
SF : Sign flag. 연산 결과 최상위 비트 값과 같음. 양수:0, 음수:1
OF : Overflow flag. 정수형 결과값이 너무 큰 양수 또는 너무 작은 음수일 때 1이 됨.
DF : Direction flag. 문자열 처리에 있어서 1일 경우 문자열 처리 instruction이 자동으로 감소. 0일 경우 자동으로 증가.
- System Flags (시스템 플래그)
IF : Interrupt enable flag.
TF : trap flag.
IOPL : I/O privilege level field.
NT : Nested task flag.
RF : Resume flag.
VM : Virtual-8086 mode flag.
AC : Alignment check flag.
VIF : Virtual interrupt flag.
VIP : Virtual interrupt pending flag.
ID : Identification flag.
(4) 인스트럭션 레지스터
- 다음 수행해야하는 명령이 있는 메모리 상의 주소가 들어가는 레지스터