본문 바로가기

리버싱 개인 공부/[리버싱핵심원리]

[리버싱핵심원리] 리틀 엔디언 표기법

컴퓨터에서 메모리에 데이터를 저장하는 방식을 의미하는 비이트 오더링(Byte Ordering)에는 리틀 엔디언 표기법빅 엔디언 표기법이 있다.

 

바이트 오더링

TYPE Name SIZE 빅 엔디언 Style 리틀 엔디언 Style
BYTE b 1 [12] [12]
WORD w 2 [12][34] [34][12]
DWORD dw 4 [12][34][56][78] [78][56][34][12]
char [] str 6 [61][62][63][64][65][00] [61][62][63][64][65][00]

빅 엔디언과 리틀 엔디언의 차이점

  • BYTE B변수를 저장 할 때는 두 방식의 차이가 없습니다. (2BYTE 이상부터 차이가 있음)
  • 빅 엔디언은 사람이 보는 방식과 동일하게 앞에서부터 순차적으로 저장하고, 리틀 엔디언 방식은 역순으로 저장합니다.
  • 예외로 문자열의 경우 엔디엔 형식에 상관없이 동일하게 저장됩니다.(캐릭터 배열이기 때문에 각 바이트를 하나씩 연속해서 저장한다고 생각하면 됩니다.)

빅 엔디엔

→ 사람이 보기 직관적

→ 대형 UNIX 서버에 시용되는 RISC 계열의 CPU에서 많이 시용됨.

→ 네트워크 프로토콜에 빅 엔디언이 사용됨.

 

리틀 엔디엔

→ 데이터를 역순으로 저장(문자열의 경우 엔디엔 형식에 상관없이 동일하게 저장)

→ 산술 연산과 데이터의 타입이 확장/축소될 때 더 효율적

 

OllyDbg에세 리틀엔디엔 확인

LittleEndian.cpp

위 cpp 파일을 빌드하여 LittleEndian.exe를 생성한뒤 OllyDbg에서 디버깅을 해봤다.

GO to 명령(Ctrl+G)을 401000 주소로 가보면

main() 함수의 주소는 401000인걸 알 수 있습니다.

전역 변수들의 주소는 b,w,dw,str 전역변수의 주소를 알 수 있다.

b의 전역 변수 : 40AC40

w의 전역 변수 : 40AC44

dw의 전역 변수 : 40AC48

str의 전역 벽수 : 40AC4C

전역 변수를 확인 했으니 DUMP 영역에서 변수 저장이 어떻게 변했는지 알아보기 위해서

DUMP 영역에서 40AC40 주소로 가보면

변수 w는 34 12, dw는 78 56 34 12 로 저장 된 것을 볼 수 있는데 데이터가 역순을 저장 된 것을 알 수 있다.(리틀 엔디엔 형식)