<리버싱 핵심 원리>로 공부하였다.
03 리틀 엔디언 표기법
3.1. 바이트 오더링 : 데이터를 저장하는 방식(빅 엔디언, 리틀 엔디언)
BYTE b = 0x12;
WORD w = 0x1234;
DWORD dw = 0x12345678;
char str[] = "abced";
타입 | 이름 | 크기 | 빅 엔디언 | 리틀 엔디언 |
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] |
즉, 리틀 엔디언 방식은 데이터 순서를 반대로 저장한다. 리틀 엔디언도 바이트 자체는 정상적인 순서로 저장한다.
문자열은 char 배열이기 때문에 각 바이트를 하나씩 연속해서 저장한다고 생각하면 된다. 그래서 차이x
빅 엔디언 | 리틀 엔디언 | |
장점 | 사람이 보기에 직관적 | 산술 연산과 데이터의 타입이 확장/축소 될 때 효율적 |
이용 | RISC 계열 CPU, 네트워크 프로토콜 | Intel x86 CPU |
실제로 리틀 엔디언 방식으로 어떻게 저장되는지 확인해보자. 다음과 같은 코드를 입력하고 빌드해 exe 파일 생성한다.
OllyDbg에서 덤프쪽을 확인하면 위와 같이 정말 리틀 엔디언 방식으로 저장되어있는 것을 확인할 수 있다.