바이트 오더링(Byte Ordering)은 컴퓨터에서 메모레이 데이터를 저장하는 방식을 의미한다.
바이트 오더링은 크게 두종류로 나뉘는데 리틀 엔디언(Little Endian), 빅 엔디언(Big Endian)으로 구분 할 수 있다.
간단하게 쉽게 설명부터 하자면, 빅 엔디언 방식은 데이터를 입력한 순서대로 저장합니다. 주로 대형 UNIX 서버에서 사용되는 RISC(*1)(Reduced Instruction Set Computer) CPU 또는 네트워크 프로토콜에 사용 합니다.
빅 엔디언의 장점은 데이터를 순서대로 저장하기 때문에 직관적이라는 점입니다. 뒤에서 다시 설명하겠지만 빅 엔디언과 리틀 엔디언의 가장 큰 차이점은 일부 자료형에 따른 저장방식이 다르다는 점입니다.
빅 엔디언의 경우 전 자료형에 대해 입력한 순서대로 저장하지만, 리틀 엔디언의 경우는 WORD형과 DWORD 자료형에 대해서는 입력한 순서와 반대로 저장합니다.
아래의 예를 들어 빅 엔디언을 설명하겠습니다.
- 코드(1.1)
BYTE b = 0x12; WORD w = 0x1234; DWORD dw = 0x12345678; char str[] = "abcde"; |
- 빅 엔디언 표기(표 1.1)
Type |
Name |
Size |
빅 엔디언 표기 |
BYTE |
b |
1 |
[12] |
WORD |
w |
2 |
[12][34] |
DWORD |
dw |
4 |
[12][34][56][78] |
char[] |
str |
6 |
[61][62][63][64][65][00] |
표 1.1에서 보는것과 같이 빅 엔디언은 값을 입력한 대로 저장한다. 마지막 char형의 경우 마지막에는 NULL값이 들어가기 때문에 [00]이 포함된다.
그럼 동일한 값을 리틀 엔디언 표기법으로 저장하면 어떻게 될까?
-리틀 엔디언 표기(표 1.2)
Type | Name |
Size |
리틀 엔디언 표기 |
BYTE |
b |
1 |
[12] |
WORD |
w |
2 |
[34][12] |
DWORD |
dw |
4 |
[78][56][34][12] |
char[] |
str |
6 |
[61][62][63][64][65][00] |
표 1.2에서 보는것과 같이 리틀 엔디언은 WORD형과 DWORD형에서는 입력된 순서와 반대로 값을 저장한다.
리틀 엔디언 방식의 경우 바이트 자체는 입력한 순서대로 저장이 되지만, WORD나 DWORD처럼 멀티 바이트(Multi-BYTE)의 경우에는 각 바이트가 역순으로 저장이 된다. 빅 엔디언이 직관적인 면에서 더 우월하기 때문에 소프트웨어 디버그가 편한 반면, 리틀 엔디언 방식은 산술 연산 및 데이터 타입의 확장/축소 시 더 편한 장점을 가지고 있다.
표 1.2를 보면, 문자열은 빅 엔디언과 동일한 방식으로 저장이 됨을 볼 수 있는데 이는 문자열은 결국 char 배열이기 때문에 각 바이트를 하나씩 연속해서 저장하기 때문에, 리틀 엔디언도 문자열 자체는 빅 엔디언과 동일하게 저장한다고 보면 된다.
*1) RISC : Reduced Instruction Set Computer의 약자로 말 그대로 풀어쓰면 '명령어 세트 컴퓨터' 라고 한다. 기존 CICS(*2)에 존재하는 수많은 명령어와 주소모드 중 실제 사용되는 명령어는 몇개 되지 않는다는 사실을 바탕으로 적은 수의 명령어만으로 명령어 집합을 구성한 방식이다.
*2) CICS : Complex Instruction Set Computer의 약자로 복잡한 명령어 집합을 갖는 CPU 아키텍처. 주로 메인프레임이나 X86 호환 프로세에서 이 방식을 사용하고 있다.
'보안 > 나의 리버싱 정복기' 카테고리의 다른 글
[Reverse Engineering] #1 진짜로(?) 들어가며 (0) | 2018.08.25 |
---|---|
레지스터(Register) -2(범용 레지스터) (0) | 2015.07.24 |
레지스터(Register) -1(레지스터란?) (0) | 2015.07.21 |
리버싱 공부를 시작하며.. (1) | 2014.08.19 |