본문 바로가기

Reversing/리버싱 공부

레지스터 ( Register )의 이해

 

IA-32(Intel Architecture 32bit)의 레지스터에 대해 정리하겠습니다. ( 리버싱 핵심원리 )

 

레지스터란 CPU 내부에 존재하는 다목적 저장 공간입니다. 일반적으로 메모리라고 얘기하는 RAM(Random Access Memory)과는 성격이 조금 다릅니다. CPU가 RAM에 있는 데이터에 접근하기 위해서는 물리적으로 돌아가야하기 때문에 오래걸리지만, 레지스터는 CPU 내부에 존재하므로 고속으로 데이터를 처리할 수 있습니다.

 

IA-32 레지스터의 종류는 다양하지만

초급 단계에서는 Basic program execution registers에 대해 알아두어야 합니다.

(중/고급 단계에 올라가면 Control registers, Memory management registers, Debug registers 등에 대해 추가적으로 공부해야 합니다.)

 

Basic program execution registers

- General Purpose Registers ( 범용 레지스터 )

- Segment Registers ( 세그먼트 레지스터 )

- Program Status and Control Register ( 프로그램 상태 & 컨트롤 레지스터 )

- Instruction Pointer 

 

  1. General Purpose Registers ( 범용 레지스터 )

 범용 레지스터는 ‘막’ 쓰는 레지스터이기 때문에 용도가 다양합니다.

 32bit(4바이트) 크기의 레지스터 8개로 구성되어 있으며 상수/주소를 저장할때 쓰이고 특정 어셈블리 명령어에서 특정 레지스터를 조작하거나 특수한 용도로 쓰이기도 합니다.

각 레지스터들은 16비트 하위 호환을 위해 몇개의 구획으로 나누어 집니다.

 

 

31

16

8

0

16bit

32bit

 

 

AH

AL

AX

EAX

 

 

BH

BL

BX

EBX

 

 

CH

CL

CX

ECX

 

 

DH

DL

DX

EDX

 

 

BP

 

EBP

 

 

SI

 

ESI

 

 

DI

 

EDI

 

 

SP

 

ESP

 

EAX를 예를 들면..

EAX : 0~31 -> 32비트

AX : 0~15 -> 16비트

AH : 8~15 -> AX의 상위 8비트

AL : 0~7 -> AX의 하위 8비트

가 되는거죠ㅎㅎ

 

각 레지스터들의 용도를 보면..

 

EAX ( Accumulator for operands and results data )

- 산술 연산시 상수/변수 값의 저장 용도

- 함수 리턴값 지정 ( 모든 Win32 API하무는 리턴값을 EAX에 저장 )

EBX ( Pointer to data in the DS segment )

-  산수/변수 저장

- 간접 주소 지정

ECX ( Counter for string and loop operations )

- 반복문(loop)에서 반복 카운트

EDX ( I/O pointer )

- 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 ( int the SS segment) )

- 스택 프레임의 최상단 주소 ( 스택의 현 위치 )

 

————초급 리버싱에선 범용 레지스터가 중요하므로 다른 레지스터는 가볍게 보겠습니다.—————

 

 

2) Segment Registers

 

세그먼트 란 메모리를 조각내어 각각의 조각마다 시작 주소, 범위, 접근 권한 등을 부여하여 메모리를 보호하는 기법을 말합니다.

16비트(2바이트) 크기의 레지스터 6개로 구성되어 있습니다.

 

CS : Code Segment

SS : Stack Segment

DS : Data Segment

ES : Extra(Data) Segment

FS : Data Segment

GS : Data Segment

 

ES, FS, GS는 추가적인 데이터 세그먼트 입니다.

 

 

3) Program Status and Control Register 

 

EFLAGS - 플래그 레지스터… 32비트(4바이트) 크기

플래그 레지스터는 각각의 비트마다 의미를 가지고 있습니다. 1또는 0.. true or false 를 나타냅니다

조건 분기 명령어 에서 Flag의 값을 확인하고 동작 수행 여부를 결정하기 때문에 ZF, OF, CF는 알아둬야 합니다.

 

ZF ( Zero Flag ) -> 비트 6

- 연산 명령 후에 결과 값이 0이 되면 ZF가 1(true)로 세팅됨

OF ( Overflow Flag ) -> 비트 11

- 부호 있는 수의 오버플로시 OF를 1(true)로 세팅

- MSB( Most Significant Bit )가 변경되었을 때 1(true)로 세팅

 CF ( Carry Flag ) -> 비트 0

- 부호 없는 수의 오버플로시 CF를 1(true)로 세팅

 

 

4) Instruction Pointer

EIP ( Instruction Pointer )

EIP는 CPU가 처리할 명령어의 주소를 나타내는 레지스터이다. 32비트(4바이트)

다음에 실행해야할 명령어의 주소를 담고 있으며, 값을 직접 변경할 수 없고 간접적으로 변경해야함