상세 컨텐츠

본문 제목

스택카나리(Stack canary)

CS지식 학습

by Tabris4547 2024. 4. 10. 14:46

본문

728x90

카나리(canary)

카나리아라는 새의 일종입니다.

이 새는 산소포화도가 민감하기 때문에

탄광이나 군대 등등

독가스 여부를 확인하는데에 사용이 되었던 걸로 알려져있습니다.

 

 

스택카나리(stack canary)

 

컴퓨터에서도 이 카나리를 본따 만든

스택카나리(stack canary)가 있습니다.

 

그림으로 간단하게 역할을 보겠습니다.

함수가 실행될 때에, 프로세스 스택공간에

카나리값을 저장합니다.

함수가 실행을 종료하는 시점에 

저장했던 카나리값을 현재의 값과 비교합니다.

비교했는데 값이 다르다면

'스택이 깨졌다'라고 판단합니다.

코드상에서는 문제가 없어보이더라도

운영체제상에서 알수없는 요인으로인해

스텍이 오염될 수 있습니다.

그러면 원래 원하는 값과 다른 결과값이 나올 수도 있습니다.

이를 검사할 수 있는 기능이 바로 스택카나리 라고 보시면 되겠습니다.

 

프로그램으로 보기(Crash Utility,Trace32)

먼저 Crash Utility에서 runq명령어로

현재실행되는 CPU와 task주소를 확인합니다.

CPU 0의 task 0xffffffd17553fac0를 수행합니다.

Trace32에서 해당 task struct주소값을 캐스팅한 뒤에

스택카나리를 찾습니다.

어썸블리명령어로 어떻게 싱행이 되는지 

세세하게 분석할 수 있습니다.

x0레지스터에 있는 task_struct의 스택카나리가 저장되어있습니다.

이후 이 값을

x1레지스터에 저장합니다.

x2에서는 함수 실행 후의 스택 카나리 값이 저장되어있습니다.

b.eq 부분에서 x2 x1값을 비교하고

만약 다르다면 bl부분으로 branch하여

__stack_chk_fail을 호출합니다.

이 뜻은 '스텍이 지금 깨졌으니 프로그램을 정지합니다'

라는 걸 의미합니다.

728x90

'CS지식 학습' 카테고리의 다른 글

메모리 가상화(memory virtualization)  (0) 2024.04.29
GIC  (0) 2024.04.18
시스템 콜의 ftrace 분석을 해보자!  (0) 2024.04.02
익셉션(Exception)  (0) 2024.03.15
인터럽트  (1) 2024.03.13

관련글 더보기

댓글 영역