[Pwnable] 7. Mitigation: Stack Canary

Wonder_Land🛕·2022년 10월 20일
0

[Pwnable]

목록 보기
7/21
post-thumbnail

[Reference] : 위 글은 다음 내용을 제가 공부한 후, 인용∙참고∙정리하여 만들어진 게시글입니다.


  1. 서론
  2. 카나리의 작동 원리
  3. 카나리 생성 과정
  4. 카나리 우회
  5. Q&A
  6. 마치며

1. 서론

스택 버퍼 오버플로우 공격 기법은 역사가 오래되었기 때문에 관련된 보호 기법도 등장했습니다.

그 중 하나가 '스택 카나리(Stack Canary)'입니다.

  • 스택 카나리(Stack Canary)
    : 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법

스택 버퍼 오버플로우로 반환 주소를 덮으려면 반드시 카나리를 먼저 덮어야 하므로,
카나리 값을 모르는 공격자는 반환 주소를 덮을 때, 카나리 값을 변조하게 됩니다.

이를 함수의 에필로그에서 비교하여, 공격자는 실행 흐름을 획득하지 못합니다.


2. 카나리 정적 분석

3. 카나리 동적 분석

(2, 3 내용은 강의를 직접 참고)


4. 카나리 우회

1) 무차별 대입(Brute Force)

x86 아키텍처에서 카나리는 4바이트,
x64 아키텍처에서는 8바이트로 생성됩니다.

각각의 카나리에는 NULL 바이트가 포함되어 있으므로,
실제로는 각각 3바이트, 7바이트의 랜덤한 값이 포함됩니다.

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

현실적으로 연산량이 매우 많아서 무차별 대입으로 알아내는 것 자체는 어렵습니다.

2) TLS 접근

카나리는 TLS에 전역변수로 저장되며, 매 함수마다 이를 참조해서 사용합니다.

TLS의 주소는 매 실행마다 바뀌지만,
만약 실행 중에 TLS의 주소를 알 수 있고, 임의 주소에 대한 읽기 및 쓰기가 가능하다면,
TLS에 설정된 카나리 값을 읽거나 이를 임의의 값으로 조작할 수 있습니다.

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

3) 스택 카나리 릭

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


5. Q&A

-


6. 마치며

[Reference] : 위 글은 다음 내용을 제가 공부한 후, 인용∙참고∙정리하여 만들어진 게시글입니다.

profile
아무것도 모르는 컴공 학생의 Wonder_Land

0개의 댓글