Chapter 2. Register & Byte Ordering
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] |