스택 카나리는 Thread Local Storage(TLS)
에 위치한다.
Thread Local Storage
- TLS는 명칭 그대로 스레드의 저장 공간을 의미한다.
- 이는 스레드의 전역 변수를 저장하기 위한 공간으로, 로더(Loader)에 의해서 할당된다.
Master Canary
- 스택 버퍼를 사용하는 모든 함수는 같은 카나리 값을 사용한다.
- 이러한 특징때문에 임의 함수에서 메모리 릭으로 카나리를 알아낼 수 있다면 다른 함수에서도 같은 카나리를 덮어쓰고 실행 흐름을 조작할 수 있다.
- FS 세그먼트 레지스터에서 카나리 값을 가져오기 때문이다.
- 이렇게 TLS 주소에 0x28바이트만큼 떨어진 주소에 위치한 랜덤한 값을 마스터 카나리(Master Canary)라고 한다.
Thread Stack
- 스레드 함수에서 선언된 변수는 일반적인 함수에서 사용하는 스택 영역이 아닌 TLS와 인접한 영역에 할당된다.
그러나 버퍼를 할당했을 때 TLS 영역에 존재하는 마스터 카나리 값을 참조한다는 점은 동일하다.
- 스레드에서 할당한 변수는 마스터 카나리가 위치하는 주소보다 낮은 주소에 있기 때문에 스택 버퍼 오버플로우가 발생한다면 마스터 카나리를 덮어쓸 수 있다.