티스토리 뷰
[Reversing] Printf()함수 스택프레임(Stack Frame)
[Reversing] 스택프레임(Stack Frame)
이전 게시물의 예제 중 printf("%d\n", x); 부분에 대해 간략하게 설명을 하겠습니다.
printf() 함수 호출
4010BB PUSH PROJECT1.41C798
- 해당 41C798 주소에는 "%d\n" 문자가 있는걸 알수있습니다.
[printf() 함수 호출 전 PUSH 부분]
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() 함수 스택 프레임]
'Reversing > ETC' 카테고리의 다른 글
[Reversing] RaiseException dwExceptionCode_SEH (0) | 2019.10.21 |
---|---|
[Reversing] 패킹(Compressor, Protector), Packer, Crypter (0) | 2019.07.20 |
[Reversing] 스택프레임(Stack Frame) (0) | 2019.06.28 |
[Reversing] 가능한 가장 작은 PE 실행 파일 만들기(Tiny PE) ② (0) | 2019.06.07 |
[Reversing] 가능한 가장 작은 PE 실행 파일 만들기(Tiny PE) ① (0) | 2019.04.02 |
- Total
- Today