Busan IT/Assembly2015. 10. 20. 09:35

==================================Outline====================================

코드/데이터/스택 영역 설정

load, clear

----------------------------------------------------------------------------

 

코드/데이터/스택 영역 설정

 

동적 할당을 받은 영역에 코드영역, 데이터영역, 스택영역을 설정 해주자.

 

코드 영역은 헥사 값으로 뒤의 4자리가 ‘0’으로 채워져 있어야 한다. 이를 위한 마스크 설정을 해주자.

 

#define MASK_CODE 0xFFFF0000

#define MAX_PRG_SIZE (64*1024)

#define MEM_SIZE (MAX_PRG_SIZE*2)

 

vpCode = (void *)( ( ((int)vpMem_start) & (MASK_CODE) )+MAX_PRG_SIZE);

 

프로그램 사이즈를 더해준 이유는 마스크 코드를 적용할 시 뒤에 4자리가 삭제되기 때문이다.

뒤에 네 자리는 0xFFFF - 0x0000까지 가능한데 이 값을 복구시켜주기 위해 프로그램 사이즈를 더해준다. 처음에 동적할당을 받을 때 'MEM_SIZE' , 프로그램 사이즈의 2배임으로 동적할당을 받은 영역 내에서 프로그램이 존재하게 된다.

 

데이터영역은 코드영역에서 헥사 값으로 2000떨어진 곳에 존재한다.

 

vpData = (void *)((int)vpCode + 0x2000);

 

스택 값은 끝에서부터 시작된다. 이것을 헥사뷰로 16줄을 출력시키기 위해 다음과 같은 코딩을 한다.

 

vpStack = (void *)( (int)vpMem_end - (16 * 16)+1);

 

load, clear

 

각 영역이 올바른 주소 값으로 설정되어 있는지 출력해본다. 올바르게 나온다면 각 영역에 값을 저장할 'load'명령어와 해당 영역을 ‘0’으로 채워주는 'mc'(memory clear) 함수를 만들어준다.

 

void load()

{

memset(vpCode, 0xFF, 16*16);

memset(vpData, 0xEE, 16*16);

memset(vpStack, 0xDD, 16*16);

 

return;

}

 

void memory_clear()

{

memset(vpMem_start, 0, MEM_SIZE);

}




/*** Code ***/

#include <stdio.h>

/*  사용자 정의  */
#define CMD_SIZE   20
#define  MAX_PRG_SIZE  (64*1024)
#define  MEM_SIZE   (MAX_PRG_SIZE*2)
#define  MASK_CODE  0xFFFF0000
typedef struct
{
  unsigned int efl;
  unsigned int eip;
  unsigned int edi;
  unsigned int esi;
  unsigned int ebp;
  unsigned int esp;
  unsigned int ebx;
  unsigned int edx;
  unsigned int ecx;
  unsigned int eax;
  
}context;

typedef struct
{
  char * cpCmd;
  void (*fp)();  
}comm;

/*   전역 변수  */
static context stOld_state;
extern void stst(context *);
extern void ldst(context *);
void * vpMem_start;
void * vpMem_end;
void print_addr();
void * vpCode;
void * vpData;
void * vpStack;

/*  함수 원형  */
void print_r();
void print_help();
void memory_clear();
void quit();
void view_code();
void view_data();
void view_stack();
void load();


void hexaview(void *, unsigned int);

comm stCmd_Map[] ={  //메세지 맵 기법
         {
        "R", print_r
         },
      {
        "H", print_help
      },
      {  
        "MC", memory_clear      
      },
      {  
        "Q", quit
      },
      {
        "QUIT", quit 
      },
      {
        "P", print_addr
      },        
      {
        "CODE", view_code
      },
      {
        "DATA", view_data
      },
      {
        "STACK", view_stack
      },
      {
        "LOAD", load
      },
         {
        00
         }        
      };
int main(void)
{
  char cInput[CMD_SIZE];
  comm * stpCmd;
  int iRet;  
  
  vpMem_start = (void *)malloc(MEM_SIZE);
  if(0==vpMem_start)
  {
    return -1;
  }
  vpCode = (void *)( ( ((int)vpMem_start) & (MASK_CODE) )+MAX_PRG_SIZE);
  vpData = (void *)((int)vpCode + 0x2000);   
  vpMem_end = (void *)( (int)vpMem_start + MEM_SIZE - 1 );    
  vpStack = (void *)( (int)vpMem_end - (16 * 16)+1);
  
  stst(&stOld_state);  
  printf("Moniter Program Start\n");
  while(1)
  {
    putchar('>');    
    iRet = read(0, cInput, CMD_SIZE);
    if(iRet < 2)
    {
      continue;  
    }    
    cInput[iRet-1= 0;    
    strupr(cInput);
    
    stpCmd = stCmd_Map;
    while(0 != (stpCmd->fp))
    {
      if(0 == strcmp(strupr(cInput), stpCmd->cpCmd))
      {
        break;
      }      
      ++stpCmd;
    }
    if(0!= (stpCmd->fp))
    {
      ((stpCmd->fp)());      
      
    }
    else
    {
      print_help();
    }    
  }
  return 0;
}
void print_r()
{
  printf("main    : %08X\n", main);
  printf("stOld_state  : %08X\n\n"&stOld_state);
  printf("EAX = %08X  EBX = %08X\nECX = %08X  EDX = %08X\nESI = %08X  EDI = %08X\nEBP = %08X  ESP = %08X\nEIP = %08X  EFL = %08X\n\n",stOld_state.eax, stOld_state.ebx, stOld_state.ecx, stOld_state.edx, stOld_state.esi, stOld_state.edi, stOld_state.ebp, stOld_state.esp, stOld_state.eip, stOld_state.efl);

}
void print_help()
{
  printf("Memory Debugging Prompt\n\n");
  printf("R: Print Register Info.\n");
  printf("H: Print Command List\n");    
  printf("H: Clear Momory\n");    
  printf("P: Print Memory\n");
}
void memory_clear()
{  
  memset(vpMem_start, 0, MEM_SIZE);  
}
void print_addr()
{
  printf("Code Start Address    : 0x%08X\n", vpCode);  
  printf("Dynamic Memory Area    : 0x%08X - 0x%08X [128Byte]\n", vpMem_end, vpMem_start);
}
void quit()
{
  free(vpMem_start);
  exit(0);
}
void view_code()
{
  hexaview(vpCode, 16*16);

  return;
}

void view_data()
{
  hexaview(vpData, 16*16);

  return;
}
void view_stack()
{
  hexaview(vpStack, 16*16);

  return;
}
void load()
{
  memset(vpCode, 0xFF, 16*16);
  memset(vpData, 0xEE, 16*16);
  memset(vpStack, 0xDD, 16*16);

  return;
}


void hexaview(void * vP, unsigned int uiLen)
{
  unsigned int uiCnt;
  unsigned int uiLine;

  printf("===============================================================================\n");
  printf("  Address      Hexa           ASCII       \n"); 
  printf("-------------------------------------------------------------------------------\n");
  for (uiLine = 0; uiLine <  uiLen; uiLine += 16)
  {
    printf(" %08X  ", vP);
  
    for(uiCnt=0; uiCnt<16; ++uiCnt)
    {
      printf("%02X ", *((unsigned char *)vP));
      vP = (char *)vP + 1;
    }
    vP = (char *)vP - 16;
    putchar(' ');

    for(uiCnt=0; uiCnt<16; ++uiCnt)
    {
      if (32 > *((unsigned char *)vP))
      {
        putchar('.');
      }    
      else if(127 < *((unsigned char *)vP))
      {
        putchar('.');
      }
      else
      {        
        printf("%1c", *((unsigned char *)vP));
      }

      vP = (char *)vP + 1;
    }
    putchar('\n');
  }
  return;
}


 

 

 

 

반응형
Posted by newind2000