Buffer Overflow

버퍼 오버플로우 원리

버퍼보다 많은 데이터를 쓰면 인접 메모리와 반환 주소, 함수 포인터, metadata가 손상될 수 있다. 방어는 길이 검사와 메모리 보호가 함께 필요하다.

01

입력 길이 검증

외부에서 온 문자열이나 패킷 길이를 destination 크기와 비교하지 않으면 overflow가 시작된다.

02

덮이는 대상을 추적한다

stack buffer 뒤에 return address나 saved frame pointer가 있는지 구조를 본다.

03

완화 기법을 겹친다

stack canary, ASLR, NX bit, safe library가 각각 다른 공격 단계를 어렵게 만든다.

Stack overflow
호출 프레임 손상 지역 배열을 넘쳐 saved return address를 덮을 수 있다.
canary가 탐지한다.
Heap overflow
allocator metadata와 객체 손상 인접 heap chunk나 vtable pointer를 훼손할 수 있다.
현대 allocator 방어가 있다.
NX
실행 금지 stack이나 heap에 주입한 코드를 실행하지 못하게 한다.
ROP 같은 우회가 있다.
ASLR
주소 예측 방해 library, stack, heap 위치를 무작위화해 exploit 안정성을 낮춘다.
정보 누출과 같이 보면 깨진다.

길이 · 제어 데이터 · 완화 점검

길이 복사 전에 source 길이와 destination 크기를 비교하는가.
제어 데이터 넘침이 단순 데이터 훼손인지 제어 흐름 탈취로 이어질 수 있는지 구분하는가.
완화 canary, ASLR, NX가 각각 무엇을 막는지 설명할 수 있는가.

위험 패턴

char buf[16];
// unchecked copy of more than 16 bytes can overwrite adjacent stack data