어셈블리(스택 프레임)
@ 어셈블리(스택 프레임)
1. 스택 프레임
- 스택 프레임은 EBP 레지스터를 사용하여 스택 내의 지역 변수, 함수 인자값, 리턴 주소에 접근하는 기법이다.
- 스택에는 지역 변수, 함수 인자값, 리턴 주소들이 저장된다.
- 스택 프레임은 함수가 호출될 때 생성되고, 함수 처리 완료되면 자동으로 소멸된다.
2. 스택 프레임 이해
1) VS 2008을 이용하여 'stack.exe' 파일을 제작한다.
- 파일 -> 새로 만들기 -> 프로젝트 -> 빈 프로젝트 -> 위치(04_테스트) & 이름(stack) -> 확인
- '소스 파일' 우클릭 -> 추가 -> 새 항목 -> 'C++ 파일(.cpp)' 선택 -> 이름(stack) -> 추가
#include
int add(int a, int b)
{
int x = a , y = b;
return (x + y);
}
int main(int argc, char* argv[])
{
int a = 6 , b = 2;
printf("%d\n", add(a, b));
return 0;
}
- 파일 -> 모두 저장 -> 닫기
2) 'cl' 명령어를 이용한 최적화 컴파일 실시
C:\리버싱\04_테스트\stack\stack>cl stack.cpp /link /debug /opt:icf,ref
Microsoft (R) 32비트 C/C++ 최적화 컴파일러 버전 15.00.30729.01(80x86)
Copyright (c) Microsoft Corporation. All rights reserved.
stack.cpp
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
/out:stack.exe
/debug
/opt:icf,ref
stack.obj
C:\리버싱\04_테스트\stack\stack>dir
3. 올리디버거를 이용한 'stack.exe' 분석
- 메모리 주소, 레지스터 저장 값, 스택 내용, 메모리 덤프 내용 확인
1) main 함수 찾기(F8)
2) main 함수로 들어가기(F7)
3) main 함수에 BP 걸기(F2)
4) main 함수 프롤로그 확인(F8)
5) main 함수 본체 확인(F8)
6) add 함수 들어가기(F7)
7) add 함수에 BP 걸기(F2)
8) add 함수 프롤로그 확인(F8)
9) add 함수 본체 확인(F8)
10) add 함수 에필로그 확인(F8)
11) main 함수 본체 확인(F8)
12) main 함수 에필로그 확인(F8)