컴퓨터에서 메모리에 데이터를 저장하는 방식을 의미하는 비이트 오더링(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에세 리틀엔디엔 확인

위 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 로 저장 된 것을 볼 수 있는데 데이터가 역순을 저장 된 것을 알 수 있다.(리틀 엔디엔 형식)
'리버싱 개인 공부 > [리버싱핵심원리]' 카테고리의 다른 글
| [리버싱핵심원리] 스택프레임 (1) | 2023.11.20 |
|---|---|
| [리버싱핵심원리] abex' crackme (0) | 2023.09.26 |
| [리버싱핵심원리] 스택 (0) | 2023.09.26 |