Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
ida_kernelcache — iOS kernelcache를 분석하기 위한 IDA 툴킷입니다. | Kitploit
도구/GitHubGitHub/bazad/ida_kernelcache
Embedded Systems SecurityStatic AnalysisiOS SecurityVulnerability AnalysisReverse EngineeringDebuggersMobile SecurityBinary AnalysisFirmware Analysis
GitHubbazad/ida_kernelcache

ida_kernelcache

iOS kernelcache를 분석하기 위한 IDA 툴킷입니다.

305856년 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기

ida_kernelcache: iOS 커널캐시 분석용 IDA 툴킷

ida_kernelcache는 iOS 커널캐시를 더 쉽게 다룰 수 있게 해주는 IDA Pro용 IDAPython 모듈입니다. 이 모듈은 다음 작업을 수행하는 함수를 제공합니다:

  • iOS 12의 새로운 정적 태그 포인터(tagged pointer)를 일반 커널 포인터로 변환합니다.
  • 커널의 __PRELINK_INFO 세그먼트를 파싱하여 Python 사전(dictionary)으로 만듭니다.
  • 커널 익스텐션 이름, Mach-O 세그먼트, Mach-O 섹션에 따라 IDA의 세그먼트 이름을 변경합니다.
  • 일부 세그먼트에서 식별 가능한 포인터를 IDA 오프셋으로 변환합니다.
  • OSMetaClass 정보를 기반으로 C++ 클래스 계층 구조를 재구성합니다.
  • C++ 가상 메서드 테이블(vtable 자체와 그 메서드 모두)에 심볼을 부여합니다(symbolicate).
  • __got 섹션의 오프셋과 __stubs 섹션의 스텁 함수에 심볼을 부여합니다.
  • C++ 가상 메서드 테이블을 나타내는 IDA 구조체를 자동 생성합니다.
  • 관찰된 접근 패턴을 기반으로 커널캐시의 C++ 클래스를 나타내는 IDA 구조체를 자동 생성합니다.

기본 처리 함수는 수동 분석이나 리버스 엔지니어링을 시작하기 전에 실행하도록 설계되었습니다. 기본 설정에서 IDA는 커널캐시의 유용한 정보를 많이 놓치는 경향이 있습니다. 이 스크립트는 커널캐시의 알려진 구조를 활용하여 유용한 정보를 자동으로 전파함으로써 IDA를 도와줍니다.

모듈의 기본 기능 외에도 ida_kernelcache에는 iOS 커널캐시 분석을 더 쉽게 만들어 주는 여러 스크립트가 포함되어 있습니다. 예를 들어, 함수에서 사용하는 C 구조체를 자동 생성하는 데 스크립트를 사용할 수 있습니다.

ida_kernelcache에 사용된 많은 기법들은 memctl을 위해 개발되었고 여기에서 직접 차용되었습니다.

버전

ida_kernelcache는 IDA Pro 6.95와 iOS 10.1.1, 11.0, 11.2, 11.3.1, 12.0 베타 커널캐시에서 테스트되었습니다. 현재 iOS 10 이상의 Arm64 커널캐시만 지원됩니다.

시작하기

이미 압축이 풀린 커널캐시 파일을 IDA에 로드해 두어야 합니다. 특정 IPSW를 다운로드할 수 있는 URL은 Apple 온라인에서 찾을 수 있으며, 커널캐시의 압축을 풀 수 있는 공개 도구(memctl 포함)가 여러 가지 있습니다.

IDA에서 메뉴 바의 "File" -> "Script file..."을 선택한 다음 기본 디렉터리에 있는 ida_kernelcache.py 스크립트를 선택합니다. 그러면 ida_kernelcache 모듈이 ida_kernelcache 및 kc라는 이름으로 IDAPython 인터프리터에 로드됩니다. IDAPython 프롬프트에서 kc.kernelcache_process()를 입력하고 Enter를 눌러 커널캐시 분석을 시작합니다. 이 함수는 ida_kernelcache가 지원하는 모든 주요 분석을 수행합니다. IDA가 새 함수를 식별하고 분석하는 동안 이 함수는 몇 분 동안 실행됩니다.

ida_kernelcache는 주소에 대한 사용자 이름을 덮어쓰지 않으려고 합니다. 즉, kernelcache_process로 초기화하기 전에 커널캐시를 수동으로 분석했다면 사용자가 지정한 이름이 자동 이름 전파를 막을 수 있으므로 결과가 그만큼 철저하지 않을 수 있습니다. 그러나 ida_kernelcache가 기존 분석을 망치지 않으리라는 보장도 없으므로, 이미 분석한 커널캐시 파일에 kernelcache_process를 실행하기로 결정했다면 먼저 백업을 만들어 두십시오.

ida_kernelcache 모듈

ida_kernelcache는 ida_kernelcache.py를 통해 로드하도록 설계되었습니다. ida_kernelcache 디렉터리의 하위 모듈은 직접 로드하도록 만든 것이 아닙니다. 그러나 ida_kernelcache는 이러한 하위 모듈 중 다수의 기능을 노출합니다. 각 모듈이 하는 일은 다음과 같습니다:

  • ida_utilities: 이 모듈은 IDA의 일부 함수를 래핑하여 사용하기 쉬운 API를 제공합니다. 특히 유용한 것은 is_mapped, read_word, read_struct, force_function, ReadWords입니다. is_mapped는 주소가 매핑되어 있는지, 선택적으로 알려진 값을 포함하는지 확인합니다. read_word는 주소에서 가변 크기의 워드를 읽습니다. read_struct는 구조체 타입을 Python 사전 또는 Python 접근자 객체로 읽어 들여 데이터 구조를 훨씬 쉽게 파싱할 수 있게 해줍니다. force_function은 주소를 IDA의 함수 시작점으로 변환하기 위해 몇 가지 방법을 시도합니다. ReadWords는 범위 내의 데이터 워드와 해당 주소를 순회하는 제너레이터입니다.

  • build_struct: 이 내부 모듈에는 구조체에 대한 일련의 접근을 기반으로 IDA 구조체를 자동으로 채우는 유틸리티가 포함되어 있습니다.

  • class_struct: 이 모듈은 C++ 가상 메서드 테이블과 클래스를 나타내는 IDA 구조체를 생성하는 함수를 제공합니다. initialize_vtable_structs는 (심볼이 부여된) 가상 메서드 테이블을 스캔하여 가상 메서드 포인터를 담을 IDA 구조체를 만듭니다. initialize_class_structs는 가상 메서드에 대해 데이터 흐름 분석을 수행하여 각 클래스의 필드에 대한 접근을 식별한 다음, 클래스를 나타내는 IDA 구조체를 구축합니다. 필드를 참조하는 것으로 보이는 명령어도 구조체 오프셋 참조로 변환됩니다. 자세한 내용은 모듈 docstring을 참조하십시오.

기타 스크립트

ida_kernelcache_reload.py 스크립트는 ida_kernelcache 모듈과 모든 하위 모듈을 강제로 다시 로드한다는 점을 제외하면 ida_kernelcache.py와 동일합니다. 주로 개발에 유용합니다.

scripts 디렉터리에는 ida_kernelcache를 사용하여 특정 분석을 수행하는 스크립트가 들어 있습니다. 이 스크립트들은 주 ida_kernelcache 모듈에 포함하기에는 너무 구체적이지만, 커널캐시를 리버스 엔지니어링할 때 유용합니다. 포함된 스크립트는 다음과 같습니다:

  • find_virtual_method_overrides.py: 지정된 문자열을 포함하는 가상 메서드를 오버라이드하는 클래스의 하위 클래스를 찾는 스크립트입니다. 일치하는 오버라이드는 콘솔에 출력됩니다.

  • populate_struct.py: 현재 주소에서 시작하는 데이터 흐름 분석을 수행하여 C++ 클래스 또는 C 구조체의 필드를 채웁니다.

  • process_external_methods.py: IOExternalMethod 또는 IOExternalMethodDispatch 배열을 퍼징 도구에서 사용할 수 있는 표준 형식으로 처리합니다.

클래스 재구성

Hex-Rays 디컴파일러를 사용 중이라면 ida_kernelcache의 더 흥미로운 기능 중 하나는 자동 C++ 클래스 재구성입니다. 이 기능은 OSMetaClass 정보와 데이터 흐름 분석을 사용하여 커널캐시에서 발견된 클래스를 나타내는 IDA 구조체를 만듭니다. 이러한 표현은 의사 코드 표현의 가독성을 크게 향상시킬 수 있습니다. 자세한 내용은 IDA Pro를 사용한 iOS 커널캐시의 C++ 클래스 재구성 게시물을 참조하십시오.

새로운 iOS 12 커널캐시 형식

iOS 12에서 Apple은 일부 기기에 새로운 커널캐시 형식을 도입했습니다. 변경 사항 중 하나는 이 새로운 커널캐시의 커널 포인터에 태그를 붙여 목록으로 연결한 것입니다. 아마도 prelink 사전의 _PrelinkLinkKASLROffsets 데이터 없이 iBoot가 커널을 슬라이드할 수 있도록 하기 위한 것으로 보입니다. 이 형식의 기본 커널캐시를 IDA에서 분석하는 것은 교차 참조가 없어 어렵습니다. 자세한 내용은 iOS 12 커널캐시의 태그 포인터 분석 문서를 참조하십시오.

추가 처리를 수행하지 않고 커널캐시의 포인터 태그만 해제하려면 kc.tagged_pointers.untag_pointers()를 실행하십시오.

일반화에 대한 참고 사항

이 기능 중 일부는 Apple 커널캐시에만 국한되지 않고 더 광범위하게 적용될 수 있습니다(예: vtable 분석 및 심볼 전파, 또는 ida_utilities.py의 대부분의 함수). 그럼에도 불구하고 다른 유형의 바이너리에서는 테스트하지 않았기 때문에 import 범위를 ida_kernelcache 모듈로만 제한했습니다.

라이선스

ida_kernelcache는 MIT 라이선스로 배포됩니다.

ida_kernelcache의 많은 기능은 역시 MIT 라이선스로 배포되는 memctl에서 차용한 것입니다. 기타 출처는 해당 파일의 주석에 명시되어 있습니다.


Brandon Azad

도구 다운로드
  • classes: 이 모듈은 커널캐시의 C++ 클래스에 대한 정보를 보관하는 ClassInfo 타입을 정의하고, 커널캐시에서 클래스를 스캔하여 클래스 이름에서 ClassInfo 객체로의 매핑으로 전역 class_info 사전을 채우는 collect_class_info 함수를 제공합니다. ClassInfo 타입은 각 C++ 클래스의 클래스 이름, OSMetaClass 인스턴스, 가상 메서드 테이블, 슈퍼클래스 이름을 기록합니다. 또한 각 ClassInfo 객체는 슈퍼클래스의 ClassInfo 및 모든 직접 서브클래스의 ClassInfo에 대한 참조를 저장하므로 클래스 계층 구조를 쉽게 살펴보고 탐색할 수 있습니다. collect_class_info는 또한 모든 가상 메서드 테이블의 집합을 전역 vtables 집합에 저장합니다.

  • data_flow: 이 내부 모듈은 ida_kernelcache의 나머지 부분에서 사용하는 데이터 흐름 연산을 포함합니다.

  • kernel: 이 모듈은 base 및 prelink_info 전역 변수를 제공합니다. base는 커널 이미지의 기준 주소(커널 Mach-O 헤더의 시작)입니다. prelink_info는 파싱된 __PRELINK_INFO 사전입니다.

  • kplist: 이 모듈은 커널 스타일 plist를 파싱하는 kplist_parse 함수를 제공합니다.

  • metaclass: 이 모듈은 알려진 각 OSMetaClass 인스턴스에 심볼을 추가하는 initialize_metaclass_symbols 함수를 제공합니다.

  • offset: 이 모듈은 initialize_data_offsets 및 initialize_offset_symbols 함수를 제공합니다. 전자는 세그먼트를 스캔하여 오프셋으로 변환할 수 있는 포인터를 찾습니다. 후자는 오프셋의 대상에 심볼이 있으면 각 kext의 __got 섹션에 있는 오프셋에 심볼을 부여합니다.

  • segment: 이 모듈은 IDA의 세그먼트를 더 유용하게 이름을 바꾸는 initialize_segments 함수를 제공합니다. 기본적으로 IDA는 번들 식별자(bundle identifier)의 추정값과 해당 영역을 설명하는 Mach-O 섹션을 결합하여 세그먼트 이름을 만드는 것으로 보입니다. initialize_segments는 __PRELINK_INFO 사전에서 실제 번들 식별자를 추출하고 각 세그먼트에 번들 식별자, Mach-O 세그먼트, Mach-O 섹션이 포함되도록 이름을 변경합니다. 예를 들어 __TEXT.__const와 __DATA_CONST.__const를 구분할 수 있게 됩니다. 이 모듈은 또한 지정된 주소를 포함하는 kext를 확인하는 kernelcache_kext 함수(최상위 레벨에서 다시 내보냄)를 제공합니다(이전 iOS 11 분할 kext 커널캐시 형식에서만 해당).

  • stub: 커널캐시의 많은 kext에는 커널 본체의 함수로 점프하는 __stubs 섹션의 스텁 함수가 포함되어 있습니다. 불행히도 이러한 스텁은 교차 참조와 타입 정보를 전파하는 데 장벽이 됩니다. 이 모듈은 이러한 문제를 해결하지는 않지만, 대상 함수 이름이 보이도록 스텁 함수의 이름을 자동으로 변경하여 스텁을 살펴보기 조금 더 쉽게 만들어 줍니다. 스텁과 해당 대상은 IDA에서 강제로 함수로 변환되므로 IDA의 함수가 원본 소스 코드의 함수와 일치하는 데 도움이 됩니다.

  • tagged_pointers: 새로운 iOS 12 병합 커널캐시 형식은 각 포인터의 상위 2바이트에 오프셋을 태그하여 포인터를 목록으로 연결합니다. 이 모듈에는 이러한 태그 포인터를 처리하고 복원하는 함수가 포함되어 있습니다.

  • vtable: 이 모듈은 vtable_length, convert_vtable_to_offsets, vtable_overrides, initialize_vtable_symbols, initialize_vtable_method_symbols를 포함하여 가상 메서드 테이블 작업에 유용한 여러 함수를 제공합니다. vtable_length는 지정된 주소가 vtable일 수 있는지 확인하고 vtable 길이를 반환합니다. 제너레이터 vtable_overrides는 슈퍼클래스가 사용하는 가상 메서드를 오버라이드하는 클래스의 가상 메서드를 열거합니다. initialize_vtable_symbols 함수는 식별된 각 vtable의 시작에 심볼을 추가합니다. initialize_vtable_method_symbols는 각 vtable의 오버라이드된 메서드를 반복하면서 슈퍼클래스의 심볼을 서브클래스로 전파합니다. IOKit의 대부분의 기본 클래스는 XNU에 비교적 완전한 심볼 정보로 정의되어 있기 때문에 가능합니다. 서브클래스 vtable의 각 메서드 오버라이드는 슈퍼클래스의 메서드와 동일한 인터페이스를 따라야 합니다. 즉, 슈퍼클래스의 가상 메서드 심볼에서 슈퍼클래스 이름을 서브클래스 이름으로 대체하여 오버라이드에 대한 심볼을 생성할 수 있습니다. 예를 들어, AppleKeyStore 클래스의 인덱스 7에 있는 가상 메서드 이름이 없지만 해당 슈퍼클래스 IOService의 인덱스 7에 있는 가상 메서드가 __ZNK9IOService12getMetaClassEv로 불린다는 것을 알고 있다면, 서브클래스에서 인덱스 7은 __ZNK13AppleKeyStore12getMetaClassEv로 불러야 한다고 추론할 수 있습니다. 이 기법을 사용하여 대부분의 클래스에서 대부분의 가상 메서드에 심볼을 부여할 수 있습니다.