CPU Register : CPU 내부에 존재하는 다목적 저장 공간.
IA-32 Register
Basic program execution registers
x87 FPU registers
MMX registers
XMM registers
Control registers
Memory management registers
Debug registers
Memory type range registers
Machine specific registers
Machine check register
...
Basic program execution registers
General Purpose Registers (32bit - 8)
Segment Registers (16bit - 6)
Program Status and Control Register (32bit - 1)
Instruction Pointer (32bit - 1)
1. General Purpose Registers
막 쓰는 레지스터. 보통 상수/주소 등을 저장할 대 주로 사용,
* EAX : (0~31) 32비트
* AX : (0~15) EAX의 하위 16비트
* AH : (8~15) AX의 상위 8비트
* AL : (0~7) AX의 하위 8비트
EAX : Accumulator for operands and results data
EBX : Pointer to data in the DS segment
ECX : Counter for string and loop operations
EDX : I/O pointer
위 4개의 레지스터들은 주로 산술연산 (ADD, SUB, XOR, OR 등) 명령어에서 상수/변수 값의 저장 용도로 많이 사용됨.
ECX와 EAX는 특수한 용도로 사용됨 -> ECX는 반복문 명령어(LOOP에서 반복 카운트), EAX는 함수 리턴 값
EBP : Pointer to data on the stack (in the SS segment)
ESI : source pointer for string operations
EDI : destination pointer for string operations
ESP : Stack pointer (in the SS segment)
위 4개의 레지스터들은 주로 메모리 주소를 저장하는 포인터로 사용됨.
ESP는 스택 메모리 주소를 가리킴, (PUSH, POP, CALL, RET)은 ESP를 직접 조작하기도 함.
EBP는 함수가 호출되었을 때 그 순간의 ESP를 저장하고 있다가, 함수가 리턴하기 직전에 다시 ESP에 값을 되돌려줘 스택이 깨지지 않도록 함. (Stack Frame 기법)
ESI와 EDI는 특정 명령어들(LODS, STOS, REP MOVS 등)과 함께 주로 메모리 복사에 사용됨.
2. Segment registers
IA-32 보호 모드에서 세그먼트(Segment)란 메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법을 말한다.
또한 세그먼트는 페이징(Paging) 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용된다.
세그먼트 메모리는 Segment Descriptor Table(SDT)에 기술되어 있는데, 세그먼트 레지스터는 이 SDT의 index를 가지고 있다.
세그먼트 레지스터가 가리키는 세그먼트 디스크립터와 가상 메모리가 조합되어 선형주소(Linear Address)가 되며,
페이징 기법에 의해서 선형주소가 최종적으로 물리주소(Physical Address)로 변한된다.
CS : Code Segment
SS : Stack Segment
DS : Data Segment
ES : Extra(Data) Segment
FS : Data Segment
GS : Data Segment
3. Program Status and Control Register
EFLAGS : Flag Register
Flag는 단어 그대로 깃발이 올라가면 1(ON/TRUE), 내려가면 0(OFF/FALSE)로 이해하면 된다.
Zero Flag(ZF) : 연산 명령 후에 결과 값이 0이 되면 ZF가 1(True)로 세팅됨.
Overflow Flag(OF) : 부호 있는 수 (signed integer)의 오버플로가 발생했을 때 1로 세팅됨.
그리고 MSB(Most Significant Bit)가 변경되었을 때 1로 세팅됨.
Carry Flag(CF) : 부호 없는 수 (unsigned integer)의 오버플로가 발생했을 대 1로 세팅됨.
4. Instruction Pointer
EIP : Instruction Pointer
CPU가 처리할 명령어의 주소를 나타내는 레지스터
범용 레지스터들과는 다르게 EIP는 그 값을 직접 변경할 수 없도록 되어있어 다른 명령어를 통하여 간접적으로 변경해야 함.
EIP를 변경하고 싶을 때는 특정 명령어 (JMP, Jcc, CALL, RET)을 사용하거나, 인터럽트(interrupt), 예외(exception)를 발생 시켜야 함.
Reverse Core 7장 (0) | 2020.01.15 |
---|---|
Reverse Core 5장 (0) | 2020.01.14 |
Reverse Core 3장 (0) | 2020.01.14 |
Reverse Core 2장 (0) | 2020.01.14 |
Reverse Core 1장 (0) | 2020.01.14 |
댓글 영역