본문 바로가기

Security/Reverse Engineering

[Reversing] Basic Knowlodge about IA-32 Registry

이번 강의는 리버싱을 배우기전 필수로 외우고 있어야 하는 레지스터에 대해

 

알아보겠습니다.

 

 

1. CPU Register ( CPU 레지스터 )

  

먼저 레지스터란 : CPU 내부에 존재하는 다목적 저장 공간입니다. 

 

몇몇분들이 가끔 우리가 흔히 메모리라 말하는 RAM ( Random Acess Memory )과 헷갈리시는 분이 계시는데  (없으면 말고요) 

 

속도면에서 보면 CPU 는 RAM에 있는 데이터를 사용하기 위해서는 물리적으로 먼 거릴 돌아 가야되기 때문에 시간이 오래 걸립니다. 

 

하지만 레지스터는 CPU와 한 몸이기 때문에 고속으로 테이터 처리가 가능하죠 

 

2. Register 는 필수?   

 

위에 언급했듯이 리버싱을 배우기 전 필수로 외우고 있어야 하는 것 중 하나가 Register 입니다. 

 

이유는 일단 우리가 하려는게 어플리케이션(프로그램) 리버싱이죠, 리버싱을 잘 하려면, 

 

디버거가 디스어셈( asm 으로 해석 )해주는 어셈블리 명령어를 알아야죠. 

 

그런데 프로그램을 직접 디버깅 해보면 그 많은 어셈 명령어들이 레지스터를 조작하고 관리하는 것 뿐 입니다. 

 

즉 레지스턴 필수라는거죠  

 

3. IA-32의 레지스터  

 

IA-32 레지스터 에서 지원하는 레지스터의 수가 엄청나게 많습니다. 

 

예를 들면 

 

Basic Program execution registers ( 기본적으로 우리가 알아야 할 것 )

MMX registers 

XMM registers ( 병렬 프로그래밍 해보신 분들을 알 겝니다 , 미치죠 완전 ㅋㅋ )

Debug registers

Memory management registers

....

등이 많습니다.

 

이 중 맨 위에 있는게 제일 많이 사용되는거고 필숩니다.

 

그럼 이제 Basic Program execution registers 에 대해 공부해 보겠습니다.

 

4. Basic Program execution registers 

 

이 레지스터에서도 크게 4부분으로 나눠지는데

 

범용 레지스터 - General Purpose Registry ( 크기 : 32비트 , 갯수 : 8개 )

: 산술/논리 연산, 피연산자(오퍼랜드) 를 저장하거나 포인터의 역할로 사용함

 

세그먼트 레지스터 - Segment Registers ( 크기 : 16비트 , 갯수 :6개 )

: 윈도우 운영체제에서는 프로세서가 메모리에 접근할 때 이 레지스터와 조합해서 사용합니다.

 

 

 

EFLAGS 레지스터 - Program status and Control Register ( 크기 : 32비트 , 갯수 : 1개 )

: 프로그램이 실행되고 있는 상황의 연산 결과를 저장하거나 , 시스템 상태의 결과를 저장.

 

EIP 레지스터 - Instruction Pointer ( 크기 : 32비트 , 갯수 : 1개 )

: 다음에 실행 할 명령어의 주소를 저장합니다.

 

가 있습니다.

 

세부적으로 다시 나열하면

 

EAX (AX, AH, AL) - 누적연산기, 곱셈과 나눗셈 연산에서 자동으로 사용  


EBX (BX, BH, BL) - 베이스 레지스터, 특정 주소를 지정
ECX (CX, CH, CL) - 수를 세아림, 자동으로 루프 카운터됨(반복적인 명령을 수행시)
EDX (DX, DHT, DL) - 데이터 레지스터, 입출력 연산에서 반드시 간접 주소 지정에 사용 

 


EBP (BP) - 베이스 포인터, 스택의 데이터에 접근하기 위해 사용
ESP (SP) - 스택 포인터, 현재까지 사용된 스택의 위치를 저장, 스택 최상부의 오프셋을 가리킴
EDI (DI) - 쓰기 인덱스 

ESI (SI) - 읽기 인덱스, 문자열 전송이나 비교에서 사용되는데 주로 소스 문자열의 오프셋을 가리킴 

 


EIP - 명령어 포인터 레지스터, 실행할 다음 명령어의 주소를 포함
EFLAGS - CPU의 동작을 제어하거나 CPU 연산의 결과를 반영 

 

 

 

그다음으로 세그먼트 레지스터들로는

 

CS : Code Segment ( 코드 세그먼트 )

SS : Stack Segment ( 스택 세그먼트 )

DS : Data Segment ( 데이터 세그먼트 )

ES : Extra(Data) Segment ( 추가 데이터 세그먼트 )

FS : Data Segment ( 추가 데이터 세그먼트 )

GS : Data Segment ( 추가 데이터 세그먼트 )

 

이정도만 숙지 해 두시고

 

EFLAGS : Flag Register ( EFLAGS (32비트) 레지스터는 FLAGS (16비트) 의 확장형태 입니다 )

 

EFLAGS 의 값은 0 또는 1 인데요, 이 값들로 Enable , Disable 즉 On/Off 상태를 저장하는 겁니다

 

다른말로는 각 비트 , 32개의 비트가 각각 다른 의미와 기능을 가지고 있단 뜻이죠

 

그 구조는 복잡하고 아직 외우기엔 쓰잘때기(?) 없는 짓이므로 패스하도록 하겠습니다.

 

 

 

이번 강의는 여기서 마치겠습니다. 

 

 

 

 사진 및 일부 내용 출처 : http://hannamlog.tistory.com/entry/Assembly-레지스터의-종류와-특징