본문 바로가기
리버스 코드 엔지니어링

[리버스 엔지니어링] CPU 레지스터

by 손정빈 2018. 11. 14.
728x90
반응형

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

 

vs 일반적인 메모리(RAM) : 레지스터가 속도가 훨씬 빠르다. 

 

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

  • 어셈블리어의 대부분이 레지스터를 조작하는 것이기에 레지스터의 용도의 내용을 이해 해야한다.

 

가장 기초가 되는 Register = Basic program execution registers

  • General Purpose Register (32bit - 8)
  • Segment Register (16Bit - 6)
  • Program Status and Control Register (32Bit - 1)
  • Instruction Pointer(32Bit - 1)



General Purpose Register

  • EAX : Accumulator for operands and result data
  • EBX : Pointer to data in the DS segment
  • ECX : Counter for string and loop opertions
  • EDX : I/O pointer
    • 4개의 레지스터는 주로 산술연산(add, sub, xor, or ) 명령어에서 상수/변수 값을 저장하는 용도록 주로 사용한다.
    • 어떤 어셈블리 명령어(mul, div, lods )들은 특정 레지스터를 직접 조작하기도 한다.
    • ECX Loop에서 반복 카운터로 사용(루프를 돌때마다 1 감소)
    • 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 the SS segment)
    • Push, pop, call, ret 명령어들은 ESP 직접 조작한다. ( 스택 메모리 관리는 프로그램에서 매우 중요하기에 ESP 다른 용도로 사용하는 것은 좋지 않다.)
    • 4개의 레지스터들은 주로 메모리 주소를 저장하는 포인터로 사용된다.
    • EBP 함수가 호출되었을 순간의 ESP 저장하고 있다가, 함수가 리턴하기 직전에 다시 ESP 값을 되돌려줘서 스택이 깨지지 않도록 한다. (스택 프레임 기법)
    • ESI, EDI 특정명령어들(lods, stos, rep movs ) 함께 주로 메모리 복사에 사용된다.

 

 

세그먼트 레지스터

  • I-32 보호 모드에서 세그먼트란 메모리를 조각내어 조각마다 시작 주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법을 말한다.
  • 세그먼트는 페이징 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 사용된다.
  • 세그먼트 메모리는 Segment Descriptor Table(SDT)이라고 하는 곳에 기술되어 있으며, 세그먼트 레지스터가 SDT Index 가지고 있다.
  • 세그먼트 레지스터는 6(CS, SS, DS, ES, FS, GS)이며 각각의 크기는 16bit이다.
  • 세그먼트 레지스터가 가리키는 세그먼트 디스크립터와 가상메모리가 조합되어 선형주소가 되며, 페이징 기법에 의해서 선형주소가 최종적으 물리주소로 변환된다.

 

  • CS : Code Segment
  • SS : Stack Segment
  • DS : Data Segment
  • ES : Extra Segment
  • FS : Data Segment  //  애플리케이션 디버깅에도 자주 등장하는데 SEH(structureed Exception Handling), TEB(Thread Environmnet Block), PED(Process Environment Block) 등의 주소를 계산할 자주 사용된다.
  • GS : Data Segment // ES, FS, GS 추가적인 데이터 세그먼트이다.



 

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

  • EFLAGS : Flag Register // 플래그 레지스터는 32bit이다.
  • 1이면 On / 0이면 Off 의미를 가지고 있다.
  • EFLAGS 레지스터의 32개의 비트의 의미를 전부 이해하는 것은 어려움.
  • 기초단계에선 OF, ZF, CF 3개만 이해하면 된다.
  • 3 플래그는 조건 분기 명령어에서 값을 확인하고 그에 따른 동작을 수행함.

 

  • ZF (Zero Flag) : 연산 명령 결과 값이 0 되면 1 셋팅
  • OF (Overflow Flag) : 부호 있는 수의 오버플로우가 발생 1 셋팅
    또한
    MSB(Most Significant Bit/최상위비트) 변경 되었을 1 셋팅
  • CF (Carry Flag) : 부호 없는 수의 오버플로우가 발생 1 셋팅

 

Instruction Pointer

  • EIP : Instruction Point
  • CPU 처리할 명령어의 주소를 나타내는 레지스터 // 크기 32bit
  • EIP 직접적으로 변경 없도록 되어 있다.
  • 변경 하고 싶을 시에는 다른 명령어를 통해 간접적으로 변경해야 한다.
    특정 명령어(JMP, JCC, CALL, RET) 사용하거나 인터럽트, 예외처리를
    발생 시켜야한다.

반응형

댓글