본문 바로가기

시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리/11장: AAPCS(함수 호출 규약)

[Arm][AAPCS] 스택 오버플로우란

프로세스에게 부여된 스택의 경계선을 넘어서서 스택에 데이터를 저장하거나 로딩하는 동작을 '스택 오버플로우'라고 하며, 그 결과 시스템은 대부분 오동작합니다. 

이번에는 다음 그림을 보면서 스택 오버플로우가 무엇인지 자세히 알아봅시다.

그림 8.2 스택 오버플로우가 발생하는 상황

프로세스에게 할당된 스택 공간의 범위는 0xFFFFFF8008058000--0xFFFFFF800805C000이며, SP 레지스터의 범위는 0xFFFFFF8008058000--0xFFFFFF800805C000 구간입니다.

프로세스의 스택은 높은 주소에서 낮은 주소 방향으로 사용되는데 그림 8.2의 박스 왼쪽에 보이는 화살표 방향은 함수가 호출되는 실행 흐름을 나타냅니다. 화살표의 아랫 부분에서 윗 부분을 눈으로 따라가 보면 __handle_domain_irq() 함수가 보입니다. 그런데 __handle_domain_irq() 함수에서 handle_fasteol_irq() 함수를 호출합니다. 

그림의 윗 부분을 보면 프로세스의 스택 윗 부분에 회색으로 표기된 부분에 handle_fasteol_irq() 함수가 보입니다. 이는 함수가 호출될 때 호출 깊이가 깊어져 스택 주소를 넘어서서 스택을 사용해 프로세스를 호출하는 현상을 나타냅니다.
 
그림에서 보다시피, 프로세스의 스택 최상단 주소인 0xFFFFFF8008058000 주소 윗 부분에 다른 중요한 데이터가 저장돼 있다면 데이터는 오염될 것입니다.