[시스템해킹] Buffer OverFlow(BOF)
BOF 개념
- 함수 호출 과정
- 함수 호출 규약이 아키텍처, 컴파일러 환경에 따라 달라짐
1. 인자 전달 - 먼저 레지스터에 저장하고, 부족하면 스택에 저장
2. return 주소 저장 - call func 함수 호출 다음 수행할 명령어의 주소(return 주소)를 스택에 push

(함수 내부)
3. 스택 프레임 저장 - push rbp main의 Stack Frame Pointer(SFP)를 스택에 push
4. 스택 프레임 할당 - mov rbp, rsp/sub rsp, 0x30 함수에서 사용할 새로운 스택 프레임 할당, 새로 할당 받은 스택프레임에서 연산 수행.

5. 스택 프레임 해제 - leave 함수 연산을 마친 후 이전의 스택 프레임으로 돌아가기
6. 반환 값 저장 - 함수 반환 값을 rax에 저장

7. 반환 - ret return 주소를 꺼내서 main 함수로 복귀

- Stack Buffer OverFlow
- 버퍼: 데이터가 목적지로 이동하기 전에 보관되는 수신-송신 사이 임시 저장소
- BOF: 버퍼가 넘치는 것. 버퍼의 크기보다 데이터가 많이 들어가면 다른 영역의 값을 오염시킴.
- Stack BOF: 스택 영역의 버퍼에서 Overflow 발생
- Stack BOF 예시: 중요 데이터 변조, 데이터 유출, 실행 흐름 조작 등 공격 가능
- Stack BOF 취약점: 버퍼에 사용자 입력을 받으면서 길이를 체크하지 않는 함수.
ex) scanf("%s", buf), strcpy, strcat, sprint, read 등
- NOP sled (NOP slid)
- NOP: 아무것도 수행하지 않는 명령어(No Operation). 다음 명령어로 넘어감
- NOP Sled: 셸코드의 정확한 주소를 알 수 없을 때 셸코드 주소의 범위를 크게 만들기 위해 사용하는 기법
ex) ASLR 기법으로 인해 메모리 주소가 계속 변경되는 경우
- 셸코드 앞에 NOP 명령어를 길게 나열하면 NOP가 있는 아무 주소에만 도착하면 NOP를 타고 내려가 결국 셸코드를 실행하게 됨