본문 바로가기

High Level Technique/Reversing

CPU 레지스터

CPU 레지스터에는 범용 레지스터, 명령 포인터, 세그먼트 레지스터, 플래그 레지스터, 부통소수점 데이터 레지스터 이렇게 총 5개가 있습니다.




※ CPU 레지스터를 외울려고 하지 말자. 그때 그때 확인하는 정도로도 충분하다고 생각된다.

   단순히 변수가 변경된다고 생각해도 충분하다고 생각된다.




- 범용 레지스터


EAX (Extended Accumulator Register)

더하기, 빼기, 곱셈과 나눗셈 명령에서 자동으로 사용되고 함수의 리턴값이 저장되는 용도.

가장 많이 쓰이는 변수라고 생각하면 된다. 사칙연산에 사용되고, return 100, return 0을 하면 반환하는 것처럼 EAX에 100, 0이 입력된다고 생각하면 된다.



EBX (Extended Base Register)

ESI나 EDI와 결합하여 인덱스에 사용.

EAX, ECX, EDX가 부족할 때 사용되기도 한다.



ECX (Extended Counter Register)

반복 명령어 사용시 반복 카운터로 사용된다. ECX 레지스터에 반복할 횟수를 지정해 놓고 반복 작업을 수행한다.

for문 while문등 loop문을 수행할 때 카운팅 하는 역할이라고 생각하면 된다.



EDX (Extended Data Register)

EAX와 같이 쓰이며 부호 확장 명령 등에 쓰임. 하지만, 함수의 리턴값이 저장되는 용도는 아니다. 

더하고 빼는 용도로 이용되며, 가끔 곱하기나 나누기등에서도 사용되기도 한다.



ESI (Extended Source Index)

데이터 복사, 조작시 Source Data의 주소가 저장된다. ESI 레지스터가 가리키는 주소의 데이터를 EDI 레지스터가 가리키는 주소로 복사하는 용도로 사용된다.

문자열이나 반복 데이터를 처리하거나 메모리를 옮기는데 사용된다.



EDI (Extended Destination Index)

복사 작업시 Destination의 주소가 저장된다. 주로 ESI 레지스터가 가리키는 주소의 데이터가 복사된다.


★ ESI와 EDI

memcpy(void *dest, void *src, size_t count)에서 첫번째 인자 값은 Destination(목적지)이고, 두번째 인자 값은 Source(시작지)이다.

따라서 ESI에는 시작지 주소값이 들어가고, EDI에는 목적지 주소가 들어간다.




ESP (Extended Stack Pointer)

하나의 스택 프레임의 끝 지점 주소가 거장된다. PUSH, POP 명령어에 따라서 ESP의 값이 4 Byte씩 변한다.




EBP (Extended Base Pointer)

하나의 스택 프레임의 시작 지점 주소가 저장된다. 현재 사용되는 스택 프레임이 소멸되지 않는 동안 EBP의 값은 변하지 않는다.

현재의 스택 프레임이 소멸되면 이전에 사용되던 스택 프레임을 가리키게 된다.







- 명령 포인터


EIP (Extended Instruction Pointer)

다음에 실행해야 할 명령어가 존재하는 메모리 주소가 저장된다. 현재 명령어를 실행 완료 한 후에 EIP 레지스터에 저장되어 있는 주소에 위치한 명령어를 실행하게 된다.

실행 전 EIP 레지스터에는 다음 실행해야 할 존재하는 주소의 값이 저장된다.







- 세그먼트 레지스터


CS (Code Segment)

실행 가능한 명령어가 존재하는 세그먼트의 오프셋이 저장된다.


DS (Data Segment)

프로그램에서 사용되는 데이터가 존재하는 세그먼트의 오프셋이 저장된다.


SS (Stack Segment)

스택이 존재하는 세그먼트의 오프셋이 저장된다.







- 플래그 레지스터


CF (Carry Flag)

부호 없는 연산 결과가 용량보다 클 때 세트(1) 된다.


ZF (Zero Flag)

연산 결과가 0일 때 세트(1) 된다. 연산 결과가 0이 아닐 때 해제(0)된다.


OF (Overflow Flag)

부호 있는 연산 결과가 용량보다 클 때 세트(1) 된다.


SF (Sign Flag)

연산 결과가 음수가 되었을 때 세트(1) 된다. 연산 결과가 양수가 되었을 때 해제(0) 된다.


DF (Direction Flag)

문자열 처리에서 연속되는 문자열의 처리 방향에 따라 세트된다.







- 부동 소수점 데이터 레지스터


ST(0), ST(1), ST(2), ST(3), ST(4), ST(5), ST(6), ST(7)



 32비트

16비트 

상위 8비트 

하위 8비트 

EAX

AX 

AH 

AL 

EBX 

BX 

BH 

BL 

ECX 

CX 

CH 

CL 

EDX 

DX 

DH 

DL 


★ EAX에서의 'Extended'의 의미

Extended의 의미는 '확장된' 이라는 의미를 가지고 있습니다.

기본의 16bit 레지스터인 AX, BX, CX, DX 등의 레지스터를 32bit 환경이 되면서 확장한 것으로 보면 됩니다.

예를들어, EAX는 32bit AX는 16bit, AH, AL은 8bit로 사용할 수 있습니다.

쉽게 말하자면 EAX가 12345678라고 하면 ax는 5678에 해당하고, 56는 ah, 78는 al에 해당한다.


32비트

16비트 

ESI

SI

EDI 

DI 

EBP 

BP 

ESP 

SP 



'High Level Technique > Reversing' 카테고리의 다른 글

Back To User Mode  (0) 2015.05.18
UPX Unpacking  (0) 2015.05.18
데이터 타입, 피연산자 타입, 어셈블리 언어  (0) 2015.05.15
OllyDBG 다운로드 및 설정방법  (0) 2015.05.13
VMWARE 및 Windows 설치하기  (0) 2015.05.12