Reversing/리버싱_핵심원리

4장 IA-32 Register 기본 설명

dcho 2019. 7. 25. 23:23
SMALL
CPU 레지스터란?

Register란 CPU 내부에 존재하는 다목적 저장 공간.
RAM과는 성격이 조금 다르다. 
CPU가 RAM에 있는 데이터를 액세스 하기 위해서는 물리적으로 먼 길을 돌아가야 하기에 시간이 오래 걸린다.
하지만 레지스터는 CPU와 한 몸이기 때문에 고속으로 데이터를 처리할 수 있다.

cpu가 재빨리 읽고 쓰기를 해야 하는 데이터들을 cpu 내부에 존재하는 메모리를 사용하는 데 이 메모리를 레지스터라고 한다

어셈블리 명령령어의 대부분은 레지스터를 조작하고 그 내용을 검사하는 것들이라 알아야 한다!

IA-32의 레지스터의 종류

Basic program execution registers 
x87 FPU registers 
MMX registers 
XMM registers 
Control registers 
Memory management registers 
Debug registers 
Memory type range registers
Machine specific registers 
Machine check register
...

디버깅의 초급 단계에서는 Basic program execution registers 에 대해서 알아두어야 한다. 
왜? 디버깅 할때 가장 많이 보게 될 레지스터 이므로 

Basic program execution registers 

구조는 아래와 같다.

  • 범용 레지스터 General-Purpose Registers (32비트 - 8개)
  • 세그먼트 레지스터 Segment Registers (16비트 - 6개)
  • 프로그램 상태와 컨트롤 레지스터 Program Status and Control Register (32비트 - 1개)
  • Instruction Pointer (32비트 -1개)

※ 레지스터에 E(Extended)가 붙은 이유는 16비트에서 32비트 크기로 확장했다는 말

  1. 범용 레지스터
  • 말 그대로 범용적으로 사용되는 레지스터이다. IA-32에서 범용 레지스터들의 크기는 32비트(4바이트)이다.
  • 보통은 상수/주소 등을 저장할 때 주로 사용
  • 특정 어셈블리 명령어서는 특정 레지스터를 조작하기도 함.
  • 어떤 레지스터들은 특수한 용도로 사용되기도 한다.
  • 논리, 수리 연산에 사용되는 피연산자, 주소를 계산하는 데 사용되는 피연산자, 메모리 포인터 가 저장되는 레지스터
  • 아래 4개의 레지스터들은 주로 산술연산 명령어에서 상수/변수 값의 저장용도로 많이 사용된다.
  • EAX – 피연산자와 연산 결과의 저장소
  • EBX – DS segment안의 데이터를 가리키는 포인터
  • ECX – 문자열 처리나 루프를 위한 카운터
  • EDX – I/O 포인터

    • 아래 4개의 레지스터들은 주로 메모리 주소를 저장하는 포인터로 사용된다.
    • ESI – DS 레지스터가 가리키는 data segment 내의 어느 데이터를 가리키고 있는 포인터, 문자열 처리에서 source
    • EDI – ES 레지스터가 가리키는 data segment 내의 어느 데이터를 가리키고 있는 포인터, 문자열 처리에서 destination
    • ESP – SS 레지스터가 가리키는 stack segment의 맨 꼭대기를 가리키는 포인터
    • EBP – SS 레지스터가 가리키는 스택 상의 한 데이터를 가리키는 포인터 ( 스택 프레임의 시작 주소 가리킴 )
  1. 세그먼트 레지스터
    • 세그먼트 ? 운영체제는 하나의 프로세스를 실행시키면 이 프로세스를 segment라는 단위로 묶어서 가용 메모 리 영역에 저장, 오늘날에는 멀티태스킹이 가능하므로 하나의 가용메모리에 여러 개의 segment들 이 저장되어 사용될수 있다.

    • 현재 세그먼트라고 하는 메모리의 한 영역에 대한 주소지정을 제공
    • CS – code segment 가리킨다.
    • DS, ES, FS, GS – data segment 가리킨다.
    • SS – stack segment 가리킨다.

    1. 프로그램 상태와 컨트롤 레지스터
    • EFLAGS : Flag Register
      • 플래그 레지스터의 이름은 EFLAGS 이며 32비트(4바이트) 크기이다
      • 각각 비트마다 의미를 가지고있고 각 비트는 1 또는 0 값을 가지는데 on/off or True/False 의미한다.
      • 일단 3가지만 잘 이해하면 된다고 한다. 
      • ZF : 연산 명령 후에 결과 값이 0이 되면 ZF가 1(True)로 셋팅
      • OF: 부호 있는 수의 오버플로가 발생했을 떄 1로 셋팅. 그리고 MSB(Most Significant Bit)가 변경되었을 때 1로 셋팅
      • CF : 부호 없는 수의 오버플로가 발생했을 때 1로 셋팅

    1. Instruction Pointer
    • EIP : Instruction Pointer
    • CPU가 처리할 명령어의 주소를 나타내는 레지스터, 크기는 32비트(4바이트) (16비트의 IP 레지스터의 확장)
    • 직접적으로 변경 X 간접적으로 변경해야함 (JMP,CALL,RET , 인터럽트, 예외등)

    'Reversing > 리버싱_핵심원리' 카테고리의 다른 글

    6장 abex' crackme #1 분석  (0) 2019.07.25
    5장 스택  (0) 2019.07.25
    3장 리틀 엔디언 표기법  (0) 2019.07.25
    2장 Hello World! 리버싱  (0) 2019.07.25
    1장 리버싱 스토리  (0) 2019.07.25