IAR Embedded Workbench 에서 스택 보호
소프트웨어에서 스택 버퍼 오버플로우는 프로그램이 일반적으로 고정 길이의 버퍼인 의도된 데이터 구조 외부의 프로그램 호출 스택에 있는 메모리 주소에 쓸 때 발생합니다. 그 결과, 거의 항상 주변 데이터가 손상되며 반환할 기능이 변경될 수도 있습니다. 의도적인 경우 스택 스매싱이라고 합니다. 스택 버퍼 오버플로우를 방지하는 한 가지 방법은 탄광에서 카나리아를 사용하는 것과 유사하기 때문에 스택 카나리아를 사용하는 것입니다. 스택 보호는 주로 IAR Embedded Workbench의 모든 최신 릴리스에 사용할 수 있습니다.
IAR Embedded Workbench for Arm의 스택 보호 구현에서는 잘 알려진 접근 방식을 사용하여 함수에 스택 보호가 필요한지 여부를 결정합니다. 정의된 로컬 변수가 어레이 유형 또는 어레이 유형의 멤버를 포함하는 구조 유형을 가진 경우 함수에 스택 보호가 필요합니다. 또한 로컬 변수의 주소가 함수 외부로 전파되는 경우 이러한 함수에는 스택 보호도 필요합니다.
함수에 스택 보호가 필요한 경우 어레이 유형의 변수를 함수 스택 블록에서 최대한 높게 배치하도록 로컬 변수가 정렬됩니다. 이러한 변수 뒤에는 카나리아 요소가 배치됩니다. 카나리아는 함수 입구에서 초기화됩니다. 초기화 값은 글로벌 변수 __stack_chk_guard에서 가져옵니다. 함수 종료 시 코드는 카나리아 요소에 초기화 값이 여전히 포함되어 있는지 확인합니다. 없으면 __stack_chk_fail 함수를 호출합니다.
스택 보호가 필요하다고 간주되는 기능에 대해 스택 보호를 사용하도록 설정하려면 컴파일러 옵션을 사용하십시오.
--stack_protection.
프로그램에 스택 보호를 제공
스택 보호를 사용하려면 애플리케이션에서 다음과 같은 오브젝트를 정의해야 합니다.
- extern uint32_t__stack_chk_guard.
글로벌 변수 __stack_chk_guard를 처음 사용하기 전에 초기화해야 합니다. 초기화 값이 임의화된 경우 더 안전합니다. - __interwork __nounwind __noreturn void __stack_chk_fail(void)
__stack_chk_fail 함수의 목적은 문제를 알리고 응용 프로그램을 종료하는 것입니다. 이 기능의 반환 주소는 실패한 함수를 가리킵니다.
디렉토리 arm\src\lib\runtime의 stack_protection. 파일을 __stack_chk_guard 및 __stack_chk_fail 모두에 대한 템플릿으로 사용할 수 있습니다.