SFP에 대해 질문입니다.

스택 프레임 포인터라고 하던데 용도가 궁금하고 크기가 0x8이라고 단정할 수 있던 이유도 궁금합니다.

#pwnable
작성자 정보
답변 1
avatar
wyv3rn
무플 방지 위원회장

sfp란 함수 a에서 b를 호출한 뒤 b 함수가 종료된 후 a 함수로 되돌아갔을때의 a 함수가 사용하던 스택 위치를 복구할 수 있도록 저장해놓은 공간입니다.
더불어 ret은 마찬가지 이유로 되돌아갔을때 a 함수의 코드가 마저 실행될 수 있도록 a 함수 코드 주소를 저장합니다.

주소를 저장하는 것이기에 32비트에서는 무조건 4바이트, 64비트에서는 8바이트입니다.

예를 들자면 64비트에서
a 함수에서 16바이트의 변수를 사용하고
b 함수에서 8바이트 변수를 사용한다고 가정할 때
a의 스택 프레임은 아래와 같아집니다.

0x100 : buf[16] #a 함수가 사용하는 변수 공간, 주소는 0x100으로 가정

여기서 b 함수를 호출하면

0x88 : buf[8] #b 함수 변수 공간
0x90 : sfp #a 함수의 스택 프레임 주소
0x98 : ret #a 함수의 코드 주소
0x100 : buf[20]

와 같이 형성됩니다.

이런 작업을 하기 위해 함수는 이전 함수의 스택 프레임 포인트와 코드의 위치를 저장하기 위한 프롤로그 코드 부분과 이를 복구하는 에필로그 코드 부분을 가지게 됩니다.

모두 설명드리려면 다소 길기에 나머지는 검색을 통해 공부하시거나 드림핵 디스코드로 방문해주세요 😀

2023.10.25. 06:02
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기