성엽이
KKIMSSI
성엽이
전체 방문자
오늘
어제
  • 분류 전체보기 (454)
    • :) (2)
    • C프로그래밍이론 (9)
    • C++프로그래밍 (64)
      • STL (1)
    • C# (2)
    • Visual studio 10.0 (9)
    • AT91SAM7S256 (21)
    • 논리회로 (14)
    • AVR2560 (11)
    • TCPIP (16)
    • NetWork (4)
      • Ubuntu Linux (2)
    • Assembly (21)
    • UNIX 프로그래밍 (6)
    • RFID 분석 (1)
    • Win32 API (7)
    • Cortex-M3 (4)
    • Unity (91)
    • Flutter (9)
    • OwnProject (11)
      • It's mine (5)
      • 마인드스톰 실습 (1)
      • 보고서 자료 (2)
      • RPi B+ (2)
    • ETC (25)
      • 상식 (3)
    • MFC (40)
    • PostgeSQL (18)
    • 영상제어 (6)
      • VFW_영상처리 (1)
    • Python (0)
    • Java (30)
      • SpringBoot (2)
      • Javascript (1)
      • JSP (13)
      • Spring (8)
    • Oracle (4)
      • SQL (3)
    • HTML (6)
      • Thymeleaf (1)
      • CSS (1)
      • Bootstrap (3)
    • IDE (1)
      • VS Code (1)
    • Android (2)
    • Privacy Policy (0)
    • MYSQL (2)
      • MariaDB (2)
    • AWS (5)
    • 개인공부 (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록
  • 관리자
  • 글쓰기

공지사항

인기 글

태그

  • MFC
  • ARM Reverse Engineering
  • Boot Code 분석
  • 문자열 나누기
  • WINAPI

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
성엽이

KKIMSSI

2013.09.25_ HexaView 응용해서 스택구조확인
Assembly

2013.09.25_ HexaView 응용해서 스택구조확인

2013. 9. 25. 19:18


 0925_MEMtoCPU.c Source

 #include <stdio.h>


typedef struct  _Context
{
  int  efl;
  int  eip;
  int  edi;
  int  esi;
  int  ebp;
  int  esp;
  int  ebx;
  int  edx;
  int  ecx;
  int  eax;
}CONTEXT;

void HexaView(unsigned char *, unsigned int);
void PrintReg(CONTEXT *);
void STST(CONTEXT *);
void LDST(CONTEXT *);

//int ASKY();      // 반환값 받기
unsigned char   MD(void *);  // Momory Display Function By Assembly
void     MM(void *, char);  // Momory Modify Function By Assembly


int main()
{
  int A = 0x12345678;
  CONTEXT  stpReg = {0,};

  //MD(&A) => 78을 반환해주기
  printf("A의 값 : %08x\n", A);
  printf("A의 주소 : %08x, 값 : %x\n", &A, MD(&A) );
  
  //MM(&A, 0xFF);  // => 78 자리에 FF 넣기
  MM(&A, 0xFF);
  printf("A의 주소 : %08x, A의 반환값 수정 : %08x\n",&A, A);
  
  HexaView((unsigned char *)&A , 159);   // 16개에 한줄씩이기때문에 159하면 맨마지막 하나만 출력이 안됨, 실행화면에서 확인가능

  //printf("%d\n", ASKY());  
  PrintReg(&stpReg);
  STST(&stpReg);
  PrintReg(&stpReg);
  getchar();

  LDST(&stpReg);  // STST로 가게해줌. while 문 역할
      // 메모리안에 있는 정보를 CPU 로 옮겨준다.

  printf("Kernel Panic\n");

  return 0;
}

void PrintReg(CONTEXT *stpReg)
{
  printf("------------------------------------------------\n");
  printf("EAX VALUE : 0x%08x   ECX VALUE : 0x%08x\n", stpReg->eax, stpReg->ecx);
  printf("EDX VALUE : 0x%08x   EBX VALUE : 0x%08x\n", stpReg->edx, stpReg->ebx);
  printf("ESP VALUE : 0x%08x   EBP VALUE : 0x%08x\n", stpReg->esp, stpReg->ebp);
  printf("ESI VALUE : 0x%08x   EDI VALUE : 0x%08x\n", stpReg->esi, stpReg->edi);
  printf("EIP VALUE : 0x%08x   EFL VALUE : 0x%08x\n", stpReg->eip, stpReg->efl);
}

void HexaView(unsigned char *ucP, unsigned int isize)
{
  int iCnt;
  int iloop;
  unsigned int iSizeNum;   // 출력하고 싶은 Byte 만큼 쓰기위해 갯수를 저장 

  iSizeNum = 0;
  
  printf("----------------------------------------"
     "----------------------------------\n");
  printf("Address  \t\t\tHexa\t\t\t      ASCII\n"); 
  printf("\t ");

  
  for(iCnt=0 ; iCnt <= 15 ; iCnt++)
  {
    printf("%02X ", iCnt);
  }

  putchar('\n');

  printf("----------------------------------------"
     "----------------------------------\n");
  
  if( 0 == isize%16 )
  {
    isize = isize / 16;  
  }
  else
  {
    iSizeNum = isize%16;
    isize = (isize/16);    
  }
  
  for(iloop=0; iloop < isize ; iloop++)
  {
    printf("%08X ", ucP); 
  
    for( iCnt=0 ; iCnt <= 15 ; iCnt++)
    {
      printf("%02X ", MD(ucP+iCnt));
    }
  
    for( iCnt=0 ; iCnt <= 15 ; iCnt++ )
    {
      if(0 == MD(ucP+iCnt))
      {
        printf(".");
      }
      else if( 32 > MD(ucP+iCnt))
      {
        printf(".");
      }
      else if( 127 < MD(ucP+iCnt))
      {
        printf(".");      
      }
      else
      {
        printf("%c", MD(ucP+iCnt)); 
      }
    }
  
    putchar('\n');
    ucP = ucP + 16;


  }

  if( iSizeNum != 0 )    // 출력하고 싶은 Byte 만큼만 출력하기 위해서 사용
  {
    printf("%08X ", ucP); 
  
    for( iCnt=0 ; iCnt <= iSizeNum-1 ; iCnt++)
    {
      printf("%02X ", MD(ucP+iCnt));
    }
    
    for( iCnt=0 ; iCnt <= 15-iSizeNum ; iCnt++ )
    {
      printf("   ");
    }    
    

    for( iCnt=0 ; iCnt <= iSizeNum ; iCnt++ )
    {
      if(0 == MD(ucP+iCnt))
      {
        printf(".");
      }
      else if( 32 > MD(ucP+iCnt))
      {
        printf(".");
      }
      else if( 127 < MD(ucP+iCnt))
      {
        printf(".");      
      }
      else
      {
        printf("%c", MD(ucP+iCnt)); 
      }
    }
  
    putchar('\n');

  }  
}



 0925_Monitor.asm 

 .386

.MODEL FLAT

PUBLIC  _STST  ; Store Status
PUBLIC  _LDST  ; Load Status
;PUBLIC  _ASKY  
PUBLIC  _MD
PUBLIC  _MM

.CODE

_STST  PROC  NEAR32

; Entry Code ) ------------------------------------
  PUSH  EBP   ; establish stack frame
  MOV  EBP,ESP
; -------------------------------------------------

;  PUSH EFL  
  pushfd

;  Trap Flag set 임의 제거
  mov  eax, [ebp-4]
  and  eax, 0FFFFFEFFh
  mov  [ebp-4], eax

;  &context 위치 가리킴
  mov  esp,  [ebp+8]

;  EAX 로 이동
  add  esp,  40

  pushad

;  EIP(return Address) 대입
  push  [ebp+4]

;  EFL 대입
  push  [ebp-4]

;   esp 위치 조정
  add  esp, 24
  mov  eax, ebp
  add  eax, 8
  push  eax
  
  push  [ebp]
  
; Exit Code ) ------------------------------------
  MOV  ESP,EBP ; restore ESP if local variables used
  POP  EBP   ; restore EBP
  RET     ; return
; ------------------------------------------------

; Store Status
_STST  ENDP


; Load Status
_LDST  PROC  NEAR32
  
  MOV  ESP, [ESP+4]  ; CONTEXT 주소로 ESP를 옮김 , ESP = &CONTEXT
  POPFD      ; EFL 을 CPU 로 , EFL = CONTEXT.EFL

  POP  EAX    ; EIP 백업 (EAX Reg 에다가) , EAX = Old EIP
  
  MOV  EBX, ESP  ; EBX 에 ESP 를 백업 , Current ESP Backup
    
  MOV  ESP, [ESP+12]  ; 뽑아왔던 ESP 넣음 , ESP = Old ESP
  PUSH  EAX    ; Old EIP 넣음 , SAVE Old EIP

  MOV  ESP, EBX  ; ESP = Current ESP 
  
  POPAD      ; PUSHAD 와 반대순서로 CPU에 올라가고, ESP는 무시

  MOV  ESP, [ESP-20]  ; ESP를 Return Address 로 돌려주기
  SUB  ESP, 4    
  
  RET     ; return

_LDST  ENDP


; 반환값 넣는 방법
;_ASKY  PROC  NEAR32

; Entry Code ) ------------------------------------
;  PUSH  EBP   ; establish stack frame
;  MOV  EBP,ESP
; -------------------------------------------------
  

;  MOV  EAX, 100  ; 반환값은 EAX에


; Exit Code ) -------------------------------------
;  MOV  ESP,EBP ; restore ESP if local variables used
;  POP  EBP   ; restore EBP
;  RET     ; return
; -------------------------------------------------

;_ASKY  ENDP


_MD  PROC  NEAR32

; Entry Code ) ------------------------------------
  PUSH  EBP   ; establish stack frame
  MOV  EBP,ESP
; -------------------------------------------------
  
  MOV  EAX, [EBP+8]  ; EAX = &A
  MOV  EAX, [EAX]  ; EAX = *(&A)
  
; Exit Code ) -------------------------------------
  MOV  ESP,EBP ; restore ESP if local variables used
  POP  EBP   ; restore EBP
  RET     ; return
; -------------------------------------------------

_MD  ENDP


_MM  PROC  NEAR32

; Entry Code ) ------------------------------------
  PUSH  EBP   ; establish stack frame
  MOV  EBP,ESP
; -------------------------------------------------
  
  PUSH  EBX    ; EBX Back up
  MOV  EAX, [EBP+8]  ; EAX = &A
  MOV  BL, [EBP+12]  ; BL = 0xFF
  MOV  [EAX], BL   ; *(&A) = 0xFF
  POP  EBX

; Exit Code ) -------------------------------------
  MOV  ESP,EBP ; restore ESP if local variables used
  POP  EBP   ; restore EBP
  RET     ; return
; -------------------------------------------------

_MM  ENDP


END




 실행화면

 


▶ MD 함수 스택 ( 변수안에 1Byte 만 바꾸기 위한 함수 )

▶ MM 함수 스택 ( 변수 안에 1Byte 만 출력 )


※ ESP 는 움직이는게 아니다. 기준점인 EBP 에서부터 위치를 조종해줘야 한다.



저작자표시

'Assembly' 카테고리의 다른 글

2013.09.30_메모리영역_복습/보충  (0) 2013.09.30
2013.09.26_ASM_어셈블리 영역 출력하기(수정중~30)  (0) 2013.09.27
2013.09.24_Assambly 메모리에 레지->CPU 에 다시 넣어서 무한 반복 하는 소스  (0) 2013.09.24
2013.09.23_어셈블리_ 메모리에 변수값직접넣기  (0) 2013.09.23
2013.09.12_ASM_Disassambly로 분석해보기  (0) 2013.09.13
    'Assembly' 카테고리의 다른 글
    • 2013.09.30_메모리영역_복습/보충
    • 2013.09.26_ASM_어셈블리 영역 출력하기(수정중~30)
    • 2013.09.24_Assambly 메모리에 레지->CPU 에 다시 넣어서 무한 반복 하는 소스
    • 2013.09.23_어셈블리_ 메모리에 변수값직접넣기
    성엽이
    성엽이

    티스토리툴바