GCC에서 실행 가능 스택 없이 중첩 함수 간접 호출하기

기사 2: GCC 17 이전 버전에서 중첩 함수를 간접 호출할 때 실행 가능한 스택을 피하는 방법을 설명한다. 트램펄린에서 코드 주소와 정적 체인을 추출해 __builtin_call_with_static_chain으로 직접 호출하고, 스택을 다시 실행 불가능하게 만든다. 이는 보안 문제를 해결하지만, 트램펄린 생성과 비가상화 등의 단점이 있다.

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 출시 후에는 트램펄린 없이도 중첩 함수 호출이 가능해져 더 깔끔한 해결책이 될 것
  • 트램펄린을 함수 디스크립터로 해석하는 방식 등 추가 최적화 아이디어도 탐구 중
Share

이것도 읽어보세요

댓글

이 소식에 대한 의견을 자유롭게 남겨주세요.

댓글 (0)

불러오는 중...