'한빛아카데미 - 시스템 해킹과 보안' 교재에 관한 내용입니다.
• 인텔 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 명령의 지원 유무를 결정
'System > Hacking and Security' 카테고리의 다른 글
시스템 해킹과 보안 - 어셈블리어의 기본 문법과 명령 2 (0) | 2022.09.27 |
---|---|
시스템 해킹과 보안 - 어셈블리어의 기본 문법과 명령 1 (0) | 2022.09.27 |
시스템 해킹과 보안 - 운영체제 (0) | 2022.09.27 |