시스템 해킹_4주차

2022. 9. 30. 22:2422-2학기 (SISS)/시스템해킹

https://dreamhack.io/lecture/roadmaps/2

 

System Hacking

시스템 해킹을 공부하기 위한 로드맵입니다.

dreamhack.io

4주차 (9/26 ~ 10/2) : STAGE 6


STAGE 6 : Stack Canary

1. Stack Canary


[Mitigation : Stack Canary]

1. 들어가며

스택 버퍼 오버플로우로부터 반환 주소를 보호하는 스택 카나리에 대해 배울 것임

 

2. 카나리의 작동 원리

1) 카나리 정적 분석

-카나리 비활성화

: Ubuntu 18.04의 gcc는 스택 카나리를 적용하여 바이너리를 컴파일한다.

컴파일 옵션으로 -fno-stack-protector옵션을 추가하면 카나리 없이 컴파일할 수 있다.

2) 카나리 정적 분석 | 카나리 활성화

카나리를 적용하여 다시 컴파일하고, 입력을 주면 에러가 발생한다. 이는 스택 버퍼 오버플로우가 탐지되어 프로세스가 강제 종료되었음을 의미한다.

3) 카나리 동적 분석

-카나리 저장

추가된 프롤로그의 코드에 중단점을 설정하고 바이너리를 실행시키면 생성한 랜던값이 저장된다.

fs :0x28의 데이터를 rax에 저장한다.

4) 카나리 동적 분석 | 카나리 검사

추가된 에필로그의 코드에 중단점을 설정하고 바이너리를 계속 실행시키면 rbp-0x8에 저장된 카나리 값이 버퍼 오버플로우로 인해 “0x4848484848484848”이 된 것을 확인할 수 있다.

 

3. 카나리 생성 과정

1) 카나리 생성 과정

카나리 값은 프로세스가 시작될 때, TLS에 전역 변수로 저장되고 각 함수마다 프롤로그와 에필로그에서 이 값을 참조한다.

-TLS의 주소 파악

fs는 TLS를 가리키므로 fs의 값을 알면 TLS의 주소를 알 수 있는데, 리눅스에서는 특정 시스템 콜을 사용해야만 조회하거나 설정할 수 있다. 그래서 리눅스에서는 fs의 값을 설정할 때 호출되는 시스템 콜에 중단점을 설정한다.

2) 카나리 값 설정

gdb의 watch 명령어는 특정 주소에 저장된 값이 변경되면 프로세스를 중단시킨다. 

 

4. 카나리 우회

1) 카나리 우회

카나리를 우회하는 방법에는 무차별 대입(Brute Force)와 TLS 접근이 있다.

2) 카나리 값 구하기

스택 카나리를 읽을 수 있는 취약점이 있으면 이를 이용해 카나리 검사를 우회할 수 있다.

 

5. 마치며

즉, 카나리는 함수 시작시 스택 버퍼와 Return Address 사이에 랜덤 값을 삽입한 후 함수 종료 시 해당 랜덤 값의 변조 여부를 확인하여 메모리 오염 여부를 확인하는 보호 기법이다.


[Quiz : Stack Canary]


2. [혼자실습] Stack Canary


3. 함께 실습 [Stack Canary]

 

'22-2학기 (SISS) > 시스템해킹' 카테고리의 다른 글

시스템해킹_3주차  (1) 2022.09.23
시스템해킹_2주차  (0) 2022.09.22
시스템해킹_1주차  (0) 2022.09.11