본문 바로가기

Security/Malware Analysis

[정리] 리틀, 빅 엔디언

안녕하세요. 

칸입니다.


오늘은 저번에 말씀드렸듯이 리틀엔디언과 빅엔디언에 대해

정리해보도록 하겠습니다.



(2017.01.06)

0. 들어가기에 앞서..


저 또한 배우는 입장이라 제가 작성한 글이 100% 맞는 것은 아닙니다. [정리]가 붙어있는 글들은 제가 공부한 내용을 정리할 겸 올리는 글입니다. 참고해주세요. 또한 본문에 활용되는 대부분의 예제는 '리버싱핵심원리', 이승원 저자, 인사이트 를 참고했음을 밝힙니다.




1. 바이트 오더링(Byte Ordering)


바이트 오더링이란 쉽게 생각해서 데이터를 저장하는 방식을 말합니다. 바이트 오더링 방식에는 크게 2가지가 있습니다. 그 2가지는 바로 오늘 알아볼 빅엔디언(Big Endian) 리틀 엔디언(Little Endian) 방식입니다.




[그림 1.1]


[그림 1.1]을 보면 총 4개의 크기가 다른 자료형이 있습니다. 이를 각 엔디언 방식에 따라서 데이터를 어떤식으로 저장하는지 알아보겠습니다. 




[표 1.1]


※ 참고

'a'의 ASCII code는 0x61, NULL 문자의 ASCII code는 0x00


[표1.1]을 자세히 보면 BYTE 타입의 변수 b를 저장할때에는 차이가 없지만 Size가 2바이트 이상인 자료형의 경우 두 표기법에 차이가 나기 시작합니다. 


빅엔디언 방식은 데이터를 저장할 때 사람이 보는 방식과 동일하게, 리틀 엔디언 방식은 역순으로 데이터를 저장합니다. 즉, 저장되는 바이트의 순서가 뒤집어져 있습니다. 


쉽게 생각해서

빅 엔디언 : 메모리의 0에서부터 끝까지

리틀 엔디언 : 메모리의 끝에서부터 0까지

라고 생각하시면 됩니다.


마지막으로 기억해야 할 것은 str 문자열은 Endian 형식에 상관없이 동일합니다. 그 이유는 문자열이란 결국 char(캐릭터) 배열이기 때문에 각 바이트를 하나씩 연속해서 저장한다고 생각해보면 리틀 엔디언에서도 문자열 자체는 빅 엔디언과 동일한 순서로 저장되는 것이죠.






2. 빅 엔디언과 리틀엔디언



2.1 빅 & 리틀 엔디언의 장단점 


빅 엔디언의 경우 데이터를 순서대로 저장하기 때문에 사람이 보기에는 직관적이라는 장점이 있습니다. 리틀엔디언의 경우 산술 연산과 데이터의 타입이 확장/축소 될 때 효율적이라는 장점이 있습니다.

-> 참고 : http://genesis8.tistory.com/37



참고로 빅 엔디언은 대형 유닉스 서버에 사용되는 RISC 계열의 Cpu에서 많이 사용되고 네트워크 프로토콜에서도 빅 엔디언이 사용됩니다.


이 사실은 앞으로 리버스 엔지니어링을 공부하려는 저희에게 중요한 의미를 가지게 됩니다. 그것은 바로 애플리케이션 개발에 사용된 데이터를 네트워크로 송수신 할때 엔디언 타입을 변경해줘야 하기 때문입니다. 


또한 바이트 오더링이 빅 엔디언만 사용한다면 문제가 없겠지만 Intel x86 Cpu에서 리틀 엔디언 방식을 사용하기 때문에 windows 계열 리버서가 되려면 결국 리틀 엔디언에 대해 잘 알 필요가 있습니다.



2.2 Ollydbg에서 리틀엔디언 확인하기


Ollydbg에서 확인해보기 위해 [그림1.1]에  코드 몇줄을 더 추가해보았습니다.


[그림 1.2]


[그림 1.2] 위 코드를 OllyDbg로 디버깅 한뒤 OllyDbg 데이터 창에서 리틀 엔디언 방식으로 저장이 되어있는지 확인을 해봅니다.




[그림 1.3]


char 타입을 제외한 Byte, Word, Dword 타입의 경우 '메모리의 끝에서부터 0까지' 즉, 리틀 엔디언 형식으로 저장된 것을 확인 할 수 있습니다.






3. 마치면서...



다음에는 IA-32 레지스터와 스택에 대해 정리 해보도록 하겠습니다.

읽어주셔서 감사합니다. 



'Security > Malware Analysis' 카테고리의 다른 글

[정리] 스택  (0) 2018.03.07
[정리] IA-32 레지스터  (0) 2018.03.07
[정리] 어셈블리어 정리  (0) 2018.03.07