'한빛아카데미 - 시스템 해킹과 보안' 교재에 관한 내용입니다.


• 인텔 CPU 모델별 관련 정보

• 80×86 시스템 CPU의 구조
- 연산장치, 제어장치, 레지스터

 

• 연산장치 (ALU:Arithmetic and Logic Unit)

- 연산 장치는 CPU(중앙 처리 장치)의 핵심 부분 중 하나

- 산술과 논리 연산을 수행하는 연산 회로 집합으로 구성

구성 요소 기능
내부 장치 가산기(Adder) 덧셈 연산 수행
보수기(Complementer) 뺄셈 연산 수행
1의 보수나 2의 보수 방식 이용
시프터(Shifter) 비트를 오른쪽이나 왼쪽으로 이동하여 나 눗셈과 곱셈 연산 수행
관련 레지스터 누산기(Accumulator) 연산의 중간 결과 저장
데이터 레지스터 (Data Register) 연산에 사용할 데이터 저장
상태 레지스터 (Status Register) 연산 실행 결과로 나타나는 양수와 음수, 자리올림, 오버 플로우의 상태 기억

 

• 제어 장치(Control Unit)

- 제어 장치(Control Unit)는 입력, 출력, 기억, 연산 장치를 제어하고 감시

- 주기억 장치에 저장된 명령을 차례로 해독하여 연산 장치로 보내 처리되도록 지시

 

구성 요소 기능
내부 장치 명령 해독기(Instruction Decoder) 명령 레지스터에 있는 명령을 해독하여 부호기로 전송
부호기(Decoder) 명령 해독기가 전송한 명령을 신호로 만들어 각 장치 전송
주소 해독기(Address Decoder) 명령 레지스터에 있는 주소를 해독하여 메모리의 실제주소 로 변환한 후, 이를 데이터 레지스터에 저장
관련 레지 스터 프로그램 카운터(Program Counter) 다음에 실행할 명령의 주소 저장
명령 레지스터(Instruction Register) 현재 실행 중인 명령 저장
메모리 주소 레지스터(Memory Address Register) 주기억 장치의 번지 저장
메모리 버퍼 레지스터
(Memory Buffer Register)
메모리 주소 레지스터에 저장된 주소의 실제 내용 저장

 

• 레지스터

- 처리 중인 데이터나 처리 결과를 임시 보관하는 CPU 내의 기억 장치

- 연산 장치나 제어 장치에 함께 포함되어 있음

- 우리가 중요한 내용을 잊지 않게 메모하듯, 프로그램도 레지스터를 이용해서 메모함

- 32비트 운영체제에서는 기본적으로 레지스터가 32비트로, 16비트나 8비트로 나누어 사용하기도 함

 

- 범용 레지스터 - 연산 장치가 수행한 계산 결과의 임시 저장, 산술 및 논리 연산, 주소 색인 등의 목적으로 사용

- 세그먼트 레지스터 - 프로그램에 정의된 메모리상의 특정 영역으로 코드, 데이터, 스택 등을 포함

- 포인터 레지스터 - 프로그램 실행 과정에서 사용되는 주요 메모리 주소값 저장

- 인덱스 레지스터 - 메모리의 한 영역(Souce)에서 다른 영역(Destination)으로 데이터를 연속적으로 복사할 때 사용

- 플래그 레지스터 - 32비트로, 컴퓨터의 다양한 상태를 나타내는 비트 포함

범주 80386 레지스터 이름 용도
범용 레지스터 32bit
(General Register)
EAX 누산기
(Accmulator)
산술 및 논리 연산에 사용하고 함수의 결과(return)값 저장
EBX 베이스 레지스터
(Base Register)
특정 메모리 주소 저장
(주소 지정을 확대하기 위한 인덱스로 사용)
ECX 카운트 레지스터
(Count Register)
반복적으로 실행되는 특정 명령에 사용
(루프의 반복 횟수나 좌우 방향 시프트 비트 수 기억)
EDX 데이터 레지스터
(Data Register)
일반 자료 저장(입출력 동작에 사용)

 

범주 80386 레지스터 이름 용도
세그먼트 레지스터16bit
(Segment Register)
CS 코드 세그먼트 레지스터
(Code Segment Register)
실행될 기계 명령어가 저장된 메모리 주소 지정
DS 데이터 세그먼트 레지스터
(Data Segment Register)
프로그램에서 정의된 데이터, 상수, 작업 영역의 메모리 주소 지정
SS 스택 세그먼트 레지스터
(Stack Segment Register)
프로그램이 임시로 저장해야 하는 데이터나 사용자의 피호출 서브 루틴(called subroutine)이 사용할 데이터와 주소 저장
ES, FS, GS 엑스트라 세그먼트 레지스터
(Extra Segment Register)

문자 연산과 추가 메모리 지정을 위해 사용되는 여분의 레지스터

 

범주 80386 레지스터 이름 용도
포인터 레지스터 32bit
(Pointer Register)
EBP 베이스 포인터 (Base Pointer) SS 레지스터와 함께 사용되어 스택 내 의 변수 값을 읽는 데 사용
ESP 스택 포인터 (Stack Pointer) SS 레지스터와 함께 사용되며 스택의 가장 끝 주소를 가리킴
EIP 명령 포인터 (Instruction Pointer) 다음 명령어의 오프셋(Offset, 상대 위 치 주소)을 저장하며 CS 레지스터와 합 쳐져 다음에 수행될 명령의 주소 형성
인덱스 레지스터 32bit
(Index Register)
EDI 목적지 인덱스 (Destination Index) 목적지 주소에 대한 값 저장
ESI 출발지 인덱스 (Source Index) 출발지 주소에 대한 값 저장
플래그 레지스터 32bit EFLAGS 플래그 레지스터 (Flag Register) 연산 결과 및 시스템 상태와 관련된 여러 가지 플래그 값 저장
 

범용 레지스터

- 연산 장치가 수행한 계산 결과의 임시 저장, 산술 및 논리 연산, 주소 색인 등의 목적으로 사용

- EAX, EBX, ECX, EDX등이 있음

- EAX, EBX, ECX, EDX는 32비트 레지스터로 앞의 E는 ‘확장된(Extended)’을 의미

- 이 레지스터의 오른쪽 16비트를 각각 AX, BX, CX, DX라 부르고, 이 부분은 다시 둘로 나뉨

- 예를 들어, AX는 왼쪽 8비트 상위(high) 부분을 AH, 오른쪽 8비트 하위(low) 부분을 AL이라 함

• EAX 레지스터(Accmulator)

- 누산기, 입출력과 대부분 산술 연산에 사용 - 곱셉, 나눗셈, 변환 명령은 EAX 사용

- Win32 API 함수들은 모두 리턴 값을 EAX에 저장 후 리턴

 

• EBX 레지스터(Base Register)

- DS 세그먼트에 대한 포인터를 주로 저장

- BX는 메모리 주소 지정을 확장하기 위한 인덱스로 사용하는 유일한 범용 레지스터

- ESI나 EDI와 결합하여 인덱스에 사용

 

• ECX 레지스터(Count Register)

- 루프가 반복되는 횟수를 제어하는 값. 왼쪽이나 오른쪽으로 이동되는 비트 수 등을 포함

 

• EDX 레지스터(Data Register)

- 입출력 연산에 사용

- 큰 수의 곱셈과 나눗셈 연산에서 EAX와 함께 사용

 

세그먼트 레지스터

- 프로그램에 정의된 메모리상의 특정 영역으로 코드, 데이터, 스택 등을 포함

- 세그먼트: 메모리를 구성하는 하나의 단위

- 세그먼트 레지스터는 각 세그먼트의 주소를 지정

- CS, DS, SS 레지스터가 기본 구성

- ES, FS, GS 레지스터는 여분 (거의 사용되지 않음)

 

• CS 레지스터

- 실행될 기계 명령을 포함하는 코드 세그먼트의 시작 주소를 가리킴

 

• DS 레지스터

- 프로그램에 정의된 데이터, 상수, 작업 영역을 포함

- 데이터 세그먼트의 시작 주소를 가리킴

- 데이터의 오프셋을 DS 레지스터에 저장된 주소 값에 더해 데이터 세그먼트 내에 위치해 있는 데이터의 주소를 참조

 

• SS 레지스터

- 실행 과정에서 필요한 데이터나 연산 결과 등을 임시로 저장하거나 삭제할 때 사용

- 스택 세그먼트의 시작 주소를 가리킴

 

포인터 레지스터

- 프로그램 실행 과정에서 사용되는 주요 메모리 주소값 저장

 

• EBP 레지스터(Extended Base Pointer Register)

- 스택 세그먼트에서 현재 호출해서 사용하는 함수의 시작 주소 값 저장

- 함수로 전달되는 지역변수 등을 참조할 때 기준이 되며 ESP 레지스터와 함께 사용되어 스택 프레임(Stack frame)을 형성 - 실제 메모리상의 주소를 참조할 때 SS(Stack Segment) 레지스터와 함께 사용

 

• ESP 레지스터(Extended Stack Pointer Register)

- 현재 스택 영역에서 가장 하위 주소를 저장

- EBP와 마찬가지로 실제 메모리상의 주소를 참조할 때SS(Stack Segment) 레지스터와 함께 사용

 

• EIP 레지스터(Extended Instruction Pointer Register)

- 다음에 실행될 명령의 오프셋을 포함

- 현재 실행 중인 코드 세그먼트에 속한 현재 명령 가리킴

- CS(Code Segment) 레지스터와 함께 사용

 

인덱스 레지스터

• ESI & EDI

- 메모리의 한 영역(Source, 출발지)에서 다른 영역(Destination, 목적지)으로 데이터를 연속적으로 복사할 때 사용

- 예로들면 문자열을 복사하는 strcpy함수에서 Source의 문자열을 Destination 으로 복사할 때 두 메모리 주소를 저장하는 데 ESI와 EDI레지스터 사용

 

플래그 레지스터

- 32비트 크기

- 컴퓨터의 다양한 상태를 나타내는 비트들을 포함

- 상태 플래그, 제어 플래그, 시스템 플래그로 구성

 상태 플래그: 산술 명령(ADD, SUB, MUL, DIV) 결과를 반영

- CF(Carry Flag, 비트 0) : 산술 연산 결과로 자리내림 발생할 때 세트(1)

- ZF(Zero Flag, 비트 6) : 산술 연산 결과 0이면 세트(1), 이외에는 클리어(0)

- OF(Overflow Flag, 비트 11) : 부호가 있는 수의 오버플로우가 발생하거나 MSB(Most Significant Bit)가 변경되었을 때 세트

- PF(Parity Flag / 비트 2) : 산술 연산 결과가 짝수이면 세트(1)

- AF(Adjust Flag / 비트 4) : 8비트 피연산자를 사용한 산술 연산에서 비트 3을 비트 4로 자리올림하면 세트(1)

- SF(Sign Flag / 비트 7) : 산술 및 논리 연산 결과가 음수이면 세트(1) 

 

 제어 플래그(Control Flag): 스트링 명령(MOVS,CMPS, SCAS, LODS, STOS)을 제어

- DF 1이면 스트링 명령 자동 감소, 0이면 자동 증가 즉, 1이면 스트링을 높은 주소에서 낮은 주소로 처리, 0이면 스트링을 낮은 주소에서 높은 주소로 처리

 

시스템 플래그(System Flag)

- TF(Trap Flag, 비트 8) : 디버깅 시 Single Step Mode 모드를 활성화하면 세트

- IF(Interrupt enable Flag, 비트 9) : 프로세서의 인터럽트처리 여부를 제어

- IOPL(I/O Privilege Level, 비트 12/13) : 현재 실행되는 프로그램이나 Task의 입출력 특권 레벨 지시

- NT(Nested Task flag, 비트 14) : 인터럽트 되거나 호출된 태스크를 제어

- RF(Resume Flag, 비트 16) : 프로세서의 디버그 예외 반응을 제어, 세트 되어 있으면 디버그 오류를 무시하고 다음 명령어 수행

- VM(Virtual 8086 Mode flag, 비트 17) : V86 모드를 활성화하면 세트

- AC(Alignment Check, 비트 18) : 메모리 참조 시 정렬 기능을 활성화하면 세트

- VIF(Virtual Interrupt Flag, 비트 19), VIP(Virtual Interrupt Pending, 비트 20) : 가상 모드 확장과 관련해 사용

- ID(IDentification, 비트 21) : CPUID 명령의 지원 유무를 결정

+ Recent posts