Phantom

IA-32 Register 본문

Reverse Engineering

IA-32 Register

Ph4nt0m_ 2014. 2. 21. 14:21
반응형

매우 오랜만에 글을 쓰네요 요즘 최근에 리버스 엔지니어링이란것을 배우기 시작해서 리버싱에 대한 글을 쓰려합니다


저는 리버싱에 대해 공부할때 가장 힘든것이 레지스터였는데요 그것에 대해 글을 써보려 합니다


먼저 레지스터란 CPU내부에 존재하는 다목적 저장 공간으로써 RAM과는 조금 다른데요

물론 RAM의 속도도빠르지만 CPU가 RAM에있는 데이터를 접근하기 위해서는 물리적으로 멀리 가야하기 때문에 자주 사용하는 저용량의 데이터들을 CPU안의 레지스터에 저장합니다. 그렇기에 레지스터가 용량은 적지만 RAM보다 더 빠른 속도로 데이터를 처리할 수 있습니다.


이것은 컴퓨터 구조론의 계층적 데이터 접근?에 나와있는 얘기인데요 레지스터 RAM 보조 저장장치 로 봤을때 용량이 적을수록 처리속도가 빨라집니다 계층적으로보자면


↑        레지스터            ↓

속도↑        RAM               ↓ 용량

↑        보조 저장장치     

이 됩니다.

리버싱에서 레지스터를 알아야 하는 이유는 디버깅을 하려면 디버거가 해석해주는 어셈블리 명령어를 알아야 하기 때문인데요 어셈블리 명령어의 대부분은 레지스터를 조작하고 그 내용을 검사하는 것들인데, 레지스터를 모르면 명령어 자체를 이해하기 힘들기 때문이지요

IA-32는 레지스터의 수가 아주 많습니다

Basic program execution registers

x87 FPU register

MMX register

XMM register

Control register

        ...


 여기서는 IA032레지스터의 종류 중 가장 기본이 되는 Basic program execution registers에 대해 설명하려 합니다

먼저 Basic program execution registers는 다시 4개의 그룹으로 나뉘게 되는데

General Purpose Registers (32bit - 8개)

Segment Registers             (16bit - 6개)

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

Instruction Pointer               (32bit - 1개)


General Purpose Registers

31                                                                   0

EAX

EBX

ECX 

EDX

ESI 

EDI 

EBP 

ESP 


범용 레지스터(General Purpose Registers)는 이름처럼 범용적으로 사용되는 레지스터들입니다. 보통 상수/주소 등을 저장할때 사용되며 특정 어셈블리 명령어에서는 레지스터를 조작하기도 합니다 다음 그림에 범용 레지스터 들이 표시되어 있습니다.

31                                             1615                          87                            0     16bit                 32bit

 

AH 

AL 

AX 

EAX 

 

BH

BL 

BX

EBX 

 

CH 

CL 

CX 

ECX 

 

DH 

DL 

DX

EDX 

 

 BP

EBP 

 

SI 

ESI 

 

DI 

EDI 

 

SP 

ESP 


각 레지스터들은 16비트 하위 호환을 위하여 몇 개의 구획으로 나뉘어 집니다. EAX기준으로 설명하겠습니다.

EAX : (0~31) 32비트

AX :(0~15) EAX의 하위 16비트

AH : AX의 상위 8비트

AL : AX의 하위 8비트

즉, 4바이트를 다 사용해야 하는 경우는 EAX를 사용하고 2바이트만 사용할때는 AX를사용하며, AX는 상위 하위 AH AL로 나뉘어 사용합니다.


각 레지스터의 설명은 다음과 같습니다

EAX는 누산기,  대부분의 입출력과 산술 논리연산을 수행합니다.


EBX는 DS세그먼트(아래 참조)에 대한 포인터를 주로 저장하며 ESI나 EDI와 결합하여 인덱스에 사용됩니다. 그리고 EBX는 메모리의 주소 지정을 확장 하기 위해 인덱스로 사용할 수 있는 유일한 범용 레지스터 입니다.

ECX는 루프가 반복되는 횟수는 제어하는값을 저장하며 왼쪽이나 오른쪽으로 쉬프트되는 비트 수 등을 저장합니다.


EDX는 입출력 연산에 사용하며 곱셈, 나눗셈에서 EAX와 합께 사용됩니다.

위 4개의 레지스터들은 주로 산술연산 명령어에서 상수/변수 값의 저장 용도로 많이 사용됩니다.


나머지 4개도 마저 보겠습니다.

EBP는 스택의 시작주소가 저장됩니다. 스택이 사라지지 않는 이상 EBP값은 변하지 않습니다.

EBP는 함수가 호출되었을 때 그 순간의 ESP를 저장하고 있다가 함수가 리턴하기 직전에 ESP에 값을 되돌려줘서 스택이 깨지지 않도록 합니다.


ESP는 스택의 끝주소가 들어갑니다. PUSH와 POP에 따라 4바이트씩 변합니다.

ESP는 어떤 명령어들(PUSH, POP, CALL, RET)은 ESP를 직접 조작하기도 합니다.


ESI는 데이터를 조작하거나 복사시에 소스데이터의 주소가 저장됩니다.


EDI는 데이터 조작하거나 복사시에 소스데이터의 목적지가 저장됩니다.


Segment Registers  

세그먼트의 길이는 16bit 이며 세그먼트 영역의 메모리에 주소를 지정합니다.

16bit 세그먼트 시스템에서는 좌측으로 4bit시프트하고 오프셋 레지스터를 시프트한 세그먼트레지스터와 합하여 위치를 정합니다.

15                                                                   0

 CS:Code Segment

 DS:Data Segment

 SS:Stack Segment

 ES:Extra(data) Segment

 FS:Extra(data) Segment

 GSExtra(data) Segment

CS : 함수나 제어문같은 명령어들이 저장되는곳입니다.

DS : 주로 전역, 정적변수데이터가 들어있는 데이터 세그먼트의 데이터 위치를 가리킵니다.

SS : 주소와 데이터를 일시적으로 저장할 수 있는 스택의 주소를 지정하는데 쓰입니다.

ES,FS,GS는 추가적인 데이터 세그먼트입니다.


Program Status and Control Register

EFLAGS는 32비트크기인데 16비트의 확장 형태입니다.

31                                                                  0

EFLAGS


저는 아직 뉴비라 완전히 알지는 못하구요 아는것중에

Zero Flag(ZF) - 연산 명령 후에 결과가 0이면 ZF비트가 1로 켜집니다.

Overflow Flag(OF) - signed형태의 수가 오버플로우가 발생했을때1로켜지거나, MSB가 변경되었을 때 1로 켜집니다.

Carry Flag(CF) - unsigned 형태의 수가 오버플로우했을때, 1로 켜집니다.    


Instruction Pointer   

31                                                                   0

 EIP

EIP는 다음에 실행할 명령어들이 있는 메모리의 번지를 가리킵니다. CS세그먼트와 한쌍이 되어 실행번지를 참조하구요 CPU는 EIP의 주소를 보고 다음에 처리할 명령을 파악합니다. 이 레지스터는 직접적으로 사용자가 조작할 수 없습니다. 값을 바꾸고 싶을 때는 JMP, Jcc, CALL, RET등을 사용하여 인터럽트나 예외를 발생시켜야 합니다.


글을 써보니 무지 길어졌네요. 저도 리버싱을 한지 몇일이 안되 공부하는셈 치면서 글을 적었는데 상당히 긴 글이됬어요 



내용에 대한 출처는 리버싱 핵심원리 라는 책에 있습니다. 대다수의 사람들이 이  나뭇잎(?)책이 그렇게 쉽다고 하더라구요 저는 왜이리 어려운지 모르겠어요 ㅠㅠ...


반응형

'Reverse Engineering' 카테고리의 다른 글

간단한 C언어 패턴 분석  (0) 2018.01.17
Standard I/O Redirection  (0) 2014.02.25
함수 호출 규약  (0) 2014.02.25
Comments