본문 바로가기
Reverse Engineering/리버싱 핵심 원리

1부 레지스터 (IA-3)

by Ken out of ken 2025. 1. 1.

Description

레지스터란?
메모리가 아닌 CPU 내부에 존재하는 저장 공간이다

디버깅툴에서 나오는 어셈블리어의 명령어 대부분이 레지스터를 조작하고 그 내용을 검사하기에 알아야 한다

 

레지스터들은 각자의 역할이 있으며 역할에 따라 이름이 있다

 



Types

레지스터들


Basic program execution registers

General purpose Registers (32bit)

범용 레지스터

범용 레지스터

이름처럼 범용적으로 사용되는 레지스터로 자주 사용된다

이들의 역할은 다음과 같다

Common jobs: Arithmetic operations (ADD, SUB, XOR, OR ...)

                        Register manipulation (MUL, DIV, LODS ...)

  • EAX: Accumulator for operands and results data
    • Loop Count
    • Function return (all Win32 API functions using EAX)
  • EBX: Pointer to data in the DS segment
  • ECX: Counter for string and loop operations
    • Loop Count
  • EDX: I/O pointer

 

Common jobs: Store memory address (pointer)

  • EBP: Pointer to data on the stack (in the SS segment)
    • 함수 호출시 함수 호출 시점의 ESP 값을 저장하여 들고 있는다 (스택 프레임의 기준점)
    • 함수 실행중에도 값이 고정되어 있다
  • ESI: source pointer for string operations
  • EDI: destination pointer for string operations
  • ESP: Stack pointer (in the SS segment)
    • 스택의 최상단(top)을 가리키는 레지스터
    • 함수 실행중 스택에 데이터를 push 하거나 pop 할 때마다 값이 동적으로 변경

 

특이하게도 각 레지스터들은 16비트 하위 호환을 위해 몇개의 구획으로 나뉜다

EAX레지스터로 예를 들어보자면 다음과 같다

  • EAX: 0 ~ 31 (32bit)
  • AX: 0 ~ 15 (EAX의 하위 16bit)
  • AH: 8 ~ 15 (AX의 상위 8bit)
  • AL: 0 ~ 7 (AX의 하위 8비트)

Segment Registers (16bit)

Segment 란?

메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법

또한 Paging 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용된다

일바적으로 Segment Descriptor Table (STD) 라고 하는 곳에 기술되어 있으며

세그먼트 레지스터는 이 STD의 index를 가지고 있다

 

segment registerE

 

 

  • CS: Code segment
  • SS: Stack segment
  • DS: Data segment
  • EX: Extra(Data) segment
  • FS: Data segment
    • SEH, TEB, PEB 등의 주소를 계산할 때 사용
  • GS: Data segment

 

Program Status and Control Register (32bit)

각각의 비트마다 의미를 가지고 flag의 역할을 하는 레지스터

flag regeister

 

  • EFLAGS: Flag register

32비트 전부 flag가 설정되어 있으며 굉장히 많아보이지만 3개만 기억하면 된다

 

  1. Zero flag (ZF)
    • 연산 명령 후에 결과 값이 0이 되면 True
  2. Overflow flag (OF)
    • Singed interger에서 오버플로우 발생하면 True
    • MSB(Most Significant Bit) 가 변경되었을 때 True
  3. Carry flag (CF)
    • Unsigned integer의 오버플로우 발생시 True

Instrution Pointer (32bit)

  • EIP: Instruction pointer 
    • CPU가 처리할 명령어의 주소를 나타내는 레지스터
    • 저장된 메모리 주소의 명령어를 처리하고 난 후 자동으로 그 명령어 길이만큼 EIP 증가
    • 직접 값을 변경시킬 수 없다 (JMP, Jcc, CALL, RET), Interrupt, Exception을 통해서만 가능