본문 바로가기

System Hacking

Stack Canary

1. 정의

  • 스택 버퍼 오버플로우로부터 반환 주소를 보호하는 기법이다.
  • x64아키텍처는 8Byte의 카나리가 생성되며, x86아키텍처는 4byte의 카나리가 생성된다.
    ( NULL바이트가 포함되어, 실제로는 7byte와 3byte로 생성된다. )

2. 동작과정

① 함수의 프롤로그에서 스택 버퍼와 반환주소 사이에 임의의 값을 삽입한다.

② 함수의 에필로그에서 임의 값이 변조되었는지 확인한다.

③ 임의의 값이 변조되었다면, BOF가 발생한 것으로 인식해서 프로세스가 강제 종료된다.

3. 카나리 적용없이, 컴파일하고 싶은 경우

  • Ubuntu 18.04의 gcc는 기본적으로 스택 카나리를 적용해서 바이너리를 적용한다.
  • 따라서, 아래와 같은 컴파일 옵션을 추가해야, 카나리 없이 컴파일이 가능하다.
-fno-stack-protector

4. 카나리 생성과정

① 카나리 값은 프로세스가 시작될 때마다, 새로운 임의의 값으로 TLS에 전역변수로 저장된다. 

② fs는 TLS를 가르키므로, fs값을 알면 TLS를 알아낼 수 있다.

5. 카나리 우회

① TLS접근 

- 카나리 TLS에 전역 변수로 저장되므로, 이 값을 읽거나 조작할 수 있으면 카나리를 우회할 수 있다.

 

② 스택 카나리 릭

- 함수 프롤로그에 스택에 카나리 값을 저장하므로, 이를 읽어낼 수 있으면 카나리를 우회할 수 있다.

- 가장 현실적인 카나리 우회 기법이다.

 

6. 카나리 관련 Wargame

2022.06.26 - [Wargame/Dreamhack] - [Wargame] ssp_001

'System Hacking' 카테고리의 다른 글

Fake EBP  (0) 2022.08.03
RTC (Return To CSU)  (0) 2022.07.04
RTL (Return to Library)  (0) 2022.06.29
PLT & GOT  (0) 2022.06.27
NX & ASLR  (0) 2022.06.27