Mitigation: Stack Canary
Stack Canary(스택 카나리)
- 스택 버퍼 오버플로우로부터 반환 주소를 보호
- 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법
- 나리 값의 변조가 확인되면 프로세스는 강제로 종료
- 스택 버퍼 오버플로우로 반환 주소를 덮으려면 반드시 카나리를 먼저 덮어야 하므로 카나리 값을 모르는 공격자는 반환 주소를 덮을 때 카나리 값을 변조 / 이 경우, 에필로그에서 변조가 확인되어 공격자는 실행 흐름을 획득 X
카나리 생성 과정
- 카나리 값은 프로세스가 시작될 때, TLS에 전역 변수로 저장되고, 각 함수마다 프롤로그와 에필로그에서 이 값을 참조
- security_init함수에서 TLS에 랜덤 값으로 카나리를 설정하면, 매 함수에서 이를 참조하여 사용
카나리 우회
1. 무차별 대입 (Brute Force)
- x64 아키텍처에서는 8바이트의 카나리가 생성되며, x86 아키텍처에서는 4바이트의 카나리가 생성
- 각각의 카나리에는 NULL 바이트가 포함되어 있으므로, 실제로는 7바이트와 3바이트의 랜덤한 값이 포함
- 무차별 대입으로 x64 아키텍처의 카나리 값을 알아내려면 최대 256^7번, x86 에서는 최대 256^3 번의 연산이 필요
- 실제 서버를 대상으로 이 정도 횟수의 무차별 대입을 시도하는 것은 불가능
2. TLS 접근
- 카나리는 TLS에 전역변수로 저장되며, 매 함수마다 이를 참조해서 사용
- TLS의 주소는 매 실행마다 바뀌지만 만약 실행중에 TLS의 주소를 알 수 있고, 임의 주소에 대한 읽기 또는 쓰기가 가능하다면 TLS에 설정된 카나리 값을 읽거나, 이를 임의의 값으로 조작할 수 있다.
- 그 뒤, 스택 버퍼 오버플로우를 수행할 때 알아낸 카나리 값 또는 조작한 카나리 값으로 스택 카나리를 덮으면 함수의 에필로그에 있는 카나리 검사를 우회 가능
3. 스택 카나리 릭
- 스택 카나리를 읽을 수 있는 취약점이 있다면, 이를 이용하여 카나리 검사를 우회할 수 있다.
'CTF > Dreamhack' 카테고리의 다른 글
[Dreamhack] php-1 (0) | 2023.03.28 |
---|---|
[Dreamhack] System Hacking STAGE 7 - Mitigation: NX & ASLR, Background: Library - Static Link vs. Dynamic Link (0) | 2022.11.06 |
[Dreamhack] System Hacking STAGE 5 - Stack Buffer Overflow (0) | 2022.10.30 |
[Dreamhack] System Hacking STAGE 4 - Shellcode (0) | 2022.10.29 |
[Dreamhack] System Hacking STAGE 3 - gdb, pwntools (0) | 2022.10.11 |