레지스터란?
- CPU의 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 기억장치이고 처리 결과 역시 이 곳에 저장된다.
- 공간은 작지만 CPU와 직접 연결되어 있어 연산 속도가 메모리보다 훨씬 빠르다.
- 종류
> 범용 레지스터
> 인덱스 레지스터
> 포인터 레지스터
> 세그먼트 레지스터
> 플래그 레지스터
1) 범용 레지스터
- 범용적으로 막 쓰는 레지스터로 어셈블리 명령어에서 특정 레지스터를 조작하는데 사용하기도 한다.
- 32bit 크기의 레지스터 8개로 구성되어 상수/주소를 저장할 때 쓰인다.
- 인덱스 레지스터와 포인터 레지스터는 범용 레지스터에 포함된다.
(1) EAX 레지스터 (Extended Accumulator Register)
- 누산기라고 불리며 데이터 전송(입출력) 및 연산 후의 결과 값을 잠시 저장하는데 사용된다.
- 산술(덧셈, 곱셈, 나눗셈 등), 논리 연산을 수행할 때 사용해 반환 값을 저장한다.
- AX를 반으로 나눠 AH와 AL이 8bit씩 갖는다.
(2) EBX (Extended Base Register)
- 메모리 주소를 저장하기 위한 용도로 사용된다.
- 특정 주소 지정을 위한 BX로 DI나 SI와 결합해 사용할 수 있다.
- 산술이나 변수 저장에 사용되기도 한다.
- BX를 반으로 나눠 BH와 BL이 8bit씩 갖는다.
(3) ECX (Extended Count Register)
- 어떤 명령을 반복적으로 수행할 때 횟수를 저장하는데 사용한다.
- 반복문이나 shift 등에서 횟수를 셀 때 주로 사용된다.
- CX를 반으로 나눠 CH와 CL이 8bit씩 갖는다.
(4) EDX (Extended Data Register)
- EAX의 확장 개념으로 함께 곱셈이나 나눗셈 등의 일부 명령에서 필수적으로 사용된다.
- 곱하기나 나누기 같은 복잡한 연산에서 추가적으로 데이터를 저장해야 할 때 사용한다.
- 범용 목적의 저장소로 사용하기도 한다.
- DX를 반으로 나눠 DH와 DL이 8bit씩 갖는다.
1 – 2) 인덱스 레지스터
- 인덱스 주소 지정과 덧셈, 뺄셈에서 사용한다.
(1) ESI (Extended Source Index)
- 데이터를 조작하거나 복사할 때 데이터의 주소가 저장된다.
- 문자열 명령어 조작을 위한 소스 인덱스를 나타내기 위해 사용한다.
- 문자열 전송이나 비교에서 사용해 소스 문자열의 주소를 저장한다.
- 일반적인 전송이나 연산에도 이용된다.
- ESI의 오른쪽 16비트가 SI이다.
(2) EDI (Extended Destination Index)
- 복사할 데이터의 목적지 주소가 저장된다. (주로 ESI 레지스터가 가리키는 주소의 데이터)
- 목적지 인덱스를 나타내거나 연산의 결과가 저장되는 위치를 나타내는 데 사용한다.
- 문자열 전송이나 비교에서 사용해 목적지 주소를 저장한다.
- EDI의 오른쪽 16비트가 DI이다.
1 – 3) 포인터 레지스터
(1) ESP (Extended Stack Pointer)
- Stack의 끝 지점 주소가 저장된다.
- 스택 최상부 위치의 오프셋 주소를 갖는다. (함수를 호출할 때 돌아갈 주소 저장)
- PUSH, POP 명령어에 따라 4byte씩 변한다.
(2) EBP (Extended Base Pointer)
- Stack의 첫 시작 주소가 저장된다.
- 스택의 데이터에 접근할 때 사용한다.
(3) EIP (Extended Instruction Pointer)
- 다음에 실행해야 할 명령어의 주소를 저장한다.
- 값을 직접 변경하지 않고 간접적으로 변경할 때 사용한다.
- 명령어를 실행할 때마다 EIP 값을 현재 수행하는 명령어 길이만큼 자동적으로 증가해 다음 실행할 명령어 주소를 갖는다.
2) 세그먼트 레지스터
- 프로세스의 특정 세그먼트를 가리키는 포인터의 역할을 하여 세그먼트 안의 특정 데이터와 명령들을 정확하게 가져온다.
- 16bit 크기의 레지스터 6개로 구성되어 있다.
* 세그먼트 : 메모리를 조각내 각각의 조각마다 시작 주소, 범위, 접근 권한 등을 부여해 메모리를 보호하는 기법
(1) CS (Code Segment)
- 함수나 제어문 같은 기계 명령을 포함한 코드 세그먼트의 시작 주소를 가리킨다.
- 함수나 제어문 같은 명령어들이 저장된다.
- 레지스터의 오프셋 값을 더하면 실행하기 위해 메모리로부터 가져와야 할 명령어 주소가 된다.
(2) DS (Data Segment)
- 프로그램에 정의된 데이터 세그먼트의 시작 주소를 가리킨다.
- 전역, 정적 변수 데이터가 저장된다.
- 지정된 주소 값에 데이터의 오프셋을 더해 데이터 세그먼트 내에 위치해 있는 데이터 주소를 참조한다.
(3) SS (Stack Segment)
- 실행 과정에서 필요한 데이터, 연산 결과를 임시로 저장하거나 삭제할 때 사용하는 스택 세그먼트의 시작 주소를 가리킨다.
- 주소와 데이터를 일시적으로 저장할 목적으로 사용된다.
(4) ES (Extra(Data) Segment)
- 메모리 주소 지정을 다루는 문제 데이터 연산에 사용된다.
- 추가로 사용된 데이터 세그먼트의 주소를 가리킨다.
(5) FS, GS (Data Segment)
- 여분의 레지스터이다.
3) EFLAGS 레지스터 (Extended Flags Register)
- 여러 산술 연산 결과의 상태를 저장하는 레지스터이다.
- 비트가 각각 서로 다른 의미를 갖고 있어 독립적으로 사용된다.
- 플래그를 1로 설정하는 것을 set, 0으로 설정하는 것을 clear 혹은 reset이라고 한다.
3 - 1) 상태 플래그
(1) CF (Carry Flag)
- 덧셈의 결과가 높은 자리로 자리 올림수가 발생하거나 뺄셈 후 빌림 수가 발생하면 1(set)로, 아니면 0(clear)이 된다.
- 부호가 없는 정수 연산에서 오버플로 상태를 나타낸다.
(2) PF (Parity Flag)
- 연산 결과에서 1인 비트의 개수가 짝수이면 1(set)로, 홀수이면 0으로 0(clear)이 된다.
(3) AF (Auxiliary Flag)
- 산술 연산에서 3번 비트에 올림 수 혹은 빌림 수가 발생하면 1(set)로, 발생하지 않으면 0(clear)이 된다.
(4) ZF (Zero Flag)
- 연산의 결과 값이 0이면 1(set)로, 아니면 0(clear)이 된다.
(5) SF (Sign Flag)
- 부호가 있는 정수의 부호 비트를 나타낸다.
- 양수라면 0(clear)으로, 음수라면 1(set)가 된다.
(6) OF (Overflow Flag)
- 오버플로 혹은 언더플로가 발생하면 1(set)로, 아니라면 0(clear)이 된다.
3 – 2) 컨트롤 플래그
(1) DF (Direction Flag)
- 문자열 처리 방향을 정한다.
- 1(set)이라면 문자열은 주소 값이 감소하면서(정방향) 처리되고, 0(clear)이라면 증가하면서(역방향) 처리된다.
3 – 3) 시스템 플래그
(1) TF (Trap enable Flag)
- 1(set)라면 프로세스는 하나의 명령어가 끝날 때마다 자동적으로 내부 인터럽트를 발생한다.
(2) IF (Interrupt enable Flag)
- 외부 인터럽트 발생 허용을 제어하는 플래그다.
- 1(set)라면 외부 인터럽트를 허용하고, 0(clear)이라면 금지한다.
- 내부 인터럽트와는 관련이 없다.
* 이 외에도 IOPL, NT, RF, VM, AC, VIF, ID가 있다.
< 이미지 출처 >
https://spark.kro.kr/43
'Study > Reversing' 카테고리의 다른 글
[Reversing] PE Header 개념 정리 & wow64 fs redirection (0) | 2020.09.21 |
---|---|
[Reversing] 어셈블리어 C언어로 변환하기 #1 (0) | 2020.09.14 |
[Reversing] abex' Crackme #1 (0) | 2020.09.14 |
[Reversing] x86(32 bit) / x64(64 bit) 호출규약 (0) | 2020.09.14 |
[Reversing] Stack 구조와 Stack Frame (0) | 2020.09.08 |
댓글