13. 함수 프롤로그,에필로그
본 포스팅의 내용은 해킹 맛보기 책의 내용중 3장 리버스 엔지니어링 P133~P281 까지 실습 내용을 따라하기 해보았습니다. 책의 내용중 일부 발췌 (수정) 하였습니다. 문제가 될 때는 비공개 하도록 하겠습니다. |
#include <stdio.h>
int main()
{
printf("prologue & epilogue ");
return 0;
}
[발췌-수정]
함수프로그에서 PUSH EBP 후 스텍 구조
스택 구조가 함수 프롤로그와 에필로그에 따라 어떻게 변한는지 알아보자.
main() 함수의 프롤로그 PUSH EBP를 실행하면 스택 구조는 아래와 같다.
Low Address |
|
|
|
|
main() 함수 이전 EBP 값 |
<- |
ESP |
High Address |
|
|
|
함수의 프롤로그 MOV EBP, ESP를 실행하면 스택 구조는 아래와 같다.
Low Address |
|
|
|
|
main() 함수 이전 EBP 값 |
<- |
ESP , EBP |
High Address |
|
|
|
--------------------------------------------------------------------------------
어셈블리어에서 00071303 SUB ESP,0C0 의 명령어는 지역 변수를 사용하기 위해
ESP를 아래로 이동시킨다. 명령어 실행 후 스택 구조는 아래와 같다.
Low Address |
|
|
|
|
|
<- |
ESP |
|
... |
|
|
|
지역 변수 2 |
|
|
|
지역 변수 1 |
|
|
|
main() 함수 이전 EBP 값 |
|
ESP |
High Address |
|
|
|
아래 어셈블리어 주소 000713F0 에서 printf() 함수를 호출하기 위해 1개의 인자를 입력한다.
PUSH 75858 명령어를 실행한 후의 스택 구조는 아래 그림과 같다.
Low Address |
|
|
|
|
PUSH 75858(인자 1) |
<- |
ESP |
|
... |
|
|
|
... |
|
|
|
지역 변수 2 |
|
|
|
지역 변수 1 |
|
|
|
main() 함수 이전 EBP 값 |
<- |
EBP |
High Address |
|
|
|
1번 그림
2번 그림
'Reverse Engineering' 카테고리의 다른 글
15. 포인터를 사용하지 않는 C 소스 (0) | 2016.11.14 |
---|---|
14. 지역변수, 전역변수, 포인터 (0) | 2016.11.14 |
12. 함수 호출 리턴값 확인 (0) | 2016.11.14 |
11. 콜린 컨벤션 __fastcall 함수의 어셈블리어 코드 (0) | 2016.11.10 |
10. 콜린 컨베션 __stdcall 함수의 어셈블리어 코드 (0) | 2016.11.10 |