다음에 보이는 것과 같이 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
'리버싱' 카테고리의 다른 글
5일차, 점프, Argument(arguv, arguv) (0) | 2013.04.13 |
---|---|
4일차 역공학, 어셈 & register & stack & dumpwindow에서 내용수정 (0) | 2013.04.11 |
2일차. 올리디버거 설정 (0) | 2013.04.09 |
1일차. 어셈블리어 (0) | 2013.04.08 |
1일차 리버싱 (0) | 2013.04.08 |