보안세상

리틀엔디언이란? 그리고 빅엔디언은? 본문

공부/리버싱

리틀엔디언이란? 그리고 빅엔디언은?

똔민 2017. 3. 6. 02:33
반응형

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


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




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




※ 참고

'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에서 확인해보기 위해\에  코드 몇줄을 더 추가해보았습니다.



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




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

[출처] [정리] 리틀엔디언|작성자 


반응형

'공부 > 리버싱' 카테고리의 다른 글

어셈블리어 정리  (0) 2017.03.06
Comments