리버싱

3일차 뺏셈` ~ 배열

컴공 2013. 4. 10. 12:07
반응형



다음에 보이는 것과 같이 DWORD PTR DS: 다음에는 값이 들어가는데, 이것은 아래에 보이 듯이 상단에 있는 M버튼을 눌러서 메모리 영역으로 들어가서 확인 가능하다.





다음에 보이 듯이 406000 주소지부터 2000개의 공간만큼 data 영역으로 가지며, data 속성을 가지고 있음을 알 수 있다.



push 부분에서 다음에 보면 01_03_qu라고 되어있는데, 이것은 프로그램 exe파일 명과 일치하며 8글자까지만 나타난다.
의미는 01_03_quiz.exe에 406030의 내용을 push하겠다는 의미이다.




다음과 같이 3개의 push가 연달아 이어져있는데, sprintf일 확율이 높다.



배열문 출력인 sprintf는 다음과 같이 sprintf(배열명,"hellow %s", 값);으로 나타낼 수 있다.
char 배열명[10], 값[3]=하이;
 sprintf(배열명,"hellow %s", 값); // 배열명의 배열크기는 표기해지는 "hellow 하이"를 모두 나타낼 수 있는 크기여야 한다.


다음과 같이 push되어진 내요을 확인하고자한다면 해당 어셈블리어 위치에서 follow dump를 클릭하고
맨 밑에 것을 클릭해주면된다.(항상 바뀌므로 맨 밑으로 기억할 것)



이동하고나서 ascii문자와 16진수 문자를 함께 보려면 위와 같이 선택해 준다.

확인해보면 다음과 같이 "n1 = %d"라는 아스키 문자가 삽입되어 있는 것을 확인할 수 있다.


push는 다음과 같이 stack 영역 하나(4byte)를 먹고 들어간다. 그래서 임시 변수로 들어온 push를
ADD ESP, 0C로 원래의 영역만큼 다시 줄여준다.




stack 영역에 보여지는 코멘트는 신뢰할 수 없다. 단지 참고만 할 것.



다음에 보이듯이 LEA를 통해 주소가 복사되어졌음을 알 수 있다. 이는 즉 포인터 *pa와 유사하다고 할 수 있다.

포인터 생성방법
int a;
int *pa;
pa = &a;







1 int 형 덧셈

// 1_1_quiz.cpp : Defines the entry point for the application.

//

#include "stdafx.h"

int APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     int       nCmdShow)

{

// TODO: Place code here.

int n  = 5;

int n2 = 6;

int n3  = n + n2;

return 0;

}


2 형변환  int -> char형으로

// 01_02_quiz.cpp : Defines the entry point for the application.

//


#include "stdafx.h"


int APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     int       nCmdShow)

{

// TODO: Place code here.

int EBP_4 = 6;

int EBP_8 = 7;

char EBP_C = 0x41;

char EBP_10 = 0x63;

char EBP_14 = EBP_C + EBP_4;

char EBP_18 = EBP_10 + EBP_8;

return 0;

}


3 sprintf 함수 

#include "stdafx.h"

#include <stdio.h>

int APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     int       nCmdShow)

{

// TODO: Place code here.

int EBP_10 = 0xA;

char  EBP_C[10];

sprintf(EBP_C,"n1 = %d",EBP_10);

return 0;

}

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

PUSH EBP 

MOV EBP,ESP

SUB ESP,10 // 16bit의 4칸 공간 생성

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

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

PUSH EAX

PUSH 01_03_Qu.00406030          ;  ASCII "n1 = %d"

LEA ECX,DWORD PTR SS:[EBP-C]

PUSH ECX

CALL 01_03_Qu.0040103E

ADD ESP,0C

4 배열 + 배열

#include "stdafx.h"

#include <stdio.h>

int APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     int       nCmdShow)

{

  // TODO: Place code here.


char str[10] = "cnscnscns";

char arr[18];

sprintf (arr, "Hello, %s",  str);

return 0;

}

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

PUSH EBP

MOV EBP,ESP

SUB ESP,20

MOV EAX,DWORD PTR DS:[406030]

MOV DWORD PTR SS:[EBP-20],EAX     ;  char EBP_20 = "cnsc";

MOV ECX,DWORD PTR DS:[406034]

MOV DWORD PTR SS:[EBP-1C],ECX     ;  char EBP_1c = "nscn";

MOV DX,WORD PTR DS:[406038]

MOV WORD PTR SS:[EBP-18],DX       ;  char EBP_18 = "s";

LEA EAX,DWORD PTR SS:[EBP-20]

PUSH EAX

PUSH 01_04_Qu.0040603C            ;  ASCII "Hello, %s"

LEA ECX,DWORD PTR SS:[EBP-14]

PUSH ECX

CALL 01_04_Qu.00401053            ;  spfintf (arr, "Hello, %s",  EBP_20 + EBP_1c + EBP_18);

ADD ESP,0C




반응형