2014. 1. 9. 17:12 :: 리버싱

안녕하세요.

오늘은 컴퓨터에서 메모리에 데이터를 저장하는 방식을 의미하는

바이트 오더링(Byte-Ordering)의 엔디언 표기법에 대해서 공부하겠습니다.

 

크게 두가지 리틀 엔디언(Little Endian)빅 엔디언(Big Endian)이 있습니다.

 

 

1. 바이트 오더링

 

  바이트 오더링이란 데이터를 저장하는 방식입니다. 애플리케이션의 디버깅을 할 때 알아두어야 하는 기본 개념중 하나입니다. 이 안에 리틀 엔디언, 빅 엔디언 두가지 방식이 있습니다.

 

예제 코드입니다.

 

총 4개의 서로 크기가 다른 자료형이 있습니다.

아래의 표는 위에서 말한 두가지 엔디언 방식에 따라서 같은 데이터를 각각 어떻게 저장했는지 나타내는 표입니다.

TYPE

Name 

SIZE 

빅 엔디언 스타일 

리틀 엔디언 스타일 

BYTE 

[12] 

[12] 

WORD 

[12][34] 

[34][12] 

DWORD 

dw 

[12][34][56][78] 

[78][56][34][12] 

char [] 

str 

[61][62][63][64][65][00] 

 [61][62][63][64][65][00] 

(참고 : ASCII 문자 'a'는 0x61, 'e'는 0x65와 같습니다. 그리고 문자열 마지막은 NULL로 끝납니다. 0x는 16진수의 표시입니다.)

 

위에 예제 코드와 표에 WORD, DWORD 타입으로 보시면 빅 엔디언 스타일은 앞에서부터 순차적으로 저장을 합니다.

하지만 리틀 엔디언 스타일역순으로 저장을 합니다.

 

그리고 역순으로 저장하는 리틀 엔디언도 바이트 자체는 정상적인 순서로 저장이 됩니다. 2byte, 4byte의 자료형과 같이 멀티바이트인 경우 각 바이트가 역순으로 저장되는 것입니다.

(멀티바이트 : a,b,c(1byte)와 같이 아스키코드로만 문자를 다 표현할 수 없어 아스키코드에 다른 문자(2byte)를 포함한 문자 집합)

 

또한 str 문자열은 엔디언 형식에 상관없이 동일하게 저장됩니다.

그 이유는 문자열은 결국 캐릭터(char)배열이기 때문에 각 바이트를 하나씩 연속해서 저장한다고 생각해보면 리틀 엔디언에서도 순차적으로 저장이 되기 때문에 동일합니다.

 

 

2. 빅 엔디언

 

  데이터를 순차적으로 저장하는 방식입니다. 빅 엔디언의 장점은 사람이 보기에 직관적이다. 그리고 빅 엔디언은 대형 UNIX 서버에 사용되는 RISC 계열의 CPU에서 많이 사용됩니다. 또한 네트워크 프로토콜에 빅 엔디언이 사용됩니다. 이는 x86 계열의 응용 프로그램 개발자와 리버서에게 중요한 의미를 가지고 있습니다.이유는 애플리케이션 개발에 사용된 데이터를 네트워크로 송수신할 때 엔디언 타입을 변경해야 하기 때문입니다.

 

 

3. 리틀 엔디언

 

  데이터를 역순으로 저장하는 방식입니다. Intel x86 CPU에서 리틀 엔디언 방식을 사용합니다. 따라서 저희 같은 windows 계열 리버서들은 리틀 엔디언에 대해서 잘 알아야 합니다. 장점으로는 산술 연산과 데이터의 타입이 확장/축소될 때 더 효율적입니다.

 

 

4. 디버거 프로그램(OllyDbg)에서 리틀 엔디언 확인

 

예제 코드

 

위에 예제 코드를 Visual C++에서 빌드하여 LittleEndian.exe 실행 파일을 만들어 OllyDbg로 디버깅 후 변수들이 저장된 모습의 사진입니다. 

 

바로 위 사진에서 보시면 더 위쪽에 빅 엔디언과 리틀 엔디언 방식을 비교해둔 표 처럼 리틀 엔디언 방식처럼 역순으로 저장된 것을 확인할 수 있습니다.

 

 

 

위에서 말씀 드렸듯이 windows 계열에서 리버싱을 하는 저희 같은 리버서들은 리틀 엔디언을 잘 알아야 합니다. windows 기반이 모두 리틀 엔디언 방식으로 저장 되어 있으니까요.

 

 

참고서적 : 리버싱 핵심 원리 / 저자 : 이승원

 

':: 리버싱' 카테고리의 다른 글

Red_Seek :: 스택 프레임  (0) 2014.01.29
[Red_Seek] abex' crackme #1 (크랙미 #1)  (0) 2014.01.23
[Red_Seek] 스택  (0) 2014.01.22
[Red_Seek] IA-32 Register  (0) 2014.01.14
[Red_Seek] 리버싱(Reversing) 이란?  (0) 2014.01.08
posted by Red_Seek