Objects in memory
Last updated
Last updated
AWS 해킹 학습 및 실습:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 학습 및 실습: HackTricks Training GCP Red Team Expert (GRTE)
CF* 객체는 CoreFoundation에서 제공되며 CFString
, CFNumber
또는 CFAllocatior
와 같은 50개 이상의 객체 클래스를 제공합니다.
이러한 클래스들은 CFRuntimeClass
클래스의 인스턴스이며, 호출되면 __CFRuntimeClassTable
로의 인덱스를 반환합니다. CFRuntimeClass는 CFRuntime.h에 정의되어 있습니다.
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
가 사용됩니다.