재미와 탐구를 위한 macOS 코드 인젝션 분석 (2024)

2024년 7월 20일, 개발자 Mario Zechner는 Windows의 Live++ 도구에서 영감을 얻어 macOS 환경에서 Mach API를 이용한 코드 주입(Code Injection) 실험 과정을 공개했습니다. 이 실험은 실행 중인 프로세스에 부착하여 메모리 값을 수정하고, -fpatchable-function-entry 플래그를 통해 실시간으로 함수 로직을 교체하는 기술적 구현을 다룹니다.

AI 요약

본 기사는 2024년 7월 20일, 저자가 휴가 중 Adriatic Sea 인근에서 진행한 macOS 코드 주입 실험을 상세히 기록한 기술 블로그입니다. 저자는 Windows, Xbox 등에서 사용되는 C/C++ 핫리로드 솔루션인 'Live++(Stefan Reinalter 개발)'의 편의성을 macOS에서도 구현해보고자 이번 프로젝트를 시작했습니다. 실험의 핵심은 실행 중인 대상 프로그램에 디버거처럼 부착하여 메모리 내 변수 값을 변경하거나, 기존 함수를 완전히 새로운 코드로 대체하는 것입니다. 이를 위해 macOS의 저수준 시스템 API인 Mach API를 활용했으며, CMake 설정부터 코드 서명(codesign) 및 권한(entitlements) 부여까지의 전 과정을 설명합니다. 특히 컴파일 시 함수 시작 부분에 여유 공간을 만드는 특정 플래그를 사용하는 등 실전적인 트릭을 포함하고 있습니다.

핵심 인사이트

  • Live++의 영향: Stefan Reinalter가 개발한 Windows용 핫리로드 도구 Live++의 효율성을 macOS로 이식하려는 시도에서 프로젝트가 시작되었습니다.
  • Mach API 활용: macOS 전용 API인 task_for_pid() 등을 사용하여 프로세스 제어 및 메모리 접근을 수행했습니다.
  • 컴파일러 전략: 실시간 함수 교체를 위해 -fpatchable-function-entry=4,0 플래그를 사용하여 함수 진입점에 수정 가능한 공간을 확보했습니다.
  • 보안 및 권한: macOS의 보안 정책을 통과하기 위해 codesign 명령어를 통한 바이너리 서명과 entitlements.plist 설정이 필수적임을 명시했습니다.

주요 디테일

  • 시스템 타겟: CMake 설정에서 CMAKE_OSX_DEPLOYMENT_TARGET을 "10.14"로 설정하고 C++17 표준을 적용했습니다.
  • 최적화 제외: 정확한 주소 추적과 분석을 위해 -O0 -g 플래그를 사용하여 디버그 빌드를 생성했습니다.
  • 주입 프로세스: 실행 중인 프로세스 부착(Attaching), 프로세스 일시 정지(Suspending), 메모리 읽기/쓰기, 코드 주입 및 실행 재개의 단계로 진행됩니다.
  • 테스트 케이스: int data = 123;을 출력하는 무한 루프 프로그램의 메모리를 조작하여 출력값을 실시간으로 변경하는 데 성공했습니다.
  • 코드 서명 자동화: POST_BUILD 명령을 통해 Apple Development 인증서로 자동 서명되도록 CMake 구성을 설계했습니다.

향후 전망

  • macOS 개발 툴체인 확장: 이 기법을 고도화하면 macOS용 독자적인 C++ 핫리로드 개발 도구 제작의 기반 기술로 활용될 수 있습니다.
  • 보안 패치와의 경쟁: Apple이 시스템 무결성 보호(SIP)를 강화함에 따라 이러한 Mach API 기반 접근 방식에 대한 제약이 늘어날 수 있어 지속적인 우회 및 대응 연구가 예상됩니다.
Share

댓글

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

댓글 (0)

불러오는 중...