이전 포스팅에 이어 계속 공부한 내용을 정리해본다.
Stage5. Stack Buffer Overflow
이전까지는 기초지식과 툴 사용법을 익혔다. 이제 처음으로 공격기법을 공부하기 시작했다.
공부하면서 기초지식과 툴 사용법을 익히는 과정이 매우 중요했다는 것을 느낄 수 있었다.
Stage5-1. Calling Convention
- 함수 호출 규약(Calling Convention)
- 함수의 호출 및 반환에 대한 약속
- Caller(호출자), Callee(피호출자)가 있음
- 함수 호출 규약의 종류: SYSV(x86-64아키텍처), cdecl(x86아키텍처) 등
- SYSV의 특징
- 6개의 인자를 rdi, rsi, rdx, rcx, r8, r9에 순서대로 저장하여 전달하며, 더 많은 인자를 사용할 때는 스택을 추가로 이용.
- Caller에서 인자 전달에 사용된 스택을 정리함.
- 함수의 반환값은 rax로 전달
- 함수 호출 규약 순서
- 인자 전달
- 반환 주소 저장
- Caller의 스택 프레임 저장
- Callee에게 스택 프레임 할당
- 반환값 전달
- Callee의 스택 프레임 해제
- 반환
Stage5-2. Stack Buffer Overflow
- Stack Overflow VS Stack Buffer Overflow
- Stack Overflow는 스택 영역 자체가 넘친 것
- Stack Buffer Overflow는 스택 영역 안에 할당된 특정 버퍼가 넘친 것
- 버퍼란?
- 데이터가 목적지로 이동하기 전에 보관되는 임시 저장소
- 데이터 처리 속도가 서로 다른 두 장치 사이에서 완충 작용을 함
- 현대에는 데이터가 저장될 수 있는 모든 단위를 버퍼라고 칭함
- Stack Buffer Overflow 공격의 유형 3가지
- 중요 데이터 변조: 다른 버퍼의 데이터 덮어쓰기
- 데이터 유출: 다른 버퍼의 데이터까지 읽어버리기(Data leak)
- 실행 흐름 조작: return 주소 덮어쓰기
- Stack Buffer Overflow 취약점이 있는 함수들(입력값의 길이 체크를 안 함)
- scanf()
- strcpy()
- strcat()
- sprintf()
- gets()
- Stack Buffer Overflow 예방을 위해 입력값의 길이 체크를 하는 함수들
- strncpy()
- strncat()
- snprintf()
- fgets()
- memcpy()
'드림핵' 카테고리의 다른 글
[드림핵]카나리 동적 분석 (1) | 2024.05.20 |
---|---|
[드림핵 워게임]shell_basic (0) | 2024.05.12 |
[드림핵 System Hacking Fundamental] Stage3 (0) | 2024.04.07 |
[드림핵 System Hacking Fundamental] Stage 1,2 (1) | 2024.04.07 |
[드림핵 워게임] basic_exploitation_001 (0) | 2024.03.31 |