시스템 해킹/Lazenca

[Lazenca] Canaries

ruming 2021. 2. 27. 14:04

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문자의 위치까지 복사한다.

이 보호에도 불구하고 공격자는 잠재적으로 canary를 알려진 값으로 겹쳐쓰고 정보를 틀린 값들로 ㅔㅈ어해서 canary 검사 코드를 통과할 수 있다.

 

Random canaries

random canaries는 canary의 값을 랜덤하게 생성한다.. 일반적으로 익스플로잇을 이용해 canary를 읽는 것은 논리적으로 불가능하다.  random canaries는 프로그램 초기 설정 시에 전역 변수에 canary 값이 저장된다. 이 값은 보통 매핑되지 않은 페이지에 저장된다. 해당 메모리를 읽으려는 시도를 할 경우 segmentation fault가 발생하고 프로그램이 종료된다.

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

 

Random XOR canaries

Canary의 값을 모든 제어 데이터 도는 일부를 사용해 XOR-scramble 하여 생성한다. 이 방식은 canary의 값, 제어 데이터가 오염되면 canary의 값이 틀려진다.

Random Canaries와 동일한 취약점을 가지고 있다. 단지 canary 값을 stack에서 읽어오는 방법이 조금 더 복잡해진다. 공격자는 canary를 다시 인코딩하기 위해 original canary값, 알고리즘, 제어 데이터가 필요하다.

 

Option

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

Do not set Canary

gcc -fstack-protector -o canary canary.c

 

 

'시스템 해킹 > Lazenca' 카테고리의 다른 글

[Lazenca] ASLR  (0) 2021.02.27
[Lazenca] NX bit  (0) 2021.02.21