AI 요약
GCC의 중첩 함수(nested function)를 실행 가능한 스택 없이 간접 호출하는 방법을 다루는 기술 기사다. GCC 17과 Clang에서는 새로운 내장 함수를 사용할 수 있지만, 이전 버전 GCC에서는 트램펄린(trampoline)을 스택에 생성해 실행하는 방식이 필요했다. 저자는 트램펄린에서 코드 주소와 정적 체인(static chain) 값을 추출해 __builtin_call_with_static_chain 내장 함수로 직접 호출하는 해킹을 제안한다. 이렇게 하면 실제로 트램펄린을 실행하지 않으므로 스택을 다시 비실행 가능(non-executable)으로 설정할 수 있어 보안 문제를 해결할 수 있다. 이 아이디어는 저자의 실험적 라이브러리 'noplate'에 구현되어 있다.
핵심 포인트
- GCC의 중첩 함수는 스택에 트램펄린(코드+정적 체인)을 생성해 간접 호출
- 트램펄린에서 코드 주소와 정적 체인을 추출해
__builtin_call_with_static_chain으로 직접 호출 가능 - 스택을
mprotect등으로 비실행 가능하게 되돌려 보안 문제 해결 - GCC 17에서 새 내장 함수(
__builtin_call_static_chain,__builtin_call_code_adress)가 도입될 예정
향후 전망
- GCC 17 출시 후에는 트램펄린 없이도 중첩 함수 호출이 가능해져 더 깔끔한 해결책이 될 것
- 트램펄린을 함수 디스크립터로 해석하는 방식 등 추가 최적화 아이디어도 탐구 중
출처:hackernews
