1. CPU 레지스터란 ?
- CPU 내부에 존재하는 다목적 저장 공간
- CPU 내부에 존재하므로, RAM에 비해 데이터의 고속 처리가 가능하다.
2. IA - 32의 레지스터
- IA -32는 지원하는 기능도 무척 많은 만큼 레지스터의 수도 많다. 위 그림에 나온 레지스터들 외 에도 다양한 레지스터가 존재한다. 애플리케이션 디버깅의 초급단계에서는 Basic program execution register에 대해 알아 보겠다.
2.1 Basic program execution register
> Basic program execution register 은 크게 4개의 그룹으로 구성된다.
- General Purpose Registers / 범용레지스터 (32비트, 8개)
- Segement Registers / 세그먼트레지스터 (16비트, 6개)
- Program Status and Control Registers / 프로그램 상태와 컨트롤 레지스터 (32비트, 1개)
- Instruction Pointer / 명령어 포인터 (32비트, 1개)
2.1.1 General Purpose Register ( 범용 레지스터) / 32비트 8개
- 산술 연산(ADD, SUB, XOR, OR등) 명령어에서 상수/ 변수 값의 저장용도로 사용 (EAX, EBX, ECX, EDX)
- 메모리 주소를 저장하는 포인터로 사용 (EBP, ESI, EDI, ESP)
- EAX : Accumulator for operands and result data → 일반적으로 함수 리턴값에 사용
- EBX : Pointer to data in the DS segment → 메모리 주소 저장
- ECX : Counter for String and loop operations → 반복문 명령어에서 반복 카운터로 사용
- EDX : I/O Pointer → EAX와 함께 연동해서 사용하며, 큰수의 복잡한 연산과 부호 확장 명령에 사용
- EBP : Pointer do data on the stack → 함수가 호출되었을때, ESP를 저장하고 있다가, 함수 리턴 직전에 ESP에 값을 되돌려줌
- ESI : source pointer for string operations → 데이터를 조작하거나 복사할때 데이터의 주소저장
- EDI : Destination pointer for string operations → 데이터를 복사할 때 목적지의 주소 저장
- ESP : Stack Pointer → 스택 메모리 주소 push,pop 에 따라 4byte씩 값이 변함
2.1.2 Segement Register (세그먼트 레지스터) / 16비트, 6개
- 세그먼트라는 메모리의 한 영역에 대한 주소를 지정한다.
- 세그먼트 : 프로그램에 정의된 코드, 데이터등을 저장하는 특정 영역
- CS(Code Segement) : 실행될 기계 명령어를 포함
- SS(Stack Segement) :
- DS(Data Segement) : 프로그램에서 정의된 데이터, 상수, 작업영역을 포함
- ES(Extra Segement): 추가적인 데이터 세그먼트 → 메모리 주소 주정을 다루는 스트링(문자열 연산)에 사용
- FS(Data Segement): 추가적인 데이터 세그먼트 → SEH,PEB 등의 주소를 계산할 때 사용
- GS(Data Segement) : 추가적인 데이터 세그먼트
2.1.3 Program Status and Control Registers ( 프로그램 상태와 컨트롤 레지스터) / 32비트, 1개
- EFLAGS(Flag Register) > FLAGS 레지스터의 확장형, 1(on/ true); 0(off/false)
- ZF(Zero Flag) : 연산 결과값이 0이면 ZF=1로 설정
- OF(Overflow Flag) : 부호 있는 수 (signed integer)의 오버플로가 발생하면 1로 설정, MSB 변경시 1로 설정
- CF(Carry Flag) : 부호 없는 수 (unsinged inteager)의 오버플로가 발생하면 1로 설정
2.1.4 Instruction Pointer ( 명령어 포인터) / 32비트, 1개
- CPU 가 처리할 명령의 주소를 나타낸다.
- 16비트 IP레지스터의 확장형태
- CPU는 EIP/IP에 저장되어 있는 주소의 명령을 수행한 후, 명령어 길이만큼 EIP/IP 값을 증가시킨다.
- EIP/IP 의 값을 사용자가 직접 수정할 수는 없다. → 다른 명령어를 사용하여 간접적으로 변경
'Reverse Engineernig > study' 카테고리의 다른 글
[리버싱 핵심원리] ch06. abex' crackeme #1 분석 (0) | 2022.12.28 |
---|---|
[리버싱 핵심원리] ch05. 스택 (0) | 2022.12.27 |
[리버싱 핵심원리] ch03. 리틀 엔디언 표기법 (0) | 2022.12.26 |
[리버싱 핵심원리] ch02. Hello World! 리버싱 (0) | 2022.12.26 |
[리버싱 핵심원리] ch01. 리버싱 스토리 (0) | 2022.12.26 |