[Reversing] 리버싱 핵심원리 [3]. IA-32 레지스터 정리

2020. 2. 25. 00:15보안/리버싱

728x90

1. 도입

 

CPU 레지스터란

일반적으로 메모리라고 말하는 RAM은 CPU와 물리적인 거리로 인해 데이터 엑세스에 시간이 오래걸린다.

그러나 레지스터는 CPU에 있으므로 더욱 빠르게 데이터를 처리할 수 있다.

 

레지스터에 대해 알아야 하는 이유

어셈블리언어의 명령 대부부니 레지스터를 조작하므로, 레지스터를 이해하지 못하면 명령어 자체를 이해하기 어렵다.

 

2. IA-32의 레지스터

 

Register

      -- Basic program execution

            -- General Purpose Register[범용 레지스터] | 32bit 1개

            -- Segment Register | 16bit 6개

            -- Program Status and Control Register | 32bit 1개

            -- Instruction Pointer | 32 bit 1개

 

     

      -- Control Register

 

 

 

      -- Memory management

 

 

 

      -- Debug register

 

 

 

 

 

 

 

2-1. General Purpose Register - 범용 레지스터

 

IA-32 에서 각각의 범용 레지스터들의 크기는 32bit이다. 이름대로 범용적으로 사용되며, 상수 / 주소 저장할 때 주로 사용된다.

 

EAX -- 32bit

      AX -- EAX의 하위 16bit

              -- AH  (AX의 상위 8bit) | AL  (AX의 하위 8bit)

 

※ EBX, ECX, EDX 모두 동일한 하위 bit를 가지고 있음

 

 

EAX : 함수 리턴값에 사용 :: Accumulator for operands and results data

 

EBX : 상수 | 변수 값 저장용도 :: Pointer to data in the DS segment

 

ECX : 반복문 반복횟수 카운트 :: Counter for string and loop operations 

 

EDX : EBX와 동일, WinAPI에서 사용 :: I/O pointer

 

 

 

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

※EAX와 ECX는 특수한 용도로 사용됨

 

 

 

EBP : 메모리 주소 저장 | 함수 호출 순간의 ESP 저장하고 리턴 직전에 반환하여 스택을 유지하게 도움

 

ESI : 메모리 복사에 이용 | 메모리 주소 저장

 

EDI : 메모리 복사에 이용 | 메모리 주소 저장

 

ESP : 스택 메모리 주소 가르킴 | 프로그램 내에서 중요한 부분을 다루므로 함부로 조작하여 다른 용도로 사용하면 안됨.

 

 

 

 

 

 

 

3.Segment Register - 새그먼트 레지스터

새그먼트(segment)는 메모리 관리모델에서 나온 용어이다.

 

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

 

sagment register

      -- CS : Code Segment

 

      -- SS : Stack Segment

 

      -- DS : Data Segment

 

 

                              -- ES : Extra(Data) Segment

EXTRA DATA SEG      -- FS :Data Segment                                ※고급 디버깅 주제임..

                              -- GS : Data Segment

 

새그먼트 메모리 모델이 물리적 주소형태로 바뀌는 부분

 

 

 

 

 

 

 

 

 

4. 프로그램 상태와 컨트롤 레지스터

 

EFLAGS : Flag Register  -- 플래그 레지스터 (32bit / 4 byte 크기)

플래그 레지스터

-플래그 레지스터는 각각의 비트마다 의미를 갖고 있다.

 

-각 비트는 1 또는 0의 값을 갖는데 Bool과 비슷하다.

[True / False] 또는 [On / Off] 의 의미를 갖는다.

 

-일부 비트는 시스템에서 세팅하고, 일부 비트는 프로그램에서 사용된 명령의 수행 결과에 따라 세팅된다.

 

Zero Flag (ZF)

      -- 연산 명령 후에 결과 값이 0이 되면 ZF가 1로 세팅된다.

 

Overflow Flag (OF)

      -- signed Integer의 오버플로가 발생했을 때 또는 MSB(부호비트)가 변경되었을 때 1로 세팅된다.

 

Zero Flag (ZF)

      -- unsigned Integer의 오버플로가 발생했을때 1로 세팅된다

 

 

 

5. Instruction Pointer

 

EIP : Instruction Register -- (32bit / 4byte)

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

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

 

범용 레지스터와는 다르게 값을 직접 변경할 수 없어, 다른 명령어를 통해 간접적으로 변경해야 한다.

ex ) JMP, Jcc, CALL, RET 또는 interrupt, exception을 발생시킨다.

728x90