스택 프레임이란 함수 호출시 생성되는 지역 변수, 매개 변수, 복귀 주소 등의 정보를 저장하는 스택의 구조이다. ESP와 EBP를 이용하여 관리한다.
함수가 호출되면
call [함수] 가 실행되면 우선 PUSH EIP 를 한다. 이는 복귀하였을때 기존 실행될 명령어를 저장해 두는 것이다. 이 부분을 ret이라 한다.
프롤로그
PUSH EBP MOV EBP, ESP SUB ESP, x (이건 없을수도 있음)
PUSH EBP : 함수가 종료되고 다시 이전 스택 프레임으로 복귀할 주소를 스택에 저장한다. 이 부분은 SFP라고 한다.
MOV EBP, ESP : EBP에 ESP값을 넣어서 EBP를 현재 스택프레임의 EBP로 바꾼다.
SUB ESP, x : ESP에서 x를 뺀다. 즉 스택 프레임의 데이터 저장 공간을 확보한다. 데이터 저장 공간이 필요없을 경우 이 부분은 없다.
BODY
...
함수의 본체로 지역 변수 등이 저장된다.
에필로그
LEAVE RET
여기서 LEAVE와 RET은 아래의 명령어로 풀어쓴다.
LEAVE: MOV ESP, EBP POP EBP
RET: POP EIP JMP EIP
MOV ESP, EBP : 올라간 ESP를 다시 EBP까지 내린다.
POP EBP : 내려온 ESP는 SFP 즉, 이전 스택프레임의 EBP주소를 가리킨다. 이 값을 EBP에 넣음으로서 EBP는 이전 스택프레임의 EBP가 된다.
POP EIP : POP EBP로 ESP는 한칸 내려와 ret 즉, 복귀할 명령어 주소를 가리킨다. 이 값을 EIP에 넣는다.
JMP EIP : EIP에 있는 주소로 JUMP하여 실행흐름이 복귀된다.
'포너블 > Stack' 카테고리의 다른 글
BoF, Shellcode, Nx bit (1) | 2023.10.23 |
---|---|
핸드레이 (0) | 2023.10.17 |
함수호출규약 (0) | 2023.10.14 |
메모리 구조 (0) | 2023.10.14 |
K0n9의 heap부터 시작하는 줄 알았으나 stack을 시작해버린 이야기 (0) | 2023.10.14 |