상세 컨텐츠

본문 제목

Reverse Core 4장

Computer Science/Reverse Core

by RACC8N 2020. 1. 14. 16:28

본문

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)를 발생 시켜야 함.

 

'Computer Science > Reverse Core' 카테고리의 다른 글

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

관련글 더보기

댓글 영역