상세 컨텐츠

본문 제목

03. Canaries

Computer Science/Linux System

by RACC8N 2020. 3. 8. 17:50

본문

Canaries

  • Canaries 또는 Canary word는 버퍼 오버 플로우를 모니터하기 위해 버퍼와 제어 데이터 사이에 설정 된 값이다.
  • 버퍼 오버플로가 발생하면 Canary 값이 손상되며, Canaries 데이터의 검증에 실패하여, 오버플로에 대한 경고가 출력되고, 손상된 데이터를 무효화 처리된다.

Types of canaries

Terminator canaries

  • Terminator Canaries는 Canary의 값을 문자열의 끝을 나타내는 문자들을 이용해 생성한다.
  • Terminator Canaries의 값은 NULL (0x00), CR (0x0d), LF (0x0a) 및 EOF (0xff)로 구성되어 있다.
    • 공격자는 Canaries를 우회하기 위해 위해 Return address를 쓰기 전에 null 문자를 써야 한다.
    • null문자로 인해 Overflow를 방지하게 된다.
      • strcpy()는 null문자의 위치까지 복사한다.

Random canaries

  • Random Canaries는 Canary의 값을 랜덤하게 값이 생성한다.

    • 일반적으로 익스플로잇을 이용해 Canary를 읽는 것은 논리적으로 불가능하다. 

  • Random Canaries는 프로그램 초기 설정 시에 전역 변수에 Canary 값이 저장된다. 

    • 이 값은 보통 매핑되지 않은 페이지에 저장됩니다. 

      • 해당 메모리를 읽으려는 시도를 할 경우 segmentation fault가 발생하고 프로그램이 종료된다.

    • 공격자가 Canary 값이 저장된 stack address를 알거나 스택의 값을 읽어올수 있는 프로그램이 있다면 Canary의 값을 확인 할 수 있다.

Random XOR canaries

  • Random XOR Canaries는 Canary의 값을 모든 제어 데이터 또는 일부를 사용해 XOR-scramble 하여 생성한다.
    • 이 방식은 Canary의 값, 제어 데이터가 오염되면 Canary의 값이 틀려진다.
  • Random XOR Canaries는 Random Canaries와 동일한 취약점을 가지고 있다.
    • 단지 Canary 값을 Stack에서 읽어오는 방법이 조금더 복잡해진다.
    • 공격자는 canary를 다시 인코딩 하기위해 Original Canary 값, 알고리즘, 제어 데이터가 필요하다.

Bild command (set Canary)

Option

gcc -fstack-protector –param ssp-buffer-size=N xx.c   ==> byte 변경
gcc -fstack-protector-all xx.c                                     ==> 모든 함수 보호

 

Build Command(Do not set Canary)

gcc -fstack-protector -o canary canary.c

 

Binary

  • 다음과 같은 방법으로 바이너리의 Canary 설정여부를 확인한다.
    • 'readelf' 명령어를 이용해 해당 파일의 심볼 테이블 정보를 가져와 Canary 설졍여부를 확인한다.
    • 파일의 심볼 테이블에 "__stack_chk_fail"가 있으면 Canary가 적용되었다고 판단한다.

>  readelf -s ./Canary_Do-not-set |grep __stack_chk_fail

 

Process

  • 다음과 같은 방법으로 프로세서의 Canary 설정여부를 확인한다.
    • Binary의 확인 방식과 비슷하며, 전달되는 파일의 경로가 다음과 같이 다르다.
      • Ex) /proc/<PID>/exe
    • 추가된 동작은 '/proc/<PID>/exe' 파일에 'Symbol table' 정보가 있는지 확인한다.

>  readelf -s /proc/12602/exe |grep '__stack_chk_fail'

'Computer Science > Linux System' 카테고리의 다른 글

Lazy binding (Feat. Now binding)  (0) 2020.03.09
04. RELRO  (0) 2020.03.09
02. ASLR  (0) 2020.03.08
01. NX Bit (MS : DEP)  (0) 2020.03.08

관련글 더보기

댓글 영역