Objects in memory
AWS 해킹 학습 및 실습:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 학습 및 실습:
HackTricks Training GCP Red Team Expert (GRTE)
CFRuntimeClass
CF* 객체는 CoreFoundation에서 제공되며 CFString
, CFNumber
또는 CFAllocatior
와 같은 50개 이상의 객체 클래스를 제공합니다.
이러한 클래스들은 CFRuntimeClass
클래스의 인스턴스이며, 호출되면 __CFRuntimeClassTable
로의 인덱스를 반환합니다. CFRuntimeClass는 CFRuntime.h에 정의되어 있습니다.
Objective-C
사용된 메모리 섹션
ObjectiveC 런타임에서 사용하는 대부분의 데이터는 실행 중에 변경될 것이므로 메모리의 __DATA 세그먼트에서 일부 섹션을 사용합니다:
__objc_msgrefs
(message_ref_t
): 메시지 참조__objc_ivar
(ivar
): 인스턴스 변수__objc_data
(...
): 가변 데이터__objc_classrefs
(Class
): 클래스 참조__objc_superrefs
(Class
): 수퍼클래스 참조__objc_protorefs
(protocol_t *
): 프로토콜 참조__objc_selrefs
(SEL
): 셀렉터 참조__objc_const
(...
): 클래스r/o
데이터 및 기타 (희망적으로) 상수 데이터__objc_imageinfo
(version, flags
): 이미지 로드 중 사용됨: 현재 버전은0
; 플래그는 사전 최적화된 GC 지원 등을 지정합니다.__objc_protolist
(protocol_t *
): 프로토콜 목록__objc_nlcatlist
(category_t
): 이 바이너리에서 정의된 Non-Lazy 카테고리를 가리키는 포인터__objc_catlist
** (category_t
): 이 바이너리에서 정의된 카테고리를 가리키는 포인터__objc_nlclslist
(classref_t
): 이 바이너리에서 정의된 Non-Lazy Objective-C 클래스를 가리키는 포인터__objc_classlist
(classref_t
): 이 바이너리에서 정의된 모든 Objective-C 클래스를 가리키는 포인터
또한 상수 값을 저장하기 위해 __TEXT
세그먼트의 몇 가지 섹션을 사용합니다:
__objc_methname
(C-String): 메소드 이름__objc_classname
(C-String): 클래스 이름__objc_methtype
(C-String): 메소드 유형
타입 인코딩
Objective-C는 간단하고 복잡한 유형의 셀렉터 및 변수 유형을 인코딩하기 위해 일부 맹글링을 사용합니다:
기본 유형은 유형의 첫 글자를 사용합니다.
int
의 경우i
,char
의 경우c
,long
의 경우l
... 부호 없는 경우 대문자를 사용합니다 (unsigned Long
의 경우L
).다른 데이터 유형 중 사용되는 문자 또는 특수한 경우 다른 문자나 기호를 사용합니다.
long long
의 경우q
,bitfields
의 경우b
,booleans
의 경우B
,classes
의 경우#
,id
의 경우@
,char 포인터
의 경우*
, 일반포인터
의 경우^
,undefined
의 경우?
.배열, 구조 및 연합은
[
,{
,(
을 사용합니다.
메소드 선언 예시
선택자는 processString:withOptions:andError:
가 될 것입니다.
타입 인코딩
id
는@
로 인코딩됩니다.char *
는*
로 인코딩됩니다.
메소드의 완전한 타입 인코딩은:
상세한 분석
반환 유형 (
NSString *
):@
로 인코딩되며 길이는 24입니다.self
(객체 인스턴스):@
로 인코딩되며 오프셋 0에 있습니다._cmd
(셀렉터)::
로 인코딩되며 오프셋 8에 있습니다.첫 번째 인수 (
char * input
):*
로 인코딩되며 오프셋 16에 있습니다.두 번째 인수 (
NSDictionary * options
):@
로 인코딩되며 오프셋 20에 있습니다.세 번째 인수 (
NSError ** error
):^@
로 인코딩되며 오프셋 24에 있습니다.
셀렉터와 인코딩을 결합하여 메소드를 재구성할 수 있습니다.
클래스
Objective-C의 클래스는 속성, 메소드 포인터 등이 있는 구조체입니다. 소스 코드에서 objc_class
구조체를 찾을 수 있습니다.
이 클래스는 isa 필드의 일부 비트를 사용하여 클래스에 대한 정보를 나타냅니다.
그런 다음, 구조체에는 클래스의 이름, 기본 메서드, 프로퍼티 및 인스턴스 변수와 같은 클래스의 속성을 포함하는 디스크에 저장된 구조체 class_ro_t
에 대한 포인터가 있습니다.
런타임 중에는 메서드, 프로토콜, 프로퍼티 등을 변경할 수 있는 포인터를 포함하는 추가적인 구조체 class_rw_t
가 사용됩니다.
Last updated