1. 정의
- 스택 버퍼 오버플로우로부터 반환 주소를 보호하는 기법이다.
- x64아키텍처는 8Byte의 카나리가 생성되며, x86아키텍처는 4byte의 카나리가 생성된다.
( NULL바이트가 포함되어, 실제로는 7byte와 3byte로 생성된다. )
2. 동작과정
① 함수의 프롤로그에서 스택 버퍼와 반환주소 사이에 임의의 값을 삽입한다.
② 함수의 에필로그에서 임의 값이 변조되었는지 확인한다.
③ 임의의 값이 변조되었다면, BOF가 발생한 것으로 인식해서 프로세스가 강제 종료된다.
3. 카나리 적용없이, 컴파일하고 싶은 경우
- Ubuntu 18.04의 gcc는 기본적으로 스택 카나리를 적용해서 바이너리를 적용한다.
- 따라서, 아래와 같은 컴파일 옵션을 추가해야, 카나리 없이 컴파일이 가능하다.
-fno-stack-protector
4. 카나리 생성과정
① 카나리 값은 프로세스가 시작될 때마다, 새로운 임의의 값으로 TLS에 전역변수로 저장된다.
② fs는 TLS를 가르키므로, fs값을 알면 TLS를 알아낼 수 있다.
5. 카나리 우회
① TLS접근
- 카나리 TLS에 전역 변수로 저장되므로, 이 값을 읽거나 조작할 수 있으면 카나리를 우회할 수 있다.
② 스택 카나리 릭
- 함수 프롤로그에 스택에 카나리 값을 저장하므로, 이를 읽어낼 수 있으면 카나리를 우회할 수 있다.
- 가장 현실적인 카나리 우회 기법이다.
6. 카나리 관련 Wargame
'System Hacking' 카테고리의 다른 글
Fake EBP (0) | 2022.08.03 |
---|---|
RTC (Return To CSU) (0) | 2022.07.04 |
RTL (Return to Library) (0) | 2022.06.29 |
PLT & GOT (0) | 2022.06.27 |
NX & ASLR (0) | 2022.06.27 |