본문 바로가기
Reversing/리버싱 핵심 원리

[리버싱 핵심 원리] 4장, IA-32 Register 기본 설명

by Y06 2020. 11. 7.

04, IA-32 Register 기본 설명

 

4.1.CPU 레지스터란?

레지스터: CPU 내부에 존재하는 다목적 공간

 

- Ram과는 다른 성격을 가진다.

- CPU가 RAM에 있는 데이터를 엑세스 하기 위해서는 물리적으로 먼 길을 돌아가야 하기 때문에 시간이 오래 걸린다. 그러나 레지스터는 CPU와 한 몸이기 때문에 고속으로 데이터를 전송할 수 있다.

 

4.1.1.레지스터를 알아야 하는 이유?

 

- 리버싱 초급 단계에서 애플리케이션 디버깅을 잘 하려면 디버거가 해석해 주는 어셈블리 명령어를 공부해야 한다.

- 어셈블리 명령어의 대부분은 레지스터를 조작하고 그 내용을 검사하는 것들인데, 정작 레지스터를 모르면 명령어 자체도 이해하기 힘들다.

 

4.2. IA-32의 레지스터

- Intel Architecture 32비트 레지스터

 

4.2.1.Basic Program execution register

 

1) General Purpose Register(32비트 -8개)

     - 범용 레지스터

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

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

     - 상수/주소 등을 저장할 때 주로 사용

     - 특정 어셈블리 명령어에서는 특정 레지스터를 조작

     - 어떤 레지스터들은 특수한 용도로 사용

     - 주로 산술연산 명령어에서 상수/변수 용도로 사용

     - 어떤 어셈블리어들은 특정 레지스터를 직접 조작 (명령어 실행이후 레지스터 값이 변함)

 

2) Segment Registers(16비트 -6개)

     - 세트먼트: IA-32 메모리 관리에서 나오는 용어

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

     - 페이징(Paging) 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용

     - 세그먼트 메모리는 segment Descriptor Table(SDT)이라고 하는 곳에 기록

     - 세크먼트 레지스터는 바로 이 SDT의 index를 가짐

 

3) Program status and Control Register (32비트 -1개)

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

     - 플래그(flag) 레지스트의 이름은 EFLAGS이며 32비트(4바이트) 크기

     - EFLAGS 레지스터 (16비트의 FLAGS 레지스트의 32비트 확장 형태

     - 플래그 레지스트의 특징

        (1) 각 비트는 1 또는 0의 값을 가지는데, 이는 On/Off 혹은 True/False를 의미

        (2) Flag는 단어 그대로 깃발이 올라가면 1(On/True), 내려가면 0

4) Instruction Pointer (32비트 -1개)

     - EIP

     - CPU가 처리할 명령어의 주소를 나타내는 레지스터

     - 크기는 32비트(4바이트) -> (16비트의 IP 레지스터의 확장 형태)

     - EIP에 저장된 메모리 주소의 명령어를 하나 처리하고 난 후 자동으로 그 명령어 길이만큼 EIP를 증가시킨다.

     - 범용 레지스터들과는 다르게 EIP는 그 값을 직접 변경할 수 없다. (명령어를 통하여 간접적 변경)

 

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