Stack Cancary
: Stack overflow를 막기 위한 메모리 보호 기법
Buffer와 SFP 사이에 랜덤한 4byte 또는 8byte의 Canary 값을 삽입
SFP와 RET 값이 변조 되는 것을 막아 Exploit을 하지 못하도록 함
Memory 보호 과정
- 함수 진입시 Canary 값을 설정
- 함수 종료시 변조 되었는지 확인
Canary 값이 변조 되었을 경우 ⇒ __stack_check_fail 함수 → 강제 종료
Compile option
- Canary 해제 : -fno-stack-protector
- Canary 설정 : -fstack-protector
우회 방법 (Bypass)
1. Memory leak
해당 Buffer를 출력할 수 있다면 Buffer를 Canary 전까지 채워서 Canary가 함께출력 되도록 함
2. Brute Force
Canary 값이 고정인 경우 사용
Canary 값을 특정 파일에서 읽어서 사용하거나 fork된 바이너리는 값이 고정
3. pthread 함수로 실행된 함수 내부
Stack 하단에 Canary 값을 비교하는 값이 있는데 이 값을 덮어서 Canary 조작
4. sanf(”%d”, buf[i]);
scanf로 공간을 입력 받을 수 있으면 ‘+’나 ‘-’를 이용해 Canary 값을 덮지 않고 우회할 수 있음
Canary leak
현재 buf 상태
A를 8개 입력 ⇒ “\xbe\xe0\xe1\x02\x35\x7e\x28” 값 leak
leak한 값을 pwntools로 받아서 unpacking해준 후, hex값으로 출력 ⇒ Canary