이번엔 변수를 받아와서 출력하는 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)라고 할수 있겠다.


+ Recent posts