본문 바로가기
보안 공부/Reversing

[리버싱] 레지스터란, 레지스터 종류

by 그적 2019. 9. 15.

레지스터를 알고 가기 전, 하드웨어 구성을 알고 가자.     //CPU에 대한 이해까지 추가적으로 하면 레지스터가 쉬움
 >> CPU, 메인메모리, 입출력 버스로 구성되어 있다.

CPU란 Central Processing Unit의 약자로, 중앙처리장치라고도 불리며 주로 연산이 이루어진다.
내부에는 ALU, Cotrol Unit, Bus Interface, Register로 구성되어 있다.
  - ALU : CPU내부에서 실제 프로그램이 실행되는 연산을 담당(산술 연산, 논리 연산이 행해짐)
  - Control Unit : CPU가 처리해야 할 명령어를 해석하고 그에 맞는 신호를 발생
  - Bus Interface : 컴퓨터 하드웨어 요소들 간의 데이터를 서로 주고 받을 수 있는 통로
  - Register : CPU내부의 아주 작은 메모리 공간

메인 메모리는 램(Ram)이라고 불리는 주기억장치를 의미하며, 프로그램의 코드가 메모리에 적재되어 실행되는 곳이다. 프로그램의 실행을 위해 존재하는 메모리이다.

입출력 버스는 데이터 송/수신이 이루어지고, Adress Bus, Data Bus, Control Bus 세 가지로 구분된다.  //추후 조사 필요

--------------------------------------------------------------------------------------------------

레지스터란?
  앞서 레지스터에서 배울 땐 CPU내부의 아주 작은 메모리 공간이라고 칭했다. 하지만 CPU 동작원리를 이해하면, 레지스터는 CPU가 요청을 처리하는데 필요한 데이터를 "일시적으로" 저장하는 공간임을 알 수 있다.

Q. 레지스터가 RAM과는 어떠한 다른 역할을 하는가?
 >> 레지스터 역시 RAM의 일종이긴 하지만 RAM과 구분되는 점은 물리적인 구성이 아닌 사용 용도에 따라 달라진다는 점이다. CPU가 하드디스크에 접근하기 위해서는 하드디스크의 데이터를 메모리로 이동시켜 접근해야 한다. 

 >> 따라서 물리적으로 먼 길을 돌아가는 RAM을 생각하면,  자주 쓰이는 데이터들은 캐시로부터 데이터를 읽어들여 레지스터를 이용해 고속으로 데이터를 처리한다. (CPU 동작원리의 예시 중에서 연산 과정을 통해 레지스터에 저장되는 것 또한, 연산의 경우에도 빠른 데이터들의 처리를 필요로 하기 때문인 것과 같은 맥락이라고 생각하자.)    // 일반적으로 메인 메모리라고 하면 RAM을 의미함.

-------------------------------------------------------------------------------------------------------

레지스터 종류
 1. 범용 레지스터 
 2. 세그먼트 레지스터
 3. 인덱스 레지스터
 4. FLAG 레지스터
 5. EIP 레지스터

① 범용 레지스터(32비트)
: 8개의 레지스터로 구성되며, 산술/논리 연산, 오퍼랜드(피연산자)를 저장하거나 포인터 역할함(메모리 주소 저장)
  ** 64비트의 경우 범용레지스터 EOO->ROO으로 변경됨(ex.RAX), R8~R15 레지스터도 추가됨.

    - EAX(Accumulator) : 곱셈과 나눗셈 명령에서 자동으로 사용, 함수의 리턴 값이 저장(누적 연산기). 
    - EBX(Base) : 특정 주소를 지정, ESI나 EDI와 결합하여 인덱스에 사용됨.
    - ECX(Counter) : 반복 명령에서 반복 카운터로 사용, 반복할 횟수를 지정 후 수행됨.
    - EDX(Data) : EAX와 같이 쓰이며, 입출력 연산에서 간접주소 지정에 쓰임.
 
             **하위호환을 위해 X로 나뉘고, X는 다시 H/L 구역으로 나눠짐.
             **32bit를 사용하고 싶으면 EAX를 사용, 2바이트(16bit)만 쓰고 싶으면 AX를, 1바이트만 사용하고 싶으면 AH/AL 사용

    - EBP(Base) : 베이스 포인터, 스택 프레임의 시작 지점 주소가 저장, 사용되고 있는 스택이 소멸되지 않는 동안에는 EBP의 값이 변하지 않는다. 현재 스택 프레임이 소멸되면 이전에 사용되던 스택 프레임을 가리키게 됨.
    - ESP(Stack) : 스택 포인터, 스택 프레임의 끝 지점 주소가 저장, PUSH/POP 명령어에 따라서 값이 4byte씩 변함

② 세그먼트 레지스터(16비트)
: 윈도우 OS는 프로세서가 메모리에 접근할 때, 세그먼트 레지스터를 사용해 가상 메모리를 물리 메모리로 변환함.
            //32bit, 64bit 환경이 되어서도 세그먼트 레지스터는 확장되지 X
 
     - CS(Code) : 코드 영역을 가리키는 레지스터, 코드의 시작주소를 포함함. (=명령어 주소 지정)
     - DS(Data) : 데이터 영역을 가리키는 레지스터 (=데이터, 상수)
     - SS(Stack) : 스택 영역을 가리키는 레지스터 (=지역변수) 
                 //위쪽 세개의 레지스터가 주로 쓰임. ES, FS, GS는 추가적인 데이터 세그먼트이다.
     - ES, FS, GS 

③ 인덱스 레지스터(32비트)
: 데이터와 명령어들의 오프셋 주소를 갖는다.
     - EDI(Desination) : 복사/비교할 때 데이터의 주소를 저장됨(읽기).
     - ESI(Source) : 복사/비교할 때 목적지의 주소가 저장됨(쓰기).

④ FLAG 레지스터(32비트)
: CPU의 현재 상태나 동작을 제어하는 비트들로 구성되어있다.. 제어 플레그, 상태 플레그 두 가지로 구분할 수 있다.

   [제어 플레그]
     - DF(Direction) : 문자열을 처리할 때, 플래그가 0이면 데이터 이동 주소 증가, 1이면 자동 감소.
     - IF(Interrupt) : 플래그가 0일 때 외부 인터럽트(일시정지) 요구 무시, 1일 때는 외부 인터럽트 요구 수용.
     - TF(Trap) : 플래그가 0일 때 기존의 명령 실행, 1일 때는 내부 인터럽트 발생.

   [상태 플레그]
     - CF(Carry) : 산술 연산에서 빌림수 발생시 1로 설정.
     - AF(Adjust) : 16(8)bit 연산에서 빌림수 발생 시 1로 설정.
     - PF(Parity) : 연산의 결과가 짝수면 1, 홀수면 0으로 설정/ 패리티를 체크.
     - OF(Overflow) : 부호 "있는" 산술 연산의 결과가 오버플로가 발생했을 때 플래그를 1로 설정.
     - SF(Sign) : 산술 논리 연산의 결과가 음수일 때 플래그를 1로 설정.
     - ZF(Zero) : 산수 논리 연산의 결과가 0일 때 플래그를 1로 설정

⑤ EIP 레지스터(32비트)
: Instruction 레지스터라고도 불리며, 다음에 실행할 명령어의 주소를 가리킴. 분기문을 사용해 변경(분기 명령어 : jmp, call, ret)

댓글