cpu 레지스터란 cpu 내부에 존재하는 다목적 저장 공간이다. 메모리(RAM)와는 조금 성격이 다르다. CPU가 RAM에 있는 데이터를 Acess하기 위해서는 물리적으로 먼 길을 돌아가야 하기 때문에 시간이 오래 걸리는 반면 레지스터는 cpu에 내장되어 있기에 고속으로 데이터를 처리할 수 있다.

레지스터의 종류에는 무척 많은데, 리버싱 기초에 알아야 할 레지스터는 Basic program execution register라는 그룹이다.

이 그룹 안에는 또 다시 4개로 나눌 수 있다.

즉,

Basic program execution register

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

이런 형태인데.. 여기서 또 주로 쓰는 건 범용 레지스터라는 녀석이다. 바로 General Purpose Registers 인데 총 8개의 레지스터가 있다. 크기는 각각 4바이트씩 차지한다. 상수/주소 등을 저장할 때 주로 사용되며, 특정 어셈블리 명령어에서는 특정 레지스터를 조작하기도 한다.

General Purpose Registers

  • EAX
  • EBX
  • ECX
  • EDX
  • EBP
  • ESI
  • EDI
  • ESP

이렇게 8개가 있다. 그리고 각 레지스터들은 16비트의 하위호환을 위해 또 여기서 몇 개의 구획으로 나누어 진다. 이 부분은 책에서 설명을 잘 해두었으니.. 이정도만 알아두자.

각 레지스터의 이름은 아래와 같다.

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는 반복문을 도는 명령어에서 반복 카운트로 사용된다. 루프를 돌 때 마다 ECX를 1씩 감소시키는 것이다. 그리고 EAX는 함수의 리턴 값에 사용된다. 모든 win32 api 함수들은 리턴 값을 EAX에 저장한 후 반환하게 된다.

나머지 4개도 알아보자.

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 the SS segment)

이 4개의 레지스터들은 주로 메모리 주소를 저장하는 포인터로 사용된다. ESP는 스택 메모리의 주소를 가르킨다. EBP는 함수가 호출되었을 때 그 순간의 ESP를 저장하고 있다가, 함수가 리턴하기 직전에 다시 ESP에 값을 되돌려줘서 스택이 깨지지 않도록 한다. <- 이것을 Stack Frame기법이라고 한다. ESI,EDI는 특정 명령어들과 함께 주로 메모리 복사에 사용된다.