Security/Reversing

[Reversing] 04. IA-32 Register 기본 설명

cho2cee 2021. 11. 25. 23:48

1. CPU 레지스터란? 

레지스터CPU 내부에 존재하는 다목적 저장 공간이다. 

CPU가 RAM에 있는 데이터를 액세스하기 위해서는 물리적으로 먼 길을 돌아가야 하기 때문에 시간이 오래 걸린다.

하지만 레지스터는 CPU와 한 몸이기 때문에 고속으로 데이터를 처리할 수 있다.

 

1.1 레지스터에 대해 알아야 하는 이유 

IA-32(Intel Architecture 32비트)에서 제공하는 어셈블리 명령어

어셈블리 명령어의 대부분은 레지스터를 조작하고 그 내용을 검사하기 떄문에 레지스터를 모르면 명령어 자체도 이해하기 힘들다. 

 

2. IA-32의 레지스터 

애플리케이션의 디버깅의 초급 단계에서는 Basic program executio register에 대해 알아두어야 한다. 

 

2.1 Basic program execution registers 

  • General Purpose Registers (32비트 - 8개)
  • Segment Registers (16비트 - 6개)
  • Program Status and Control Register (32비트 - 1개) 
  • Instruction Pointer (32비트 - 1개)

Basic program execution registers 

 

📌 레지스터 이름에 E가 붙은 경우는 예전 16비트 CPU인 IA-16 시절부터 존재하던 15비트 크기의 레지스터들을 32비트 크기로 확장시켰다는 뜻이다. 

 

1) 범용 레지스터 

범용적으로 '막' 쓰는 레지스터

IA-32에서 각각의 범용 레지스터들의 크기는 32비트(4바이트)이다. 

보통 상수/주소 등을 저장할 떄 주로 사용되며, 특정 어셈블리 명령어에서는 특정 레지스터를 조작하기도 하고 특수한 용도로 사용되기도 한다. 

 

각 레지스터의 이름은 다음과 같다. 

  • EAX : Accumulator for operands and results data
  • EBX : Pointer to data in the DS segment 
  • ECX : Counter for string and loop operations 
  • EDX : I/O pointer 

위 4개의 레지스터들은 주로 산술연산(ADD, SUB, XOR, OR 등) 명령어에서 상수/변수 값의 저장 용도로 많이 사용된다. 

 

ECX와 EAX는 특수한 용도로도 사용된다. 

ECX는 반복문 명령어(LOOP)에서 반복 카운트로 사용된다. 

➜ 루프를 돌 때마다 ECX를 1씩 감소시킨다.

EAX는 일반적으로 함수 리턴 값에 사용된다.

➜ 모든 Win32 API 함수들은 리턴 값을 EAX에 저장한 후 리턴한다. 

 

나머지 범용 레지스터들의 이름은 아래와 같다. 

  • EBP : Pointer to data on the stack (in the SS segment)
  • ESI : source pointer for string operations 
  • EDI : destination pointer for string operations 
  • ESP : Stack pointer (in ter SS segment) 

위 4개의 레지스터들은 주로 메모리 주소를 저장하는 포인터로 사용된다.

 

ESP는 스택 메모리 주소를 가리킨다. 

어떤 명령어들은 ESP를 직접 조작하기도 한다.

EBP는 함수가 호출되었을 떄 그 순간의 ESP를 저장하고 있다가, 함수가 리턴하기 직전에 다시 ESP에 값을 되돌려줘서 스택이 깨지지 않도록 한다. 

이것을 Stack Frame 기법이라고 함. 

 


Reference

🔗http://www.yes24.com/Product/Goods/7529742