스택의 기본적인 메모리 구조는 다음과 같다.
buffer[n] |
SFP |
RET |
SFP는 Saved Frame Pointer 의 약자로 실행될 때 이전의 EBP값을 가지고 있다. EBP는 현재 스택의 가장 바닥을 가리키는 포인터로 새로운 함수가 호출되면 EBP 레지스터 값이 지금까지 사용하던 스택 꼭대기의 위에 위치하게 되며, 새로운 스택이 시작된다. EBP는 새로운 함수가 호출되거나 현재 실행중인 함수가 종료되어 리턴될 때 마다 값이 달라진다. 현재 함수가 끝나면 이전 함수의 EBP가 필요하게 되는데, 이 이전 함수의 EBP를 저장하는 공간이 SFP이다.
SFP는 32bit에서는 4byte, 64bit에서는 8byte이다.
RET는 pop eip 와 jmp eip를 수행하는데 다음 수행할 명령을 eip에 넣고 그 주소로 가서 실행하는 것이다. 따라서 버퍼 오버플로우에서 RET에 함수 주소나 쉘코드를 덮어쓰면 그 함수나 코드가 실행되는 것이다.
RET도 32bit에서는 4byte, 64bit에서는 8byte이다.
'Project H4C Study Group' 카테고리의 다른 글
[Project H4C] C언어 코딩도장(13) (0) | 2021.03.23 |
---|---|
[Project H4C] PLT, GOT (0) | 2021.03.21 |
[Project H4C] Buffer Overflow (0) | 2021.03.21 |
[Project H4C] pwntools (0) | 2021.03.20 |
[Project H4C][dreamhack] basic_exploitation_002 (0) | 2021.03.19 |