본문 바로가기

공부/리버싱

리버싱 공부 04

<리버싱 핵심원리>로 공부하였다.

 

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 레지스터 등에 대해서 공부하면 좋다. 

관련 매뉴얼 : https://www.intel.co.kr/content/www/kr/ko/architecture-and-technology/64-ia-32-architectures-software-developer-vol-1-manual.html

 

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를 증가시킨다. 

직접 값을 변경할 수 없으며 다른 명령어로 간접적으로 변경해야한다(특정 명령어 이용, 인터럽트나 예외 발생시키기)

'공부 > 리버싱' 카테고리의 다른 글

리버싱 공부 06  (0) 2022.01.09
리버싱 공부 05  (0) 2022.01.09
리버싱 공부 03  (0) 2022.01.09
리버싱 공부 02  (0) 2022.01.09
리버싱 공부 01  (2) 2022.01.09