Hacking/Reversing / / 2016. 4. 28. 21:12

[리버싱] IA-32 레지스터의 종류 (기초)

IA-32 레지스터는


Basic program execution registers // 오늘 배울 레지스터

x87 FPU registers

MMX registers

XMM registers

Control registers

Memory type range registers

Machine specific registers

Machine check registers

...


등등 많은 레지스터들이 존재하며 오늘은 Basic program execution registers을 알아보겠다.


Basic program execution registers 


Basic program execution registers 안에서도 사용용도에 따라 레지스터가 나뉘게 된다.


1. General Purpose Registers (32bit - 8개)


2. Segment Registers (16bit - 6개)


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


4. Instruction Pointer (32bit - 1개)


A. General Purpose Registers

 General Purpose Registers는 범용레지스터라고 불리며 자주쓰이고 많이쓰이는 레지스터들이다.

IA-32에서 각각의 범용 레지스터들의 크기는 32비트(4비트)이고 보통은 상수/주소를 저장할때 자주 쓰인다. 

(범용 레지스터에서 앞에 E가 붙은것은 옛날 IA-16(16비트)에서 E를붙여 32비트까지 계승한 것임) 


각 레지스터들을 나열하며 설명을 붙이겠다. 네이버 블로그에서도 한번 정리한 내용임.(http://blog.naver.com/artists2/220352076887)


*레지스터의 구성


상황에따라 16비트 레지스터로 al,ah같은 레지스터도 보이게되는데. 32비트 레지스터인 EAX같은 레지스터의 반절이라고 생각하면 쉽다. EAX가 32비트 레지스터 즉 4바이트라면 AX는 16비트 레지스터 2바이트가 되는것이다.


EAX레지스터의 예를 들 경우 


 <----------EAX(32bit)------------>

ㅣ          ㅣ          ㅣ ah(8bit)ㅣal(8bit)ㅣ 

                           <----AX(16bit)---->

이런 레지스터의 구성을 이용해 효율적인 공간 eax, ax, ah, al을 이용해 사용하고싶은 만큼 알뜰하게 사용할 수 있다.



ㅡㅡㅡㅡㅡ 변수,상수,카운터 등 저장에 사용하는 레지스터들 ㅡㅡㅡㅡㅡㅡㅡ


1. EAX

산술연산, 변수상수 저장에 주로 사용됨, 함수 리턴값에 사용됨

2. EBX

아무거나 쓰임

3. ECX

Loop 반복 카운터로 자주 사용됨

4. EDX

EBX랑 마찬가지로 암대나 쓰임


ㅡㅡㅡㅡㅡㅡ메모리 주소를 저장하는 레지스터들 ㅡㅡㅡㅡㅡㅡㅡㅡ


5. EBP

함수가 호출되었을시, 그 순간의 ESP를 저장하고 있다가 함수가 리턴되기전에 다시 ESP에 값을 되돌려 스택이 깨지지 않도록 보정한다. 이것을 Stack Frame기법이라고 한다.

6. ESP

ESP는 스택메모리 주소를 가르키는 매우 중요한 레지스터이다. (push, pop, call, ret)등 명령어로 esp를 조작할 수 있다. 어셈블리 프로그래밍에서 절대 다른용도로 사용하지 말아야 한다.

7. EDI

(LODS, STOS, REP MOVS 등)과 함께 메모리 복사에 사용됨

8. ESI

(LODS, STOS, REP MOVS 등)과 함께 메모리 복사에 사용됨


B. Segument Registers


세그먼트란? 메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법을 말한다. 또한 세그먼트는 페이징 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용된다. 세그먼트 메모리는 SDT(Segment Descriptor Table)에 기술되어 있고 이 세그먼트 레지스터는  SDT의 index를 가지고 있다. 


일단은 이렇게만 알아두고 무슨 레지스터들이 있는지 알아 두도록하자


CS 

Code Segment

SS

Stack Segment

DS

Data Segment

ES                                                                                            -----

Extra(Data) Segment                                                               :

FS                                                                                                    :

Data Segment이고 SEH, TEB, PEB주소를 계산할때 사용된다     : ES ~ GS는 추가적인 데이터 세그먼트를 나타내는 레지스터이다.

GS                                                                                                   :

Data Segment                                                                  ---- :


C. Program Status and Control Register


플래그 레지스터의 크기는 32bit이며 1/0, on/off, ture/false의 값을 가진다. 일부 bit는 시스템에서 직접 세팅하고 일부 bit는 프로그램에서 사용된 명령의 수행 결과에 따라 세팅된다.


플래그 레지스터의 개수는 32개나 있지만 초급 리버싱단계에서는 ZF,OF,CF만 알아 둘 필요가 있다.


Zero Flag (ZF)

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

Overflow Flag(OF)

부호 있는 수의 오버플로우가 발생 했을때 1로 세팅된다. 그리고 MSB가 변경되었을 때 1로 세팅된다.

Carry Flag(CF)

부호 없는 수 의 오버플로우가 발생 했을때 1로 세팅된다.


D. Instruction Pointer 


EIP : Instruction pointer


EIP는 CPU가 처리할 명령어의 주소를 나타내는 레지스터이며 크기는 역시 32bit입니다. EIP는 직접 값을 변경시킬 수 없으며 명령어(Jmp, jcc, call, ret)를 이용하여 간접적으로 값을 변경 시켜야 한다. 인터럽트, 예외를 발생시켜도 된다.


  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유