분석하는 과정에서 꼭 알고 넘어가야 하는 부분이 바이트오더(Byte-order)이다.
우리가 사용 하는 컴퓨터에는 cpu라는 두뇌역할을 하는 하드웨어가 있는데, cpu의 제조사에 따라서 바이트 오더가 다르다.
크게 바이트 오더는 2가지로 나누어 진다.
리틀엔디안(Little-endian), 빅엔디안(Big-endian)
엔디언(Endianness)은 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻하며, 바이트를 배열하는 방법을 특히 바이트 순서(Byte order)라 한다. - 출처 : 위키백과 - |
리틀엔디안(Little_endian) vs 빅엔디안(Big-endian)
주로 인텔(intel) 프로세스 계열에서 사용되는 바이트오더이다.
리틀엔디안은 데이터를 메모리에 적재 할 때, 메모리 시작주소에 데이터의 하위 바이트부터 적재한다는 특징이 있고
빅엔디안은 반대로 메모리 시작주소에 데이터의 상위 바이트부터 적재한다는 특징이 있다.
[도표] 레지스터와 메모리 위치 매핑 관계 , 출처 : 위키피디아(www.wikipedia.org)
위 도표를 보면 어느정도 쉽게 이해할 수 있을 것이다. 레지스터에서 읽는 순서와, 메모리에 적재되는 순서를 나타내어 지고 있다.
보통 네트워크상의 패킷을 분석하면 모두 빅엔디안 방식이다.
네트워크 프로토콜에서 빅엔디안 방식으로 하기로 약속 했기 때문이다.
빅 엔디안을 표현하면 아래와 같다.
출처 : 위키피디아
기본적으로 데이터를 메모리에 적재할 때에는, 낮은 주소부터 데이터를 적재하게 된다.
빅 엔디안은 0x0A0B0C0D라는 데이터를 메모리에 적재 한다고 할 때, 상위 데이터(0x0A)부터 적재한다.
리틀 엔디안을 표현하면 아래와 같다.
리틀엔디안은 0x0A0B0C0D라는 데이터를 메모리에 적재 한다고 할 때, 하위 데이터(0x0D)부터 적재한다.
정리하자면,
데이터가 메모리에 적재될 때, 메모리의 낮은 주소부터 적재되게 되는데,
리틀엔디안은 데이터의 하위 데이터부터 메모리에 적재된다.
빅엔디안은 데이터의 상위 데이터부터 메모리에 적재된다.
리틀 엔디안을 왜 나왔을까?
--- 아래는 리틀/빅 엔디안 방식을 사용 하는 시스템들이다 ---
[리틀 엔디안]
Linux on x86, x64, Alpha and Itanium
Mac OS X on x86, x64
OpenVMS on VAX, Alpha and Itanium
Solaris on x86, x64, PowerPC
Tru64 UNIX on Alpha
Windows on x86, x64 and Itanium
[빅 엔디안]