본문으로 바로가기

리틀 엔디언 & 빅 엔디언

category Study/reversing 2017. 8. 24. 03:09



디버거를 사용하다보면 덤프창에서 의문점이 생길 수 있다.



위와 같이 402030이라는 주소에 16진수 12345678을 넣으라는 명령을 수행하도록 해보자


현재 덤프창에는 아무 값도 들어있지 않은 상태이다




이제 실행해보면 아래와 같은 결과가 나온다

 



12345678이 들어가야 하는데 78 56 34 12 이렇게 들어가 버렸다


이게 어떻게 된 일일까?




여기서 나오는 개념이 리틀 엔디언과 빅 엔디언이다







엔디언(Endianness)이란?


1차원 공간에 여러개의 연속된 대상을 배열하는 방법을 뜻하며

크게 큰 단위가 앞으로 오는 빅 엔디언과 작은 단위가 앞으로 오는 리틀 엔디언으로 나눌 수 있다

네트워크 프로토콜은 빅 엔디언을 따르므로 리틀 엔디언을 사용하는 환경에서는 이러한 방식을 잘 맞추어주어야 한다


16진수 1234를 예로 들어보자


1234를 바이너리(2진수)로 바꿔보면 1001000110100 이 되고, 이를 저장할 때

빅 엔디언의 경우 1001000110100 순으로 저장이 되고,

리틀 엔디언의 경우 반대로 0010110001001 순으로 저장이 된다


즉, 빅 엔디언은 맨 앞에서부터 저장이 되고 리틀엔디언은 맨 뒤에서부터 저장이 된다고 볼 수 있다




                      


위키백과에서는 위와같은 그림으로 쉽게 설명하고 있다







그렇다면 디버거에서 저런 현상이 발생하는 이유는 무엇일까?


그 이유는 해당 컴퓨터가 리틀엔디안 방식으로 데이터를 저장했기 때문이다


16진수 12345678을 저장하는 과정을 살펴보자




12345678은 2진수로 0001 0010 0011 0100 0101 0110 0111 1000이 된다


이것을 리틀 엔디언 방식으로 저장해보면 아래와 같다


0001 1110 0110 1010 0010 1100 0100 1000


완전히 반대로 뒤집어 놓은것과 같음을 알 수 있다


이를 한 바이트(1byte = 8bit) 씩 끊어보면 아래와 같아진다


0001 1110  |  0110 1010  |  0010 1100  |  0100 1000


컴퓨터가 읽을때는 저장할때와 같이 뒤집어서 읽으므로 한 바이트씩 뒤집어보자


0111 1000  |  0101 0110  |  0011 0100  |  0001 0010


이제 16진수로 바꿔보자


7 8  |  5 6  |  3 4  |  1 2




결국 이러한 결과가 나오는 것이다








'Study > reversing' 카테고리의 다른 글

브레이크 포인트(Break Point)를 알아보자  (0) 2017.08.24
API  (0) 2017.08.24
Hello 출력결과 바꿔보기  (0) 2017.08.22
어셈블리어 명령어에 대해 알아보자  (0) 2017.08.22
레지스터에 대해 알아보자  (0) 2017.08.21