Reversing/Theory

Chapter 2. Register & Byte Ordering

The_j.n 2015. 8. 16. 16:53

Chapter 2. Register & Byte Ordering
1. Register
 - CPU Register
  · CPU 내부에 존재하는 다목적 저장 공간을 말한다.
  · Intel CPU와 AMD CPU는 IA-32(Intel Architecture-32)구조를 따르며 Register 구성도 같다. 

  · Register의 종류

  ◦ 범용 Register(General Purpose Registers)

  ◦ Segment Registers
  ◦ Flag Register(EFLAGS)
  ◦ Instruction Pointer
 - Register
  · 범용 Register(General Purpose Registers)

  ◦ 다양한 용도로 사용되는 Register
  ◦ 32Bit로 구성되어 있으며 8개(각 4Byte) Register로 구성되어 있다.
  ◦ 사용하고자하는 용도에 따라 얼마든지 다른 용도로 사용가능하다.
  ◦ 범용 Register의 종류
   ▹ EAX(Extended Accumulator Register)
    ▸  산술 연산 처리에 주로 사용되는 Register이다.
    ▸  32Bit로 구성되어 있다.
    ▸  아랫부분 16Bit AX로 나눌 수 있고 다시 각 8Bit씩 AH와 AL로 나눌 수 있다.
    ▸  I/O 장치의 입/출력과 부호 조작 명령은 EAX Register로만 처리가능하다
    ▸  곱셈(*), 나눗셈(/)의 Source Data는 EAX Register에 있어야만 처리가능하다.
    ▸  함수의 반환(Return) 값이 저장된다.
   ▹ EBX(Extended Base Register)
    ▸  시작 주소 값을 저장하는 Register이다.
    ▸  32Bit로 구성되어 있다.
    ▸  아랫부분 16Bit는 BX로 나눌 수 있고 다시 각 8Bit씩 BH와 BL로 나눌 수 있다.
   ▹ ECX(Extended Counter Register)
    ▸  반복 횟수를 지정하는 Register이다.
    ▸  32Bit로 구성되어 있다.
    ▸  아랫부분 16Bit는 CX로 나눌 수 있고 다시 각 8Bit씩 CH와 CL로 나눌 수 있다.
    ▸  반복 명령어 사용 시 반복 Counter로 사용된다.
    ▸  자동으로 Data가 감소하므로 인정 횟수만큼 반복시키는 반복문에서 사용한다.
   ▹ EDX(Extended Data Register)
    ▸  곱셈(*)과 나눗셈(/)에서 EAX와 조합하여 사용되는 Register이다.
    ▸  32Bit로 구성되어 있다.
    ▸  아랫부분 16Bit는 DX로 나눌 수 있고 다시 각 8Bit씩 DH와 DL로 나눌 수 있다.
    ▸  곱셈 : 연산결과가 EDX 또는 EAX에 입력된다.
    ▸  나눗셈 : 연산에 쓰이는 Source를 EDX 또는 EAX에 저장해 연산하며 연산결과에서 '몫'은 EAX에 '나머지'는 EDX에 저장된다.
   ▹ ESI(Extended Source Index)
    ▸  Data를 조작하거나 복사할 시 Source Data의 주소가 저장되는 Register
    ▸  32Bit로 구성되어 있다.
    ▸  아랫부분 16Bit는 작은 부분으로 SI로 나눌 수 있다.
   ▹ EDI(Extended Destination Index)
    ▸  Data를 복사하는 지점의 주소를 저장하는 Register
    ▸  32Bit로 구성되어 있다.
    ▸  아랫부분 16Bit는 작은 부분으로 DI로 나눌 수 있다.
   ▹ EBP(Extended Base Pointer)
    ▸  Stack Frame의 시작점(기준점)을 가리키는 Register이다.
    ▸  32Bit로 구성되어 있다.
    ▸  아랫부분 16Bit는 작은 부분으로 BP로 나눌 수 있다.
   ▹ ESP(Extended Stack Pointer)
    ▸  Stack Frame의 현재 위치를 가리키는 Register이다.
    ▸  32Bit로 구성되어 있다.
    ▸  아랫부분 16Bit는 작은 부분으로 SP로 나눌 수 있다.
  · Segment Registers

  ◦ Segment 기술을 사용하는데 같이 사용되는 Register
  ◦ Segment Descriptor Table(SDT)에 기술되어있는 Segment Memory의 Index 값을 표현하는데 사용된다.
  ◦ Segment
   ▹ 주소 영역을 다양한 크기로 나눠 시작 주소, 범위, 접근 권한 등을 각 조각에 저장해 Memory를 보호하는 기술
  ◦ 16Bit로 구성되어 있으며 6개의 Register로 구성되어 있다.
  ◦ Segment Register의 종류
   ▹ CS(Code Segment)
    ▸  명령 Code가 쓰이는 Code Segment의 시작 주소를 가지는 Register
   ▹ SS(Stack Segment)
    ▸  Stack 조작에서 Data 처리를 하는 Stack Segment의 시작 주소를 가지는 Register
   ▹ DS(Data Segment)
    ▸  Program에서 Data가 쓰여 지는 Stack Segment의 시작 주소를 가지는 Register
   ▹ ES(Extra Segment)
    ▸  Data 영역(Data Segment)의 시작 주소를 가지는 Register
   ▹ FS(Data Segment)
    ▸  문자열(String) 작업 처리시 사용되는 Register
   ▹ GS(Data Segment)
    ▸  Data 영역(Data Segment) 외의 다른 Segment에 접근할 때 사용되는 Register
  · Flag Register(EFLAGS)

  ◦ Data의 연산 결과의 상태를 알려주는 Flag Bit들이 모인 Register
  ◦ 중요 Flag : CF, ZF, OF
  ◦ Flag Register의 종류
   ▹ Status Flags
    ▸  CF(Carry Flag)
     ▫  부호 없는 수(Unsigned integer)의 OverFlow가 발생했을 때 1로 설정된다.
    ▸  PF(Parity Flag)
     ▫  Parity Check를 하는데 사용되는 Flag
     ▫  연산 결과 최하위 Byte 값이 짝수 일 경우 1로 설정된다.
    ▸  AF(Adjust Flag)
     ▫  연산 결과 Carry나 Borrow가 3bit 이상 발생할 경우 1로 설정된다.
    ▸  ZF(Zero Flag)
     ▫  연산 명령 후에 결과 값이 0이 되면 ZF가 1로 설정된다.
    ▸  SF(Sign Flag)
     ▫  Signed Integer의 경우 양수일 때 0으로 음수일 때 1로 설정된다.
    ▸  OF(Overflow Flag)
     ▫  부호 있는 수(Signed integer)의 OverFlow가 발생했을 때 1로 설정된다
     ▫  MSB(Most Significant Bit)가 변경되었을 때 1로 설정된다.
   ▹ System Flags
    ▸  IF(Interrups enable Flag)
    ▸  TF(Trap Flag)
    ▸  IOPL(I/O Privilege Level Field)
    ▸  NT(Nested Task Flag)
    ▸  RF(Resume Flag)
    ▸  VM(Virtual-8086 mode Flag)
    ▸  AC(Alignment Chack Flag)
    ▸  VIF(Virtual interrupt Flag)
    ▸  VIP(Virtual Interrupt Pending Flag)
    ▸  ID(Idnetification Flag)
  · Instruction Pointer
  ◦ 명령어 Register로 다음 실행할 명령어의 주소를 나타내는 Register이다.
  ◦ Instruction Pointer Register의 종류
   ▹ EIP(Extended Instruction Pointer)
    ▸  다음에 실행할 명령의 주소가 저장되는 Register이다.

 

2. Byte Ordering
 - Byte Ordering
  · Computer에서 Program이 Memory에 Data를 저장하는 방식
  · Byte Ordering 방식
  ◦ Big Endian
   ▹ Data를 저장할 때 사람이 보는 방식과 동일하게 앞에서부터 순차적으로 저장하는 방식
   ▹ 대형 UNIX Server에서 사용되는 RISC 계열 CPU, Network Protocol에서 사용된다.
  ◦ Little Endian
   ▹ Data를 저장할 때 1Byte(Hex 두 글자씩)씩 역순으로 저장하는 방식
   ▹ Intel CPU, AMD CPU에서 사용된다.
   ▹ 문자열 Data의 경우는 문자열이 끝인 NULL(00)문자를 만나기 전까지는 순차적으로 저장한다.
   ▹ OllyDbg에서 확인 시 Stack Window에서는 Little Endian 방식을 확인 할 수 있지만 Dump Window는 Program의 사용자가 보기 편하도록 원래 Data 형식을 복원해 보여준다.
 - Big Endian & Little Endian 비교

Type

Name

SIZE

Big Endian Style

Little Endian Style

BYTE

b

1

[12]

[12]

WORD

w

2

[12][34]

[34][12]

DWORD

dw

4

[12][34][56][78]

[78][56][34][12]

char []

str

6

[61][62][63][64][65][00]

[61][62][63][64][65][00]