안녕하세요.
칸입니다.
오늘은 저번에 말씀드렸듯이 리틀엔디언과 빅엔디언에 대해
정리해보도록 하겠습니다.
(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 |