티스토리 뷰

728x90
반응형

[Reversing] Printf()함수 스택프레임(Stack Frame)


[Reversing] 스택프레임(Stack Frame)

이전 게시물의 예제 중 printf("%d\n", x); 부분에 대해 간략하게 설명을 하겠습니다.


printf() 함수 호출

4010BB PUSH PROJECT1.41C798

- 해당 41C798 주소에는 "%d\n" 문자가 있는걸 알수있습니다.

[printf() 함수 호출 전 PUSH 부분]

- printf() 함수의 스택 프레임을 생성합니다. 다음을 보시게 되면 순서데로 작성해보겠습니다.


PUSH EBP

- 스택에 현재의 EBP를 저장합니다.


MOV EBP, ESP

- printf()의 ESP 값을 EBP에 옮겨주었습니다.


PUSH ESI

- 스택에 ESI를 저장합니다.

- ESI는 데이터를 조작하거나, 복사 시 소스 데이터 주소를 저장한다고 합니다


MOV ESI, DWORD PTR SS:[EBP+8]

- 바로 ESI에 [EBP+8] 값을 넣어줍니다.

- 현재 [EBP+8]에는 이전 위에서 말하였듯이 "%d\n" 문자가 있습니다.


PUSH 1

CALL project1.4031AC

ADD ESP, 4

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

- 해당 명령을 통해 변수(x)의 값을 ECX에 넣었습니다.


PUSH ECX

- PUSH를 통해 다음주소에 ECX 변수(x)의 값을 스택에 저장합니다.


PUSH 0

PUSH ESI

- 다음주소에는 ESI "%d\n"을 스택에 저장합니다. 


PUSH EAX

CALL PROJECT1.401000

PUSH DWORD PTR DS:[EAX+4]

PUSH DWORD PTR DS:[EAX]

CALL PROJECT1.404584

- 해당 명령들을 통해 printf("%d\n", x); 까지 출력을 했습니다.

- 이후 EBP를 원복시켜주어 원복합니다. 


ADD ESP, 18

POP ESI

POP EBP

RET


[printf() 함수 스택 프레임]




728x90
반응형
댓글
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today