본문 바로가기
Security/Reversing

데이터 보호 기법-Canary

by jino22 2021. 11. 11.

틀린 부분이 있다면 언제든지 댓글 남겨주세요!


Canary 란?

함수 호출 시에 스택에 카나리아 값을 설정하고, 함수가 종료하기 직전 값의 변조 유무를 검사

(이를 이용하여 스택 오버플로우가 발생 했는지 여부를 확인할 수 있음)

이 값은 컴파일 단계에서 추가되며, 옵션으로 SSP(stack smashing protector)사용/ SSP끄기 설정

Windows에서는 GS or Stack Cookie / Linux에서는 Stack Canary라고 불림

 

Canary 종류

- Terminator canary

: \xff(EOF), \x00(null), 0x0a(LF) 와 같이 문자열의 끝을 나타내는 문자 이용

 

- Random canary

: 랜덤하게 값 생성, 프로그램 초기 설정시 전역 변수에 값 저장

 

- Random XOR canary

: canary값과 제어 데이터(또는 일부 데이터)를 XOR 하여 사용, 값이 달라지면 1을 반환하는 특징 사용

 

 

 

Visual Studio 2017 기준 설정 방법

프로젝트 속성 -> C/C++ -> 코드 생성 -> 보안 검사 -> 보안 검사 사용(/GS)

 

 

gcc를 이용하여 컴파일하고 gdb에서 분석

* gdb peda는 기존 gdb보다 binary분석할 때 편하게 보여주는 프로그램

[ GDB peda 설치 방법 ]

$  git clone https://github.com/longld/peda.git ~/peda
$  echo "source ~/peda/peda.py" >> ~/.gdbinit
  • Canary 설정을 enable 한 상태에서 예시 코드를 실행한 결과
    -fstack-protector

 

  • Canary를 disable한 상태에서 코드를 실행한 결과
    -fno-stak-protector

 

 >> 함수가 시작되고 [rbp-0x8]에 값을 저장해두고, 함수가 끝날 때 저장해둔 값과 xor를 통해 변조 여부를 검사하여

      같지 않은 경우 0x796(call 0x5f0)으로 분기되도록 되어 있음을 확인할 수 있다.

 

 

[ Canary 를 우회하기 위한 방법 ]

1. 메모리 상태의 프로세스 정보 접근 (실행중인 프로세스 상의 값을 추적 및 변조 시도)
2. 카나리아 값이 맞지 않으면 오류 처리 루틴이 수행되는 것을 예측하여 SEH부분까지 오버플로우 시킴 (오류처리 루틴의 주소를 쉘코드로 바꿔 오류 발생시 해당 주소로 가도록)
3. 카나리아 값이 사용되지 않은 함수 찾음 (무차별 대입공격)

 

 

 

참고: https://www.lazenca.net/display/TEC/03.Canaries

728x90
반응형

'Security > Reversing' 카테고리의 다른 글

명령어 집합구조 (ISA)  (0) 2022.07.20
[Malwarebytes] crackme 1  (0) 2021.12.09
UAF 공격  (0) 2021.11.06
[CodeEngn] Challenges Basic RCE L20  (0) 2021.10.18
디버깅 탐지 방법  (0) 2021.10.15

댓글