실행 파일 처음 열었을 때이다.
상단바에 모듈을 확인하면 ntdll.dll이다. 메인 함수가 있는 (파일명).exe로 가야 한다.

보통 디버거에서 자동으로 중단점 설정을 해주는데 이때 메인 코드가 있는 곳에 중단점이 설정되어 있을 확률이 높다.
stackframe_practice.exe인 중단점 아무거나 더블 클릭하면 모듈이 stackframe_practice.exe로 넘어간다.

스터디 시간에 배운 것처럼
push ebp
mov ebp, esp의 형태를 띄는 걸 알 수 있다.

무슨 함수 호출을 볼까 하다가 malloc 함수 call을 자세히 보기로 했다.

malloc으로 들어가기 전 레지스터 상태이다.

f7을 눌러 malloc 안으로 들어가도록 했다. eip 옆 주석을 보면 msvcrt.malloc임을 알 수 있다. msvcrt는 일종의 라이브러리, malloc 함수가 위치한 모듈 정도로 이해했다.

이 함수에 들어오면 역시나
push ebp
mov ebp, esp
가 반긴다.

push ebp를 실행하면

ebp에 있던 값이

스택 상단에 배치된 걸 확인할 수 있다. 현재 스택 프레임은 다음과 같다.
| 스택 주소 | 배치된 값 | 주석 |
|---|---|---|
| 0061FED8 | 0061FF68 | |
| 0061FEDC | 004012E7 | stackframe_practice로 가는 ret |

esp는 ebp의 값을 넣어준 주소가 된다.

다음 mov ebp, esp를 해주면

ebp가 esp가 있는 곳까지 올라오면서 동일해진다. 이제 malloc 함수의 데이터 범위가 지정된 것이다. ebp를 malloc의 땅바닥이라 생각하고 스택을 쌓아올리면 된다.
malloc의 함수 종료 부분도 살펴보자

pop esi
pop ebp
ret

pop ebp를 하면 해당 스택이 줄어들고

값이 ebp에 넣어진다. esp는 스택이 줄어들어서 0061FEDC임을 알 수 있다.

0061FEDC를 보면 return address임을 알 수 있다.

ret를 실행하면

위에 0061FEDC에 저장되었던 값 004012E7로 이동했음을 알 수 있다.

EBP와 ESP를 보면 malloc으로 들어가기 전 EBP, ESP 상태와 같다.