CPU 레지스터

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