[4장] IA-32 Register 기본 설명

beanii·2023년 10월 23일
0

Reversing Study

목록 보기
4/4
post-thumbnail

4.1. CPU 레지스터란?


  • 레지스터(Register)란 CPU 내부에 존재하는 다목적 저장 공간
  • RAM과 다르게 레지스터는 CPU와 한 몸이기 때문에 고속으로 데이터 처리 가능

4.1.1. 레지스터에 대해서 알아야 하는 이유

  • 어셈블리 명령어의 대부분은 레지스터를 조작하고 해당 내용 검사하는 일

4.2. IA-32의 레지스터


  • IA-32(Intel Architecture 32비트)에 존재하는 수많은 레지스터 종류 중 Basic program execution register가 가장 중요
  • 중/고급 단계로 올라가면 Control registers, Memory management registers, Debug registers 등에 대해 추가 공부 필요

4.2.1. Basic program execution registers

  • Basic program execution registers는 다시 4개의 그룹으로 나뉨
    • General Purpose Registers(32비트 - 8개)
    • Segment Registers(16비트 - 6개)
    • Program Status and Control Register(32비트 - 1개)
    • Instruction Pointer(32비트 - 1개)

1) 범용 레지스터

  • 범용적으로 사용되는 레지스터들
  • 각각의 범용 레지스터들의 크기: 32비트(4바이트)
  • 주로 상수/주소 등을 저장할 때 사용

💬 참고

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

  • 각 레지스터의 이름1 (상수/변수 값 저장 용도)

    • EAX: Accumulation for operands and results data (함수 리턴 값 저장)
    • EBX: Pointer to data in the DS segment
    • ECX: Counter for string and loop operations (루프 돌 때마다 1씩 감소)
    • EDX: I/O pointer
  • 각 레지스터의 이름2(메모리 주소 저장 용도)

    • EBP: Pointer to data on the stack (in the SS segment) -> 함수 호출 시 그 순간의 ESP 저장 후 함수 리턴 시 다시 ESP에 값 전달
    • ESI: source pointerfor string operations
    • EDI: destination pointer for string operations
    • ESP: Stack pointer (in the SS segment)

2) 세그먼트 레지스터

  • 세그먼트 메모리가 기술되어 있는 Segment Descriptor Table(SDT)의 index 저장
  • 각 세그먼트 레지스터의 이름
    • CS: Code Segment
    • SS: Stack Semgent
    • DS: Data Segment
    • ES: Extra(Data) Segment
    • FS: Data Segment
    • GS: Data Segment

3) 프로그램 상태와 컨트롤 레지스터

  • 플래그 레지스터의 이름: EFLAGS(32비트, 4바이트 크기)
  • 1 또는 0의 값을 가짐 -> On/Off 혹은 True/False의 의미

  • 리버싱 입문 단계에서 필수인 3가지 flag
    1. Zero Flag(ZF)
      • 연산 명령 후에 결과 값이 0이 되면 1(True)로 세팅

    2. Overflow Flag(OF)
      • 부호 있는 수(signed integer)의 오버플로우가 발생했을 때 1로 세팅
      • MSB(Most Significant Bit)가 변경되었을 때 1로 세팅

    3. Carry Flag(CF)
      • 부호 없는 수(Unsigned integer)의 오버플로우가 발생했을 때 1로 세팅

4) Instruction Pointer

  • EIP: Instruction pointer
  • CPU가 처리할 명령어의 주소 나타내는 레지스터
  • CPU는 EIP에 저장된 메모리 주소의 명령어를 하나 처리하고 난 후 자동으로 그 명령어 길이만큼 EIP 증가시키고 이 과정을 반복
  • EIP의 값 직접 변경 불가 -> 특정 명령어(JMP, Jcc, CALL, RET) 사용 또는 인터럽트(interrupt), 예외(exception) 발생시켜서 변경

0개의 댓글