이번엔 변수를 받아와서 출력하는 c언어를 리버싱 해본다.
이번에도 메인함수를 잘 찾아서 f7을 눌러서 들어온다.
오른쪽에 현재 스택 프레임의 맨위를 나타내는 ESP가 0018FF48이다.
아래 오른쪽에 스택 메모리를 보면 0018FF48가 스택의 TOP인걸 알 수 있다.
EBP는 스택의 바닥의 주소이다.
ESP와 EBP사이를 Stack Frame이라고 한다.
가장 처음 명령어인
PUSH EBP
MOV EBP,ESP
는 스택 프레임을 만드는 명령어이다.
메인함수를 호출당한 상태라서 가장 먼저 함수를 위한 스택프레임을 만드는 것이다.
PUSH EBP
는 EBP 주소 0018FF88를 Stack 메모리에 넣어주는 명령어고
MOV EBP,ESP
ESP에 있는 값을 EBP에 덮어 씌우는명령어다.
이말은 즉 EBP와 ESP를 같게 한다는 뜻이므로 스택에 아무것도 없는 상태에서 스택 프레임이 생성되는 과정이라 본다.,
ESP와 EBP가 같아졌다.
main함수의 Stack Frame이 생성되었다.
그래서 저 명령어는 함수의 맨 앞부분에 자주 나온다.
Function Prologue라 한다.
ECX의 값이 스택에 PUSH 되었다.
MOV DWORD PTR SS:[EBP-4],5
의 의미는 무엇일까
DWORD
BYTE는 1바이트
WORD는 2바이트
DWORD는 4바이트(더블워드)
QWORD는 8바이트(쿼드워드)이다.
SS:[EBP-4]
SS는 STACK 영역
DS는 DATA 영역
CS는 CODE영역을 의미한다.
위에 메뉴를 보면 m 이 있는데 클릭한다.
메모리 맵인데 이곳을 보면 스택, 데이터, 코드의 주소가 나와있다.
메모리맵이라고 한다.
[EBP-4]
[EBP-4]는 꺽쇠 안에 있으면 주소라고 생각한다.
따라서 현재 EBP 주소 0018FF44에 4를 뺀값이므로 0018FF40이다
0018FF40은 아까 ECX가 PUSH된 곳의 스택 주소이다.
DWORD는 4바이트이므로 바로 옆에있는
7573B6F0의 주소를 의미한다.
MOV DWORD PTR SS:[EBP-4],5는
7573B6F0의 값을 5로 바꾸라는 의미가 되겠다
00 00 00 05로 바뀐것을 볼 수 있다.
이렇게하는 이유는
코드 값을 보면 AGE의 값이 5 다.
따라서
PUSH ECX
MOV DWORD PTR SS:[EBP-4],5는
int age=5;를 나타내는 명령어가 되겠다
그다음
MOV EAX,DWORD PTR SS:[EBP-4]는
EAX에다가 아까 넣은 5의값이 EAX에 들어갈 것으로 예상할 수 있다.
005B1CA8이였던 EAX값이
00 00 00 05로 바뀌었다.
PUSH new.004020F4는 age %d를 가져오는 값이다.
다음 CALL은 printf를 CALL하는 것이다
따라서
MOV EAX,DWORD PTR SS:[EBP-4]
PUSH EAX
PUSH new.004020F4
CALL DWORD PTR DS:[<&MSVCR90.printf>]는
코드에서 pirntf("age: %d",age)라고 할수 있겠다.
'리버싱<기초>' 카테고리의 다른 글
[Reversing]조건문과 플래그 (0) | 2018.04.20 |
---|---|
[Reversing]배열과 변수초기화 (0) | 2018.04.20 |
[Reversing]기초 리버싱 프로그램 리버싱해보기 (2) | 2018.04.18 |
[Reversing]기본설정과 간단한 Hello World 분석/ 조작 (0) | 2018.04.17 |