지난 포스팅에서는 Helloword 프로그램을 분석해보면서 메인함수를 찾아보고,

메세지박스의 값을 변조하는 메모리 변조방법에 대해 알아보았습니다. 

 

이번 포스팅에서는 디버깅의 기초개념을  사용되는 바이트 오더링에 대해서 알아보도록 하겠습니다. 

 

Byte Odering? 

컴퓨터가 데이터를 저장하는 방식으로 리틀엔디언과 빅엔디언으로 나뉘게 됩니다. 

저장되는 방식은 아래의 표와 같습니다.

Type Name Size Big Endian Little Endian
Byte a 1 [12] [12]
WORD b 2 [12][34] [34][12]
DWORD ab 4 [12][34][56][78] [78][56][34][12]
char[] str 4 [12] [12] [12][00] [12] [12] [12][00]

 

정리를 해보면 다음과 같습니다.

 

Little Endian -> 데이터를 역순으로 저장 (역방향)

- 직관적이지 않음 (사람이 보기 힘듬)  / 데이터를 효울적으로 저장 / Windows에서 사용됨

 

Big Endian -> 데이터를 순차적으로 저장 (정방향)

- 사람에게 직관적  / Windows intel 에서 사용하지 않음 / 서버용 CPU에서 사용됨 

 

하지만 여기서도 예외는 존재하는데요, 보시면 byte와 char부분은 리틀엔디언과 빅엔디언이 일치합니다.

이것은 멀티바이트만 리틀엔디언이 적용된다는 말이됩니다.

 

윈도우에서는 리틀엔디언 방식을 사용하기 때문에 리틀엔디언 방식이 사용되는지 한번 확인해보겠습니다.

확인을 해보기 위해서 아래와 같은 코드를 작성하였습니다.

#include<windows.h>
#include<stdio.h>

BYTE a = 0X12;
WORD b = 0x1234;
DWORD ab = 0x12345678;
char str[] = "abcde";

int main(void)
{
	BYTE lb = a;
	WORD lw = b;
 	DWORD lwd = ab;
 	char* lstr = str;
 	printf("리틀엔디언 저장방식");
    
    while(TRUE){}
    
    return 0;
}

 

이제 해당 프로그램을 분석 해보겠습니다. 먼저, 디버거를 열어서 확인해 보았습니다.

 

저번처럼 일일히 분석해도 되지만 그것은 간단한 프로그램일 경우 가능한것이고 (물론 지금도 가능하긴합니다)

프로그램들의 로직이 복잡해지면 하나씩 분석하기가 힘들어질 것입니다. 그래서 중단점 (Break Point)를 활용하였습니다. 

일단 프로그램이 실행이 되어야 하기때문에 Main 함수로 이동하는 코드가 있을것 입니다.

 

생각했던것 처럼, 프로그램이 실행되는 부분으로 이동하는 코드에 BP가 설정되어있었습니다. 내부로 들어가보겠습니다.

 

함수이름이 jmp MainStartup이라고 되어있는것으로 봐서 메인함수를 시작하는 곳으로 점프하는 구문인것 같습니다.

.

들어가보면 Main 함수로 추정되는 곳이 보입니다. 한번 더 들어가서 확인해 보겠습니다.

 

한번 더 들어가보니 Main 함수를 호출하는부분이 또 보입니다.  더 들어가서 확인해 봐야할 것 같습니다.

 

계속 들어가서 확인해보니 드디어 찾고있던 Main 함수 부분에 도달한 것 같습니다. 

 

이렇게 프로그램도 정상적으로 작동하는 것을 확인했습니다. 

그리고 BP를 걸고 메인함수의 어셈블리 코드를 보면서 분석을 해보겠습니다. 

 

바로 이부분인데,  C언어로 작성한 코드를 생각하면 여기에 작성한 소스코드에 따라서 특정한 주소에 값들이 들어가

있을것입니다. 한번 저장된 값들을 확인해보겠습니다.

 

0x00007FF7EC21C000 주소에 BYTE의 값이 들어가 있는것 같습니다. 확인해보도록 합시다.

ctrl +G로 주소에 저장된 값을 검색해 보았습니다.

 

검색을 해보면....

 

검색을해서 찾아보니 정확하게 값이 코드에서 작성한 값이랑 동일하게 들어간 것을 확인할 수 있었습니다.

그리고 리틀엔디언은 멀티바이트만 역순으로 저장을 한다고 하였습니다.

byte의 값인 12와 문자열의 값인 abcde는 그대로 순차적으로 저장이되었습니다.

그리고 나머지 값들은 역순으로 저장이되어 있는데, 리틀엔디안 방식으로 저장된 것을 확인할 수 있었습니다.

 

이번에는 이렇게 바이트 오더링에 대해서 공부해보았습니다. 

다음 포스팅에서는 레지스터와 스택에대해서 한번 알아보도록 하겠습니다.

+ Recent posts