[리버싱 핵심원리]1부 4장_IA-32 Register 기본 설명

2016. 10. 27. 05:102018년 이전글/역공학

OllyDbg를 이용해서나 다른 툴을 사용하여 디버깅을 하다보면 각각의 레지스터들의 용도에 관하여 알아야 할 경우가 있다. 자,그럼 이번엔 레지스터에 관하여 알아보도록하겠다.


CPU Register?                                                                                                         


!레지스터?

CPU내부에 존재하는 다목적 저장 공간이다.


IA-32의 레지스터

IA-32레지스터의 Basic program execution registers는 크게 또 4가지로 나뉜다.


1.General purpose Registers(32bit) --> 8개

2.Segment Registers(16bit) --> 6개

3.Program Status and Control Registers(32bit) --> 1개

4.Instruction Pointer(32bit) --> 1개


[그림 1]Basic program execution registers

General purpose Register

            • 범용적으로 사용되어지는 레지스터이다.

            • 각각의 크기는 32비트 즉 4바이트이다.

            • 보통 상수나 주소등을 저장할때 사용되어진다.

            • 특정 명령어에서는 특정 레지스터를 조작하거나 어떤 레지스터들은 특수한 용도로 사용되기도 한다.

주로 산술연산 명령어에서 상수/변수 값의 저장용도로 사용되는 레지스터


EAX -> Accumulator for operands ans results data

EBX -> Pointer to data in the DS segment

ECX -> Counter for string and loop operations

EDX -> I/O pointer


**어떤 특정 명령어들은 레지스터를 직접 조작하기도 한다.

**ECX와 EAX는 특수한 용도로 사용된다.

ECX -> 반복문에서 카운트

EAX -> 일반적으로 함수 리턴값에 사용


주로 메모리 주소를 저장하는 포인터로 사용

EBP -> Pointer to data on the stack (in the SS segment)::함수가 호출되었을 때 그 순간의 ESP를 저장하다가 리턴하기 직전에 다시 ESP에 돌려준다.=>스택이 깨지지 않도록: Stack Frame기법 

ESI ->  Source pointer for string operation::메모리복사에 사용됨

EDI -> Destination pointer for string operations::메모리 복사에 사용됨

ESP -> Stack pointer (in the SS segment)::스택메모리 주소를 가리킨다.


[그림 2]General Purpose Register

Segment Register

*Segment? IA-32의 메모리 관리 모덴에서 나오는 용어

                • IA-32보호 모드에서 세그먼트란 메모리를 조작내어 각 조각마다 시작주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법이다.

                • 페이징 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용

                • 세그먼트 메모리는 SDT에 기술되어 있는데 세그먼트레지스터는 SDT의 인덱스를 가지고 있다.

                • 각각의 크기는 16bit이다.

CS -> Code Segment

SS -> Stack Segment

DS -> Data Segment

ES -> Extra Segment

FS -> Data Segment::애플리케이션 디버깅에서 SEH, TEB,PEB등의 주소를 계산할 때사용된다.

GS -> Data Segment


[그림 3]Segment Memory Model

Program Status and Control Register


EFLAGS => Flag Register

                  • 32bit 이다.

                  • 각 bit는 1또는 0의 값을 가진다.

                  • 일부는 시스템에서 직접 세팅하고 일부는 프로그램에서 수행된 명령의 결과에 따라 세팅된다.

ZF -> zero flag::명령 후에 결과 값이 0이 되면 ZF가 1(True)로 세팅

OF ->overflow flag::부호 있는 수의 오버플로가 발생했을 때 1로 세팅 & MSB가 변경되었을 때 1로 세팅 


Instruction Pointer

EIP -> Instruction pointer


                • CPU가 처리할 명령어의 주소를 나타내는 레지스터이다.

                • 32bit의 크기를 가진다.

                • CPU는 EIP에 저장된 메모리 주소의 명령어를 하나 처리한 후 자동으로 그 명령어의 길이만큼 EIP를 증가시킨다.