Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
ghidra_kernelcache — iOS 커널캐시 리버스 엔지니어링을 위한 Ghidra 프레임워크 | Kitploit
도구/GitHubGitHub/0x36/ghidra_kernelcache
iOS SecurityReverse EngineeringBinary AnalysisFirmware Analysis
GitHub0x36/ghidra_kernelcache

ghidra_kernelcache

iOS 커널캐시 리버스 엔지니어링을 위한 Ghidra 프레임워크

저장소 보기
37037154년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

ghidra_kernelcache: 리버스 엔지니어링을 위한 Ghidra iOS 커널캐시 프레임워크

이 프레임워크는 커널캐시 리버스 엔지니어링 경험의 최종 결과물입니다. 저는 일반적으로 커널과 그 확장을 수동으로 감사하여 취약점을 찾고, 리버싱 과정을 가속화하기 위해 Ghidra에서 보고 싶었던 대부분의 작업을 자동화했습니다. 이는 효과적이며 많은 시간을 절약해 주었습니다. 이 프레임워크는 iOS 12/13/14/15 및 macOS 11/12(커널캐시 및 단일 KEXT 모두)에서 작동하며, 사용자가 자체 환경을 준비하는 번거로움 없이 iOS 커널 연구를 시작할 수 있도록 돕기 위해 공개되었습니다. 제 생각에, 이 프레임워크(제공하는 도구 세트와 IOKit에 대한 기본 지식만 있으면)는 커널캐시 해킹을 시작하기에 충분합니다.

프레임워크는 전적으로 Python으로 작성되었으며, 다른 도구를 구축하도록 확장할 수 있습니다. 거의 모든 프로젝트에서 사용할 수 있고 장황한 매뉴얼을 읽는 시간을 절약해 주는 기본 API를 제공합니다. 핵심 기능은 utils/ 디렉토리에서 확인할 수 있습니다.

Ghidra는 커널캐시 분석에 좋지만, 다른 리버스 엔지니어링 도구와 마찬가지로 수동 작업이 필요합니다. ghidra_kernelcache는 시작 시점과 리버스 엔지니어링 중에도 문제를 수정할 수 있는 좋은 진입점을 제공하여 보기 좋은 디컴파일러 출력을 제공합니다.

@_bazad가 IDAPro로 만든 유사한 프로젝트 ida_kernelcache가 있으며, 이는 IDA에서 커널 이미지로 작업하려는 연구자들에게 좋은 진입점을 제공합니다. 제 프레임워크는 Brandon의 작업과 약간 비슷하지만, 커널캐시 작업 과정을 덜 고통스럽게 만들기 위해 훨씬 더 많은 기능을 제공합니다.

기능:

  • *OS 커널캐시 심볼리케이션.
  • C++ 클래스 계층 구조 재구성 및 가상 테이블.
  • 가상 메서드 호출 참조.
  • ::externalMethod() 및 ::getTargetAndMethodForIndex() 모두에 대한 외부 메서드 디스패치 테이블 자동 수정.
  • 클래스 메서드에 네임스페이스 적용.
  • 함수 인수에 대한 심볼 이름 및 타입 전파.
  • 알려진 커널 함수에 대한 함수 시그니처 적용.
  • 이전 프로젝트에서 새 프로젝트로 이전 구조체 및 클래스 가져오기.

이러한 기능은 별도의 도구로 만들어졌으며, 키 단축키를 사용하거나 도구 모음의 아이콘을 클릭하여 실행할 수 있습니다.

설치

저장소를 클론합니다:```sh git clone https://github.com/0x36/ghidra_kernelcache.git

**중요 참고**: 이 프로젝트는 Ghidra 10.1_PUBLIC 및 10.2_DEV에서 테스트되었으며, 이전 버전과 호환되지 않습니다.

*`Windows → Script Manager`* 로 이동하여 *`스크립트 디렉터리`* 를 클릭한 다음 *`ghidra_kernelcache`* 를 디렉터리 경로 목록에 추가합니다.
*`Windows → Script Manager`* 로 이동하여 *스크립트* 목록에서 *`iOS→kernel`* 범주로 이동하고 거기에 표시된 플러그인을 체크하면 GHIDRA 툴바에 나타납니다.

[logos/](https://github.com/0x36/ghidra_kernelcache/tree/master/logos) 디렉터리에 각 도구에 대한 자체 로고를 넣을 수 있습니다.

## iOS kernelcache 심볼리케이션

`ghidra_kernelcache`는 첫 번째 단계에서 [iometa](https://github.com/Siguza/iometa/)([@s1guza](https://twitter.com/s1guza) 제작)를 필요로 합니다. iometa는 커널 바이너리에서 C++ 클래스 정보를 제공하는 강력한 도구로, 독립 실행형 바이너리로 작동하여 출력물을 구문 분석만 하면 원하는 RE 프레임워크로 가져올 수 있다는 큰 장점이 있습니다. 제 프레임워크는 iometa의 출력을 가져와 구문 분석하여 심볼리케이션(symbolicate)하고 가상 테이블을 수정합니다.

### 사용법

커널의 압축을 푼 후, 다음 명령어를 실행합니다 :```sh
$ iometa -n -A /tmp/kernel A10-legacy.txt > /tmp/kernel.txt
# if you want also to symbolicate using jtool2
$ jtool2 --analyze /tmp/kernel

Ghidra에서 kernelcache를 로드할 때, 일괄 가져오기를 사용하지 말고 Mach-O 이미지로 로드하세요. Kernelcache가 로드되고 자동 분석이 완료되면, 도구 모음에 표시된 아이콘을 클릭하거나 Meta-Shift-K를 누른 다음, iometa 출력의 전체 경로(이 경우 /tmp/kernel.txt)를 입력하세요.

jtool2 심볼을 사용하려면, iOS→kernel 카테고리에 있는 jsymbol.py를 사용할 수도 있습니다.

iOS kernelcache API

전체 API 예제는 ghidra_kernelcache/kc.py에 있습니다.

→ 다음은 클래스 객체를 조작하는 몇 가지 예제입니다:```py from utils.helpers import * from utils.class import * from utils.iometa import ParseIOMeta

ff = "/Users/mg/ghidra_ios/kernel.txt" iom = ParseIOMeta(ff) Obj = iom.getObjects() kc = kernelCache(Obj)

symbolicate the kernel

kc.process_all_classes()

symbolicate the classes under com.apple.iokit.IOSurface bundle

kc.process_classes_for_bundle("com.apple.iokit.IOSurface")

symbolicate the classes under kernel bundle

kc.process_classes_for_bundle("kernel")

Process one class (including its parents)

kc.process_class("IOGraphicsAccelerator2")

Clears the content of the class structures (vtables are excluded)

kc.clear_class_structures()

Overwrite the old vtable structure definition and resymbolicate it again

kc.update_classes_vtable()

Reconstructing function call trees by enumerating all pac references and find their corresponding virtual method call

kc.explore_pac()

보시다시피 kernelcache를 전체 또는 부분적으로 심볼리케이션할 수 있습니다. 부분 심볼리케이션을 선택한 경우, `ghidra_kernelcache`는 진행 전에 모든 클래스 의존성을 자동으로 구성합니다. 전체 kernelcache에 대해 스크립트를 실행(전체 심볼리케이션)하면 `ghidra_kernelcache`가 커널 이미지를 분석하는 데 몇 분이 소요됩니다.

완료되면 Ghidra는 다음을 제공합니다:

→ "iOS"라는 새 카테고리가 북마크 필터(Bookmark Filter)에 추가됩니다:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image1.png" alt="이미지1" width="200"/>
                    
                    
→ IOKit 클래스 가상 테이블이 'iOS' 북마크에 추가되어 더 빠르고 효율적인 가상 테이블 검색이 가능합니다. 검색창에 문자, 단어 또는 kext 번들을 입력하여 kext나 클래스를 찾을 수 있습니다.

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image2.png" alt="이미지2"/>


→ 가상 테이블 수정: 알 수 없는 코드를 디스어셈블/컴파일하고, 네임스페이스를 수정하며, 클래스 메서드를 다시 심볼리케이션하고 각 메서드에 함수 정의를 적용합니다:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image3.png" alt="이미지3"/>

→ 클래스 네임스페이스를 생성하고 각 메서드를 해당 네임스페이스에 배치합니다:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image4.png" alt="이미지4"/>

→ 클래스 계층 구조를 고려한 클래스 구조를 생성합니다:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image5.png" alt="이미지5"/>

→ 클래스 vtable을 생성하고, 각 메서드에는 더 나은 디컴파일 출력을 위한 자체 메서드 정의가 포함됩니다:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image6.png" alt="이미지6"/>

전체 구현은 [`utils/class.py.`](https://github.com/0x36/ghidra_kernelcache/blob/master/utils/class.py)에서 확인할 수 있습니다.

다음은 `ghidra_kernelcache`를 사용한 심볼리케이션 전후의 스크린샷입니다:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image7.png" alt="이미지7"/>

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image8.png" alt="이미지8"/>




## macOS Kext 심볼리케이션
---
`ghidra_kernelcache`의 macOS 지원은 ARM64e 및 x86_64 아키텍처에서 kernelcache와 단일 KEXT 심볼리케이션 모두를 위한 것입니다. 
**중요:** 현재 시점에서 Ghidra는 전체 macOS kernelcache를 파싱할 수 없지만, IDA에 로드하여 초기 분석을 수행한 후 데이터베이스(idb를 xml로)를 Ghidra로 가져오는 것은 가능합니다. 그러나 이는 범위를 벗어납니다. 직접 처리할 수 있다면 `ghidra_kernelcache`가 나머지를 처리합니다.

macOS 커널 익스텐션을 심볼리케이션하기 전에 몇 가지 단계를 거쳐야 합니다. `ghidra_kernelcache`의 주요 목표는 클래스 계층 구조를 재구성하고 모든 클래스 구조를 단일 데이터베이스로 관리하는 것이기 때문에, 커널 익스텐션만으로는 이러한 요구 사항을 충족할 수 없습니다. 즉, 단일 KEXT의 심볼리케이션은 커널의 심볼리케이션과 해당 KEXT가 의존하는 다른 커널 익스텐션의 심볼리케이션이 필요하므로 추가 작업이 필요합니다.
`ghidra_kernelcache`는 이제 Ghidra의 강력한 *DataType Project Archive*를 통해 클래스 구조와 가상 메서드 정의를 관리하고 공유함으로써 커널을 포함한 커널 익스텐션을 심볼리케이션하는 강력한 방법을 제공합니다.

### 커널 익스텐션 심볼리케이션 단계
- Ghidra 프로젝트에 새 폴더를 만든 다음, ` /System/Library/Kernels/kernel.release.XXXXX`를 해당 폴더에 로드하고 Ghidra가 이를 분석하도록 합니다.
- 새 *Project Archive*를 만듭니다: `DataType Provider`로 이동 → 창의 오른쪽 상단에 있는 화살표 클릭 → `New Project Archive` → 새로 만든 폴더 안에 배치 → 적절한 이름으로 지정합니다(예: macOS_12.1). 
- 이제 `ghidra_kernelcache`를 사용하여 커널을 심볼리케이션합니다. 이 과정은 iOS *kernelcache* 심볼리케이션과 매우 유사합니다.```bash
$ iometa -n -A /System/Library/Kernels/kernel.release.t8101 > /tmp/kernel.txt
  • 파이썬 콘솔에서, 또는 전체 스크립트 구현은 KM.py 스크립트에서 찾을 수 있습니다:```py

from utils.helpers import * from utils.kext import * iom = ParseIOMeta("/tmp/kernel.txt") Obj = iom.getObjects() kc = Kext(Obj,shared_p="macOS_12.1") kc.process_kernel_kext()

- 완료되면, 커널 아카이브와 `macOS_12.1` 아카이브 간의 데이터베이스 연결이 생성됩니다. 이제 `kernel.release.t8001`을 마우스 오른쪽 버튼으로 클릭하고 → `Commit DataTypes To` → `macOS_12.1`을 선택합니다.
- 그런 다음 `마우스 오른쪽 버튼 클릭` →`Select All` → `Commit`.
- 프로젝트 아카이브 저장 : `마우스 오른쪽 버튼 클릭` → `Save Archive`.
방금 모든 커널 확장 간에 공유할 수 있는 프로젝트 아카이브를 생성했습니다.
Apple Silicon용 `IOSurface` Kext의 예를 들어보겠습니다.```bash
$ lipo /System/Library/Extensions/IOSurface.kext/Contents/MacOS/IOSurface -thin arm64e -output /tmp/iosurface.arm64e
$ iometa -n -A /tmp/iosurface.arm64e > /tmp/iosurface.txt
  • 커널 데이터베이스와 프로젝트 아카이브가 위치한 동일한 폴더 경로에 Kext를 로드하고 Ghidra가 분석을 완료하도록 합니다
  • 이전에 생성한 프로젝트 아카이브 macOS_12.1을 로드합니다: Data Type Manager → Open Project Archive로 이동한 다음 macOS_12.1을 선택합니다
  • 다음 메서드를 실행합니다. 전체 스크립트는 KM.py에서 찾을 수 있습니다:```python from utils.helpers import * from utils.kext import *

kc = Kext(Obj,shared_p="macOS_12.1")

This method fixes LC_DYLD_CHAINED_FIXUPS for M1 Kernel extension

kc.depac()

This method reconstructs class hierarchy and builds virtual table for each class

kc.process_kernel_kext()

도구 다운로드