안녕들 하시죠 !
오늘은 컴퓨터 메모리를 저장하는 방식 ( 바이트 오더링 ) 에 대해 알아보겠습니다.
앞으로 리버싱 공부를 하는데 기초가 되는 중요한 부분이라고 합니다.
학교다닐때 컴퓨터 구조 시간에 배웠던 내용인데 하나도 기억이 안나서 다시 공부해보려고 합니다.
바이트 오더링에는 크게 두가지 방식이 있는데요.
빅 엔디언 과 리틀 엔디언 입니다.
우리가 앞으로 자주 사용할 방식은 리틀 엔디언 이라고 합니다.
아래에 간단한 예제를 통해 빅 엔디언 과 리틀 엔디언의 차이를 알아보려고 합니다.
BYTE b = 0x12;
WORD w = 0x1234;
DWORD dw = 0x12345678;
char str[] = "abcde";
첫번째 줄을 보시면 타입은 BYTE, 이름은 b, 사이즈는 1, 빅 엔디언 = [12], 리틀 엔디언 = [12] 로 표현됩니다.
여기에선 차이가 없지만 2바이트 이상을 표현할때 부터 달라집니다.
두번째 줄을 보시면 타입은 WORD, 이름은 w, 사이즈는 2, 빅 엔디언 = [12][34], 리틀 엔디언 = [34][12] 로 표현됩니다.
빅 엔디언 방식은 데이터를 사람이 앞에서부터 글을 읽는 방식으로 저장합니다.
리틀 엔디언 방식은 데이터를 역순으로 저장합니다. 저장되는 바이트의 순서가 뒤집어져 있는 것 입니다.
네번째 줄의 str 문자열은 엔디언 형식에 관계 없이 저장 순서가 동일한데요.
문자열이란 char 배열이기 때문에 각 바이트를 하나씩 연속해서 저장해 나가기 때문입니다.
빅 엔디언 과 리틀 엔디언 둘 다 [61][62][63][64][65][00] 으로 저장이 되는데 맨 뒤에있는 [00]은 문자열의 마지막에 항상 들어가는 NULL값 입니다.
( 아스키 문자 ' a ' 는 0x61, ' e '는 0x65 입니다. )
빅 엔디언은 사람이 숫자를 읽고 쓰는 방법과 같기 때문에 메모리 값을 보기 편하고, 소프트웨어의 디버그를 편하게 해 주는 경향이 있습니다.
리틀 엔디언은 Intel x86 CPU에서 사용하는 방식이고 산술 연산과 데이터의 타입이 확장/축소될 때 더 효율적인 장점이 있습니다.
오늘은 여기까지입니다 감사합니다 !
참고서적 이승원 「리버싱 핵심원리」 인사이트(2018) p49~52
'보안 > Reversing' 카테고리의 다른 글
abex' crackme #1 (0) | 2018.10.27 |
---|---|
IA-32 Register / 범용 레지스터 (0) | 2018.10.25 |
문자열 패치 두번째 《 다른 메모리 영역에 새로운 문자열을 생성하여 전달 》 (0) | 2018.10.22 |
문자열 패치 첫번째 《 문자열 버퍼를 직접 수정 》 (0) | 2018.10.22 |
베이스캠프를 지정하는 4가지 방법 (0) | 2018.10.22 |