본문 바로가기
.study/pwnable

[포너블 기초] x86-32, x86-64 레지스터

by Carry_on 2023. 9. 12.

 

IA-32 (x86-32) 레지스터

1. 범용 레지스터: 주용도는 있으나, 그 외의 다양한 용도로 사용될 수 있는 레지스터

  • EAX (Extended Accumulator Register)
    • 곱셈, 나눗셈 명령에 사용한다.
    • 함수의 리턴값을 저장한다.
  • EBX (Extended Base Register)
    • ESI나 EDI와 결합하여 인덱싱에 사용된다.
  • ECX (Extended Counter Register)
    • 반복을 사용할 때 카운터로 사용된다.
  • EDX (Extended Data Register)
    • EAX와 같이 사용되고 부호 확장 명령 등에 사용된다.

ESI, EDI, EBP, ESP 레지스터 또한 범용 레지스터로 사용가능하다.

2. 인덱스 레지스터

  • ESI (Extended Source Index)
    • 데이터 복사/조작을 수행 할 시에 소스 주소를 저장한다.
    • ESI 레지스터가 가리키는 주소의 데이터를 EDI 레지스터가 가리키는 주소로 복사하는 용도로 많이 사용된다.
  • EDI (Extended Destination Index)
    • 데이터 복사/조작을 수행 할 시, 도착 주소를 저장한다. 주로 ESI가 가리키는 주소의 데이터가 복사된다.

3. 포인터 레지스터

  • EBP (Extended Base Pointer)
    • 스택 프레임의 시작주소가 저장된다.
  • ESP (Extended Stack Pointer)
    • 하나의 스택 프레임의 끝 지점(최신/현재) 주소가 저장된다. PUSH, POP 명령어에 따라서 ESP의 값이 4byte씩 변한다.
  • EIP (Extended Instruction Pointer)
    • 코드 세그먼트의 상대주소가 저장된다.
    • 다음 실행될 명령어를 가리킨다.
    • 자동적으로 업데이트된다.

 

4. 세그먼트 레지스터: 윈도우 OS는 프로세서가 메모리에 접근 할 때, 세그먼트 레지스터를 사용하여 가상 메모리를 물리 메모리로 변환한다.(세그먼트 레지스터의 크기는 16비트)

  • CS: 코드 세그먼트 레지스터
    • 프로그램 코드의 메모리 상의 주소를 가리킨다.
    • 명령어 Fetch를 위해 저장된 값을 활용
  • DS: 데이터 세그먼트 레지스터
    • 프로그램의 데이터 세그먼트 시작 주소를 가리킨다.
  • SS: 스택 세그먼트 레지스터
    • 스택 세그먼트의 시작 주소를 가리킨다.
  • ES/FS/GS: 추가 세그먼트 레지스터

 

5. 플래그 레지스터: 명령어의 실행 결과에 대한 정보를 저장한다.

 

상태 플래그

  • Sign flag: 이전 연산 결과가 음수일 때 1로 세팅된다.
  • Carry flag: MSB(Most Significant Bit)에서 Carry 혹은 Borrower 발생시 1로 세팅된다.
  • Overflow flag: 이전 산술 연산 결과가 데이터 범위를 초과할 시 1로 세팅된다.
  • Zero flag: 연산 결과가 0일 경우 1로 세팅된다.
  • Auxiliary carry flag: 3번째 비트에서 carry 또는 borrower 발생시 1로 세팅된다.
  • Parity flag: 이전 산술 연산 결과의 하위 1바이트 중 1비트가 짝수이면 1로 세팅된다.

 

컨트롤 플래그: CPU의 동작상태를 제어하는 플래그

  • Direction flag: 데이터를 다른 메모리에 복사할때 방향을 결정한다. 0으로 세팅되어있으면 데이터 주소를 가리키는 레지스터가 증가하고, 1로 세팅되어있으면 데이터 주소를 가리키는 레지스터가 감소한다.
  • Interrupt flag: 1로 세팅되면 외부 인터럽트 요구는 무시되고, 0으로 세팅되면 외부 인터럽트 요구를 받아들인다.
  • Trap flag: 디버깅 시에 single step mode 일 경우 1로 세팅된다.

연산에 따른 flag bit

출처: https://pwn3r.tistory.com/entry/Flag-Register-1

x86-64 레지스터

범용 레지스터:

RAX,RBX,RCX,RDX

포인터 레지스터:

RSP, RBP

플래그 레지스터:

CF,OF,SF,ZF,AF,PF,DF,IF,TF

  • x86-64 레지스터는 IA-32의 64비트 확장 레지스터이며, 호환이 가능하다.
  • R8~R16 8개의 범용 레지스터가 추가되어 레지스터 부족이 완화 되었다.
  • 하나의 레지스터는 아래 그림처럼 크기에 따라 쪼개어 사용할 수 있다.

출처: https://chaeing.tistory.com/20

'.study > pwnable' 카테고리의 다른 글

[포너블 기초] 함수 호출 규약  (0) 2023.09.14
[포너블 기초] Docker  (0) 2023.09.13
[포너블 기초] 스택 프레임  (0) 2023.09.12
[포너블 기초] 메모리 구조  (0) 2023.09.11
[포너블 기초] 컴퓨터 구조  (0) 2023.09.10