티스토리 뷰

[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() 함수 스택 프레임]




댓글
공지사항
«   2019/07   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
Total
131,429
Today
34