1. test.cpp의 코드 내용

 

2. test.cpp의 어셈블리어

 

 

3. test.cpp문자형

4. 위의 코드 어셈블리어

 

MOV EAX,DWORD PTR DS:[405030]   //데이터의 값을 레지스터인 EAX에 저장

 

리틀앤디안 식으로 저장

 

MOV DWORD PTR SS:[EBP-8],EAX     //EAX레지스터 값을 스택에 저장

DWORD PTR SS:[EBP-8]가 배열의 시작주소

 

MOV ECX,DWORD PTR DS:[405034]  //405034데이터의 값을 ECX에 저장

MOV DWORD PTR SS:[EBP-4],ECX     //ECX레지스터의 값을 스택에 저장

char str1[] = "Reverse";

MOV EDX,DWORD PTR DS:[405038]  //405038데이터의 값을 EDX에 저장

MOV DWORD PTR SS:[EBP-18],EDX   //EDX레지스터의 값을 스택에 저장

MOV EAX,DWORD PTR DS:[40503C]    //40503C데이터의 값을 EAX에 저장

MOV DWORD PTR SS:[EBP-14],EAX      //EAX의 값을 스택에 저장

MOV ECX,DWORD PTR DS:[405040]    //405040데이터의 값을 ECX에 저장

MOV DWORD PTR SS:[EBP-10],ECX   //ECX의 값을 스택에 저장

char str2[] = "Enginerring";

XOR EDX,EDX       

 //null문자 생성       char str2[16] = "Engineering" 즉,[16]이라는  공간을 지정한후 남은 바이트를 null==0으로채운다.

MOV DWORD PTR SS:[EBP-C],EDX   //null문자를 스택에 저장

char str2[16] = "Engineering";

 

 

5. test.cpp 포인터

6. 어셈블리어

 

 

 

PUSH ESI

PUSH EDI

ESI와 EDI를 백업하기 위해 저장

 

 

MOV ESI,405030  //출발지 주소를 저장 즉  Reverse Engineering값을 넣기 위해 저장

 

LEA EDI,DWORD PTR SS:[EBP-1C]     //EBP-1C의 결과를 EDI에 저장

0012FF80 - 1C의 결과를 EDI에저장

REP 는 ECX의 값만큼 반복한다.

REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]

ES:[EDI] == 스택 주소 

DS:[ESI] == 데이터 주소

ESI가 가진 4바이트 데이터를 EDI에 저장     // 이작업을 5번동안 한다.

 

여기까지가 char str[]="Reverse Engineering";

XOR EAX,EAX

MOV DWORD PTR SS:[EBP-8],EAX

이 두문장을 통해서   첨자가 있는 배열임을 알게된다. 

여기까지가 char str[24]="Reverse Engineering";
값이 들어가있는 스택 형태

LEA ECX,DWORD PTR SS:[EBP-1C]     //EBP -1C 의값을 ECX에 저장

배열의 시작주소가 저장된다.

MOV DWORD PTR SS:[EBP-4],ECX        //ECX의 주소를 EBP-4에 저장

char * p = str;

 

MOV EDX,DWORD PTR SS:[EBP-4]      //EBP-4의 값을 EDX에 저장

MOVSX EAX,BYTE PTR DS:[EDX+5]   

//EDX값에 5를 더한다. 그값을 EAX에 저장  MOV연산자에 [ ]가 있을 시 포인터 이다.

//0012FF64 + 5  == 0012FF69  ==EAX == 0012FF69

*(p+5)

MOV DWORD PTR SS:[EBP-20],EAX        //0012FF69에 있는 데이터 1바이트를 저장

int n = *(p+5);

 

 

7. 구조체 코드

 

 

8. 어셈블리어

SUB ESP,0C    

지역변수가 12바이트이다.

 

MOV DWORD PTR SS:[EBP-C],0A   

int n1 =10;

MOV DWORD PTR SS:[EBP-8],14

int n2 = 20;

 

같은 공간을 쓰는 것을 의미하므로, 아래 문장을 통해 구조체인 것을 알 수있다. 

MOV BYTE PTR SS:[EBP-4],61

char ch1 = 0x61;

MOV BYTE PTR SS:[EBP-3],41

char ch2 = 0x41;

 

 

+ Recent posts