[드림핵 시스템 해킹] Stack Canary

asdf·2025년 1월 9일

pwnable

목록 보기
9/36

스택 카나리

스택 카나리(Stack Canary)는 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법입니다.
스택 버퍼 오버플로우로 반환 주소를 덮으려면 반드시 카나리를 먼저 덮어야 하므로 카나리 값을 모르는 공격자는 반환 주소를 덮을 때 카나리 값을 변조하게 됩니다. 이 경우, 에필로그에서 변조가 확인되어 공격자는 실행 흐름을 획득하지 못합니다.

카나리 생성

security_init 함수에서 TLS에 랜덤 값으로 카나리를 설정하면, 카나리로 보호 받는 함수에서 이를 참조해 사용합니다. TLS의 주소는 fs 레지스터에 저장되며, 카나리는 TLS + 0x28 위치에서 확인할 수 있습니다.

카나리 우회 기법

  • 무차별 대입 공격 : 무차별 대입으로 카나리 값을 구하는 방법. 현실적으로 불가능에 가깝습니다.
  • TLS 접근 : 카나리는 TLS에 전역 변수로 저장되므로, 이 값을 읽거나 조작할 수 있으면 카나리를 우회할 수 있습니다.
  • 스택 카나리 릭 : 함수의 프롤로그에서 스택에 카나리 값을 저장하므로, 이를 읽어낼 수 있으면 취약점을 사용해 스택을 덮을 때 카나리 검사를 우회할 수 있습니다. 가장 현실적인 카나리 우회 기법입니다.
profile
Rainy Waltz(a_hisa)

0개의 댓글