리버싱 엔지니어링/리버싱 핵심 원리

4 IA-32 Register 기본 설명

흰싸라기 2022. 2. 6. 03:18

IA-32 Register : 인텔의 32비트 마이크로 프로세스에서 사용하는 명령 집합 아키텍처

4.1 CPU 레지스터

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

  • 어셈블리 명령어의 대부분은 레지스터를 조작하고 그 내용을 검사하는 것들이기 때문에 레지스터에 대해서 알아야 함.

4.2 Bagic program execution registers

: IA-32 Register 종류 중 하나. 디버깅 초급 단계에서 알아두면 좋음.

 

4.2.1 범용 레지스터 (General-Purpose Registers)

: 범용적으로 사용되는 레지스터(막 쓰는 레지스터)

  • 각각의 범용 레지스터들의 크기 : 32비트(4바이트)
  • 상수/주소 등을 저장하기 위해 사용

레지스터의 구성

  • 예시 ) EAX 기준
    • EAX : (0~31) 32비트
    • AX : (0~15) EAX의 하위 16비트
    • AH : (8~15) AX의 상위 8비트
    • AL : (0~7) AX의 하위 8비트
  • 상황에 맞게 레지스터를 8비트, 16비트, 32비트 나누어 사용

상수/변수 값의 저장 용도로 쓰이는 레지스터

  • EAX : 산술 연산에 주로 사용 되고 함수 리턴 값을 저장하는데에 사용됨.
  • EBX : 데이터 주소를 가리키는 포인터로 사용.
  • ECX : 반복문 명령어에서 반복 카운트로 사용. 루프를 톨 때마다 ECX를 1씩 감소시킴.
  • EDX : 산술 연산 및 I/O 명령에서 사용.

메모리 주소를 저장하는 용도로 쓰이는 레지스터 (포인터로 사용)

  • EBP : 함수가 호출되었을 때 그 순간의 ESP를 저장하고 있다가, 함수가 리턴하기 직전에 다시 ESP에 값을 되돌려주어 스택이 깨지지 않도록 (Stack Frame 기법)
  • ESI, EDI : 특정 명령어(LODS, STOS, REP MOVS 등)과 함께 주로 메모리 복사에 사용됨.
  • ESP : 스택 메모리 주소를 가리킴

 

4.2.2 세그먼트 레지스터(Segment Registers)

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

  • 각각 레지스터의 크기 : 16비트(2바이트)

레지스터 구성

  • CS : 코드 세그먼트
  • SS : 스택 세그먼트
  • DS: 데이터 세그먼트
  • ES, FS, GS : 추가적인 데이터 세그먼트
    • FS는 애플리케이션 디버깅에도 등장. 고급 디버깅 주제.

 

4.2.3 프로그램 상태와 컨트롤 레지스터(Program Status and Control Register)

  • 레지스터 크기 : 32비트(4바이트)

  • 각 비트마다 의미를 가지고 있음
    • 0,1의 값을 가지는데 On/Off 혹은 True/false를 의미

애플리케이션 디버깅에 필요한 flag

  • Zero Flag(ZF) : 연산 명령 후 결과 값이 0이 되면 1(True)로 세팅
  • Overflow Flag(OF) : 부호 있는 수(signed integer)의 오버플로가 발생했을 때 1로 세팅.
  • Carry Flag(CF) : 부호 없는 수(unsigned integer)의 오버플로가 발생했을 때 1로 세팅.

 

4.2.4 (Instruction Pointer)

  • 레지스터 크기 : 32비트(4바이트
  • CPU는 EIP에 저장된 메모리 주소의 명령어를 처리하고 자동으로 그 명렁어 길이만큼 EIP를 증가시키며 명령어를 처리해 나감.
  • EIP 값은 직접 변경 불가
    • 특정 명령어(JMP, Jcc, CALL, RET)를 사용하거나 인터럽트, 예외를 발생시켜야 함.