<리버싱 핵심원리>로 공부하였다.
04 IA-32 Register 기본 설명
4.1. CPU 레지스터 : CPU 내부에 존재하는 다목적 저장 공간, RAM과는 다르게 CPU와 한 몸이라 고속으로 처리 가능
IA-32(Inter Architecture 32비트)에서 제공하는 어셈블리 명령어를 공부해야(방대한 양이라 한번에 공부하는건 어려움) 디버깅을 잘 할 수 있는데 이 명령어를 제대로 이해하려면 레지스터를 알아야한다.
4.2. IA-32의 레지스터
IA-32는 지원하는 기능과 레지스터의 수가 매우 많다. 초급 단계일 때는 Basic program execution register를 알아두자.
순차적으로 Control, Memory management, Debug 레지스터 등에 대해서 공부하면 좋다.
4.2.1. Basic program execution registers
![]() |
![]() |
![]() |
Basic program execution registers는 위와 같이 4개의 그룹으로 나눌 수 있다.
-General Purpose Registers (32비트 - 8개)
-Segment Registers (16비트 - 6개)
-Program Status and Control Registers (32비트 - 1개)
-Instruction Pointer (32비트 - 1개)
레지스터 이름에 E가 붙은 건 예전 16비트로 존재하던 레지스터들이 확장되었다는 의미
1) 범용 레지스터(General Purpose Registers)
범용적으로 사용되는 레지스터.
보통 상수/주소 등을 저장할 때 주로 사용되며, 어셈블리 명령어에서는 특정 레지스터를 조작하기도 한다.
더 구체적으로 나누어지는 이유는 하위 호환을 위해서이다.
예시>EAX : 32비트, AX : EAX의 하위 16비트, AH : AX의 상위 8비트, AL : 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 주로 산술연산 명령어에서 값 저장 용도로 사용. ECX는 반복 카운트로, 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) 주로 메모리 주소를 저장하는 포인터로 사용. ESP는 스택 메모리 주소를 가리킨다. EBP는 함수가 호출 되었을 때 그 순간의 ESP를 저장했다가 함수 리턴 직전에 다시 되돌려줘서 스택이 깨지지 않도록 한다. ESI와 EDI는 특정 명령어들과 함께 메모리 복사에 사용. |
2) 세그먼트 레지스터(Segment Registers)
세그먼트 : 메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법
페이징 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용. 세그먼트 메모리는 SDT에 기술되어 있는데 이 SDT의 index를 가지는 게 세그먼트 레지스터이다.
위와 같이 세그먼트 레지스터가 가르키는 세그먼트 디스크립터와 가상 메모리가 조합되어 선형 주소가 되고, 이 선형 주소가 페이징 기법을 거치면 최종적으로 물리 주소가 되는 것이다. (페이징 사용X -> 선형주소=물리주소)
-CS : Code Segment
-SS : Stack Segment
-DS : Data Segment
-ES : Extra(Data) Segment
-FS : Data Segment (SEH, TEB, PEB 등 주소 계산 시 사용)
-GS : Data Segment
3) 프로그램 상태와 컨트롤 레지스터
-EFLAGS : Flag Register
EFLAGS 레지스터는 위와 같이 각각의 비트마다 의미를 가지고 있다. 각 비트는 1 or 0의 값을 가지는데 이는 시스템에서 직접 세팅 혹은 명령의 수행 결과에 따라 세팅 된다. (On/Off or True/False 의미)
현재 단계에서는 애플리케이션 디버깅에 필요한 ZF, OF, CF만 이해하고 있어도 된다.
-ZF(Zero Flag) : 연산 명령 후에 결과가 0이면 1로 세팅.
-OF(Overflow Flag) : 부호 있는 수의 오버플로가 발생했을 때 1로 세팅, MSB가 변경되었을 때 1로 세팅.
-CF(Carry Flag) : 부호 없는 수의 오버플로가 발생했을 때 1로 세팅.
4) Instruction Pointer
-EIP : Instruction pointer
Instruction Pointer는 CPU가 처리할 명령어의 주소를 나타내는 레지스터.
CPU는 EIP에 저장된 메모리 주소의 명령어를 하나 처리하고 난 후 자동으로 그 명령어 길이만큼 EIP를 증가시킨다.
직접 값을 변경할 수 없으며 다른 명령어로 간접적으로 변경해야한다(특정 명령어 이용, 인터럽트나 예외 발생시키기)