1. 레지스터의 이해
1) 레지스터
- CPU가 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 기억장치
- 명령을 처리하기 위한 주소와 명령의 종류를 저장할 수 있는 기억 공간
- RAM 보다 빨라야 해서 CPU와 직접 연결되어 있으며 연산 속도가 매우 빠름 (수십~ 수백 배)
- 특정 주소를 가리키거나 값을 읽어올 수 있어야 함
2) 데이터의 단위
- 각 레지스터 공간을 파악하고 분석하기 위해 데이터를 해석해야함
- 레지스터 뿐만아니라 어셈블리어로 시스템 내부적 구성을 확인할 때에도 필요
(1) 비트
- 컴퓨터 시스템이 데이터를 연산하거나 표현할 수 있는 제일 작은 기본 단위
- 0과 1 두 가지로 표현 ( 2진수 )
(2) 바이트
- 8개의 비트를 모아 하나의 바이트 (10진수로는 0~255 / 16진수로는 0~0xFF까지)
- 레지스터에서 8비트에 대응되는 레지스터는 AH, AL, BH, BL, CH, CL, DH, DL이 있음
(3) 워드(WORD)
- 2개의 바이트를 하나로 표현, 총 16비트
- 10진수(0~65535), 16진수(0~0xFFFF)
- 16비트 레지스터로는 AX, BX, CX, DX, SI, DI, BP, SP, IP
- 하나의 작업 단위라는 뜻으로 사용 현재는 워드 단위 자체로 사용되는 비중 감소 (32bit/64bit 사용)
(4) 더블워드(DWORD)
- 2개의 워드를 하나로 표현, 32비트
- 10진수(0~4294967295), 16진수(0~0xFFFFFFFF)
- 32비트 레지스터 EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP
- 32비트 이후 시스템서 주소표현, 기본 정수 단위로 가장 많이 사용
(5) QWORD
- 2개의 더블워드를 하나로 표현, 64비트
- 64비트 레지스터 RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP 등 사용
2. 레지스터의 종류
1) 범용 레지스터
- RAX (Accumulator) : 더하기, 빼기 등 산술/논리 연산을 수행하며 함수의 return 값 저장
- 시스템콜 함수를 사용하려면 RAX에 함수의 syscall번호를 넣어줌
- RBX (Base) : 메모리 주소를 저장하기 위한 용도로 사용
- RCX (Count) : 반복문에서 카운터로 사용된느 레지스터
- syscall을 호출했던 사용자 프로그램의 return 주소를 가짐
- RDX (Data) : 다른 레지스터를 서포트하는 여분의 레지스터, 큰 수의 곱셈이나 나눗셈 연산에서 EAX와 함께 사용
2) 인덱스 레지스터
- RSI (Source Index) : 데이터를 복사할 때 소스데이터, 복사할 데이터의 주소가 저장
- RDI (Destination Index) : 데이터를 복사할 때 복사된 도착지 데이터의 주소 저장
3) 포인터 레지스터
- RSP (Stack Point) : 스택 프레임에서 스택의 끝 지점 주소 (현재 스택주소) 가 저장
- 데이터가 쌓일 경우 스택의 가장 높은 곳
- push, pop 명령을 통해 RSP 값이 위아래로 8바이트씩 이동
- RBP (Base Point) : 함수 호출되면 스택프레임이 형성되는데 이 스택 프레임의 시작 지점 주소 (스택 복귀 주소)
4) 플래그 레지스터
- RFLAGS register : 시스템 제어 용도 혹은 어셈블리에서는 비교/조건문 처리 용도로 사용되는 상태 레지스터
- 연산 결과에 따라 64비트 레지스터의 각 비트에 0(clear, reset) 혹은 1(set)로 표시해 처리 결과를 저장한다.
플래그 용도
CF (Carry Flag) | 부호 없는 수끼리 연산 후 연산 결과가 길면 1 |
OF (Overflow Flag) | 부호 있는 수끼리 연산 후 연산 결과과 길면 1 |
SF (Sign Flag) | 연산 결과가 음수면 1 |
ZF (Zero Flag) | 연산 결과가 0이면 1 |
AF (Auximiliary carry Flag) | 10진수 연산 시 보정이 필요하면 1 |
PF (Parity Flag) | 연산 결과에서 1이 짝수 개이면 1 |
DF (Direction Flag) | 문자열 처리할 때 사용하는 데 0이면 전진하면서 처리, 1이면 후진하면서 처리 |
IF (Interrupt Flag) | 인터럽트 처리 시 0이면 외부에서 들어오는 인터럽트 무시, |
1이면 허용 | |
TF (Trap Flag) | 프로세서 처리 시 0이면 디폴트, 1이면 명령 실행 후 특정 프로시저 호출 |
💡 64비트에서는 R8 ~ R15까지 8개의 레지스터가 추가로 사용
'Security > Reversing' 카테고리의 다른 글
PE File Format Advance (1) | 2023.07.08 |
---|---|
Calling Convention (함수 호출 규약) (0) | 2023.07.06 |
스택프레임 (0) | 2023.07.05 |
PE파일 (1) | 2023.07.03 |
어셈블리어 (0) | 2023.07.02 |