본문 바로가기

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

[Arm][AAPCS] 스택 오염 문제는 어떻게 디버깅할까

스택 오염이나 스택 오버플로우와 같은 문제를 만나면 그 원인을 어떻게 분석할까요? 사실 이런 유형의 문제를 분석하는 정형화된 방법은 없지만 문제를 분석하는 가장 대표적인 패턴은 다음과 같습니다. 



 프로세스가 실행될 때 가장 먼저 호출된 함수가 어느 스택 주소를 사용했는지 파악한다.
 스택 데이터를 분석하면서 어떤 함수 호출 흐름으로 함수가 호출됐는지 점검한다.
 가장 마지막에 호출된 함수가 어떻게 실행됐는지 파악한다.



이와 같은 단계를 거치면서 프로세스의 스택에 저장된 데이터를 분석하면, 어느 함수까지 정상적으로 호출되다가 어느 함수에서 문제가 생겼는지 파악할 수 있습니다.

스택 오염이나 스택 오버플로우가 생기면 GDB와 같은 디버깅 프로그램은 함수가 호출된 실행 흐름을 제대로 출력해주지 못합니다. AAPCS의 원칙에 따라 GDB 프로그램이 구현돼 있는데, 스택 오염이나 스택 오버플로우가 발생한 상황에서는 GDB도 콜 스택을 표현하지 못합니다.

결국 개발자들이 프로세스의 스택 공간에 저장된 데이터를 하나 하나 보면서 함수의 호출 흐름을 파악해야 합니다.