레지스터(Register)란 무엇일까요?
- 레지스터(Register)는 리버스 엔지니어링에서 꼭 알아야 하는 지식 중 하나입니다.
레지스터(Register)란 CPU의 정보 처리 혹은 연산 등을 할 때 필요한 데이터를 일시적으로 저장하는 공간입니다.
일시적으로 데이터를 저장했다가 필요 없으면 사라지는 것을 휘발성 메모리라 합니다.
(하지만 레지스터는 휘발성 메모리가 아닌 휘발성으로 데이터를 저장하는 공간입니다.)
휘발성 메모리는 대표적으로 램(RAM)이 있는데요, 하지만 램은 레지스터의 역할을 대체할 수 없습니다.
왜냐하면 메모리 계층 구조를 알면 이해할 수 있는데요.
메모리 계층 구조 사진
위에 사진을 보면 레지스터가 메모리(램) 보다 더 상위층에 있습니다.
만약 CPU에서 연산을 할 때 램을 이용하면 CPU에서 버스를 이용해 램으로 보내고 다시 버스를 타고 CPU로 다시 보내는
느린 작업을 수행하게 됩니다.
하지만 레지스터를 사용한다면 CPU에서 바로 데이터가 이동할 수 있기에 속도가 빠른 작업을 수행합니다.
그래서 메모리가 레지스터를 대체할 수 없습니다.
x86 / x64 차이점
일단 x86은 운영체제에서 32Bit를 의미하고 x64는 운영체제에서 64Bit를 의미합니다.
x86 탄생 스토리
1978년 당시 컴퓨터 부품 회사는 Intel이 독점하고 있었습니다.
Intel이 1978년에 8086이라는 개인용 컴퓨터를 위한 16Bit 마이크로프로세서를 만들었었습니다. 이때 사용된 아키텍처가 x86-16입니다.
이후에 출시된 프로세서들은 8086의 명령어 세트를 기반으로 하여 확장되어, 이러한 이유로 32비트 CPU는 x32라고 표기하지 않고 x86이라고 표기합니다.
그리고 여기서 32Bit랑 64Bit는 왜 나눠지는 걸까요?
바로 레지스터가 한 번에 처리할 수 있는 데이터의 크기가 32Bit인지 64Bit인지 구분할 때 사용합니다.
32Bit는 2^32 = 4GB 즉 0 ~ 4,294,967,295까지 표현할 수 있고 64Bit는 2^64 = 18EB(엑사바이트) 즉 0 ~ 18,446,744,073,709,551,615까지 표현할 수 있습니다.
때문에 32Bit에선 4GB 이상의 렘을 인식할 수 없는 이유기도 합니다.
이러한 이유 때문에 요샌 64Bit 운영체제를 더 많이 사용하는 것을 볼 수 있습니다.
Reverse Engineering에 사용되는 데이터 단위
Bit
Bit는 데이터를 나타내는 최소 단위입니다.
모든 데이터는 0과 1의 조합으로 구성되는데, 이 0 또는 1이 하나의 비트가 됩니다.
1개의 비트는 두 가지 상태를 나타낼 수 있으므로 n개의 비트로는 2ⁿ가지의 상태를 나타낼 수 있습니다.
Byte
1Byte = 8Bit로 Bit가 8개 합쳐져 있는 자료형입니다.
1Byte는 1 ~ 256가지의 상태 표현이 가능합니다.
Word
1 Word = 2Byte = 16Bit로 Byte가 2개 합쳐져 있는 자료형입니다.
1 Word는 1 ~ 65,536가지의 상태 표현이 가능합니다.
Dword
1 Dword = 2 Word = 4Byte = 32Bit로 Word가 2개 합쳐져 있는 자료형입니다.
1 Dword는 1 ~ 4,294,967,296가지의 상태 표현이 가능합니다.
Qword
1 Qword = 2 Dword = 4 Word = 8Byte = 64Bit로 Dword가 2개 합쳐져 있는 자료형입니다.
1 Qword는 1 ~ 18,446,744,073,709,551,616가지의 상태 표현이 가능합니다.
레지스터(Register)의 종류
32비트 레지스터를 기준으로 설명하겠습니다.
32비트 레지스터는 E로 시작되고 64비트는 R로 시작됩니다.
범용 레지스터 ( 32 Bit Register )
EAX (Extended Accumulator Register) | 연산의 결과의 값이나 함수의 리턴값이 저장되는 레지스터입니다. |
EBX (Extended Base Register) | ESI 레지스터와 EDI 레지스터와 같이 사용되는 경우가 많으며 배열의 인덱스 주소 저장 등의 용도로 사용되는 레지스터입니다. |
ECX (Extended Counter Register) | 반복문의 실행 횟수를 저장하는 카운터 레지스터입니다 |
EDX (Extended Data Register) | EAX 레지스터를 보조하며 부호 확장 명령어 혹은 입출력 연산에서 간접주소 지정에 쓰이는 레지스터입니다. |
인덱스 레지스터 ( 32 Bit Register )
ESI (Extended Source Index) | 데이터 이동 혹은 복사 할 때 데이터의 원본 주소를 저장하는 레지스터입니다. |
EDI (Extended Destination Index) | 데이터 이동 혹은 복사 할 때 데이터의 목적지 주소를 저장하는 레지스터입니다. |
포인터 레지스터 ( 32 Bit Register )
ESP (Extended Stack Pointer) | 스택 프레임 최상단의 주소값을 저장하는 레지스터입니다. |
EBP (Extended Base Pointer) | 스택 프레임 첫 시작의 주소값을 저장하는 레지스터입니다. |
EIP (Extended Instruction Pointer) | 다음 실행할 명령어의 주소가 담겨져 있는 레지스터입니다. |
세그먼트 레지스터 ( 16 Bit Register )
세그먼트(Segment)란 프로그램에 정의된 특정 영역으로, 코드, 데이터, 그리고 스택을 포함합니다.
CS (Code Segment) | 기계 명령을 포함한 코드 세그먼트의 시작 주소를 저장하는 레지스터입니다. |
DS (Data Segmnt) | 프로그램에 정의된 데이터 세그먼트의 시작 주소를 저장하는 레지스터입니다. |
SS (Stack Segment) | 스택 세그먼트의 시작 주소를 저장하는 레지스터입니다. |
ES (Extera Segment) | 추가로 사용된 데이터 세그먼트의 주소를 저장하는 레지스터입니다. |
FS | 여분으로 만든 사용처가 없는 레지스터입니다. |
GS |
EFLAG 레지스터 ( 32 Bit Register )
EFLAG 레지스터는 따로 자세히 다루겠습니다.
이런게 있다만 여기서 말하고 넘어가겠습니다.
- 상태 플래그
CF (Carry Flag) |
PF (Parity Flag) |
AF (Adjust Flag) |
ZF (Zero Flag) |
SF (Sign Flag) |
OF (Overflow Flag) |
-제어 플래그
DF (Direction Flag) |
-시스템 플래그
TF ( Trap Flag ) |
IF ( Interrupt Flag) |
IOPL ( Input/Output Priviliege Level ) |
NT ( Nested Task Flag ) |
RF ( Resume Flag ) |
VF ( Virtual 8086 Flag ) |
AC ( Alignment Check Flag ) |
VIF ( Virtual Interrupt Flag ) |
VIP ( Virtual Interrupt Pending Flag ) |
ID ( Identification Flag ) |
다음 블로그는 메모리에 대해 올리겠습니다.
'Computer Science' 카테고리의 다른 글
[Computer Science] 메모리 구조(RAM) (0) | 2023.05.07 |
---|