Without a Break

[Dreamhack] Mitigation: Stack Canary 본문

Pwnable/Dreamhack

[Dreamhack] Mitigation: Stack Canary

와븨 2022. 11. 6. 02:14

스택 카나리(Stack Canary)

: 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법으로, 카나리 값의 변조가 확인되면 프로세스는 강제 종료된다.

 

 

카나리 생성 과정

: 카나리 값은 프로세스가 시작될 때, TLS에 전역 변수로 저장되고, 각 함수마다 프롤로그와 에필로그에서 이 값을 참조한다.

 

 

카나리 우회

1. 무차별 대입

무차별 대입으로 x64 아키텍처의 카나리 값을 알아내려면 최대 256^7번, x86 에서는 최대 256^3 번의 연산이 필요하다.

=> 즉, x64 아키텍처의 카나리는 무차별 대입으로 알아내는 것이 현실적으로 어렵고, x86 아키텍처는 구할 수 닝ㅆ지만 실제 서버를 대상으로 무차별 대입을 시도하는 것은 불가능하다.

 

2. TLS 접근

카나리는 TLS에 전역변수로 저장되며, 매 함수마다 이를 참조해서 사용한다. TLS의 주소는 매 실행마다 바뀌지만 만약 실행중에 TLS의 주소를 알 수 있고, 임의 주소에 대한 읽기 또는 쓰기가 가능하다면 TLS에 설정된 카나리 값을 읽거나, 이를 임의의 값으로 조작할 수 있다.

그 뒤, 스택 버퍼 오버플로우를 수행할 때 알아낸 카나리 값 또는 조작한 카나리 값으로 스택 카나리를 덮으면 함수의 에필로그에 잇는 카나리 거사를 우회할 수 있다.

 

3. 스택 카나리 릭

스택 카나리를 읽을 수 있는 취약점이 있다면, 이를 이용하여 카나리 검사를 우회할 수 있다.