[ Reversing ] 리틀 엔디안 VS 빅 엔디안
by 월루🙋 엔디언이 대체 뭔가요?
엔디언(Endianness)은 컴퓨터의 메모리와 같은 1차원 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻하며, 바이트를 배열하는 방법을 특히 바이트 순서(Byte order)라고 합니다.
예를 들어 0x1A92BF6B라는 16진수 정수를 컴퓨터는 어떻게 메모리나 저장장치에 저장하고 읽어들일까요?
보통 생각하기엔 아래 처럼 저장할것 같습니다.
0x1A92BF6B -> [낮은 주소] 0x1A 0x92 0xBF 0x6B [높은 주소]
/*
컴퓨터는 데이터를 2진수의 1바이트(8비트) 단위로 저장합니다.
이때 2진수를 16진수로 변환하면 사람이 더 이해하기 쉽기 때문에 16진수로 표현하였습니다.
TMI: (0x숫자)는 16진수 숫자를 의미하나, 절대적인 규칙은 아닙니다.
*/
하지만 실제로 제 컴퓨터에서 데이터가 저장된 바이너리를 열어보면 아래와 같습니다.
0x1A92BF6B -> [낮은 주소] 0x6B 0xBF 0x92 0x1A [높은 주소]
조금 느낌이 오시나요? 사실 처음 보여드린 방식이나 바로 위에서 보여드린 방식이나 모두 실제 컴퓨터가 데이터를 배열하는 방법(엔디언)입니다. 하지만 컴퓨터 마다 엔디언의 차이가 있습니다. 크게 전자 방식을 빅 엔디언(Big-endian), 후자 방식을 리틀 엔디언(Little-endian) 그리고 소개해드리지 못한 미들 엔디언(Middle-endian)이 있습니다.
🔍 다양한 엔디언을 알아봅시다!
- 빅 엔디언(Big-endian)빅 엔디언은 사람이 숫자를 쓰는 방법과 같이 큰 단위의 바이트가 앞에 오는 방법입니다.
0x1A92BF6B -> [낮은 주소] 0x1A 0x92 0xBF 0x6B [높은 주소]
- 리틀 엔디언(Little-endian)리틀 엔디언은 빅 엔디언과 반대로 작은 단위의 바이트가 앞에 오는 방법입니다.
0x1A92BF6B -> [낮은 주소] 0x6B 0xBF 0x92 0x1A [높은 주소]
- 미들 엔디언(Middle-endian)
위 두 엔디언을 제외한 미들 엔디언은 2바이트 단위와 1바이트 단위로 서로 다른 순서를 사용합니다만, PDP-11과 같은 몇몇 아키텍처에서만 사용하는 특수한 엔디언입니다.
⚔️ 빅 엔디언 vs 리틀 엔디언
- 빅 엔디언(Big-endian)
빅 엔디언은 소프트웨어의 디버깅를 편하게 해 주는 성향이 있습니다. 아무래도 저장 방식이 사람이 숫자를 읽고 쓰는 방법과 같기 때문에 디버깅을 하는 사람이 디버깅 과정에서 메모리나 데이터의 값을 보기 편합니다. 또한 아래에서 설명하는 네트워크 통신에서 사용하는 바이트 오더링이기도 합니다.
[UNIX의 RISC 계열의 프로세서가 사용하는 바이트 오더링] - 리틀 엔디언(Little-endian)
빅 엔디언과 반대로 리틀 엔디언은 메모리에 저장된 값의 하위 바이트들만 사용할 떄 별도의 계산이 필요하지 않다는 장점이 있습니다. 그러나 숫자 비교시에는 빅 엔디언이 리틀 엔디언보다 속도가 더 빠르다고 하네요.
[Intel 계열의 프로세서가 사용하는 바이트 오더링]메모리 4바이트에 할당된 공간에 0x10이라는 숫자가 담겨 있다면 아래와 리틀 엔디언은 아래와 같습니다. [낮은 주소] 0x10 0x00 0x00 0x00 [높은 주소] 그럼 특정 컴퓨터에서 위에서 할당된 공간의 첫 주소만 포인팅하면 0x10만 읽어도 데이터를 읽어 올 수 있습니다. 하지만 빅 엔디언에선 할당된 공간의 첫 주소에서 3 바이트를 더하거나, 첫 바이트 부터 마지막 바이트까지 읽어야 해당 데이터를 읽어 올 수 있습니다. [낮은 주소] 0x00 0x00 0x00 0x10 [높은 주소]
🌏 빅 엔디언은 네트워크 통신에서 사용하는 바이트 오더링입니다!
빅 엔디언은 소켓 네트워크 통신에서 사용하는 정해진 엔디언입니다. 네트워크 통신시에 엔디언을 하나로 통합한 이유는 엔디언이 다른 두 컴퓨터가 네트워크 상에서 데이터를 송수신할때 서로 데이터를 다르게 해석하는것을 막기 위해서 입니다!
💡 추가적으로 알면 좋은 바이 엔디언(Bi-endian)
몇몇 아키텍처는 빅 엔디언과 리틀 엔디언 중 하나를 선택할 수 있도록 설계되어 있고, 이를 바이 엔디언이라고 부릅니다.
[ARM, PowerPC, DEC 알파, MIPS, PA-RISC, IA-64 등 에서 사용하는 바이트 오더링]
⭐️ 문자열은 어떻게 저장하나요?
문자열은 엔디언의 방식과 상관없이 모두 빅 엔디언 형식으로 저장됩니다.
[빅 엔디언] Hello -> 0x48(H) 0x65(e) 0x6C(l) 0x6C(l) 0x6F(o)
[리틀 엔디언] Hello -> 0x48(H) 0x65(e) 0x6C(l) 0x6C(l) 0x6F(o)
🙋 저는 정보보안을 공부하는 학생입니다!
- 본 포스팅에서 다루는 모든 내용은 학습한 내용을 정리해둔것이기 때문에 오류가 있을 수 있습니다
- 오류나 기타 지적사항이 있으시다면 댓글로 말씀해주시면 공부에 더 많은 도움이 됩니다!
블로그의 정보
남쪽의 외딴섬
월루