Objects in memory
Last updated
Last updated
Lernen Sie und üben Sie AWS-Hacking: HackTricks Training AWS Red Team Expert (ARTE) Lernen Sie und üben Sie GCP-Hacking: HackTricks Training GCP Red Team Expert (GRTE)
CF* Objekte stammen aus CoreFoundation, die mehr als 50 Klassen von Objekten wie CFString
, CFNumber
oder CFAllocatior
bereitstellt.
All diese Klassen sind Instanzen der Klasse CFRuntimeClass
, die beim Aufruf einen Index zur __CFRuntimeClassTable
zurückgibt. Die CFRuntimeClass ist in CFRuntime.h definiert:
Die meisten Daten, die vom ObjectiveC-Laufzeitumgebung verwendet werden, ändern sich während der Ausführung, daher verwendet sie einige Abschnitte aus dem __DATA-Segment im Speicher:
__objc_msgrefs
(message_ref_t
): Nachrichtenreferenzen
__objc_ivar
(ivar
): Instanzvariablen
__objc_data
(...
): Veränderliche Daten
__objc_classrefs
(Class
): Klassenreferenzen
__objc_superrefs
(Class
): Superklassenreferenzen
__objc_protorefs
(protocol_t *
): Protokollreferenzen
__objc_selrefs
(SEL
): Selektorreferenzen
__objc_const
(...
): Klassen r/o
-Daten und andere (hoffentlich) konstante Daten
__objc_imageinfo
(version, flags
): Wird während des Bildladens verwendet: Aktuelle Version 0
; Flags spezifizieren voroptimierte GC-Unterstützung, etc.
__objc_protolist
(protocol_t *
): Protokollliste
__objc_nlcatlist
(category_t
): Zeiger auf in dieser Binärdatei definierte Non-Lazy-Kategorien
__objc_catlist
(category_t
): Zeiger auf in dieser Binärdatei definierte Kategorien
__objc_nlclslist
(classref_t
): Zeiger auf in dieser Binärdatei definierte Non-Lazy-Objective-C-Klassen
__objc_classlist
(classref_t
): Zeiger auf alle in dieser Binärdatei definierten Objective-C-Klassen
Es verwendet auch einige Abschnitte im __TEXT
-Segment, um konstante Werte zu speichern, falls es nicht möglich ist, in diesem Abschnitt zu schreiben:
__objc_methname
(C-String): Methodennamen
__objc_classname
(C-String): Klassennamen
__objc_methtype
(C-String): Methodentypen
Objective-C verwendet einige Verfremdungen, um Selektor- und Variablentypen von einfachen und komplexen Typen zu kodieren:
Primitive Typen verwenden ihren ersten Buchstaben des Typs i
für int
, c
für char
, l
für long
... und verwenden den Großbuchstaben, falls es sich um einen unsigned-Typ handelt (L
für unsigned Long
).
Andere Datentypen, deren Buchstaben verwendet werden oder speziell sind, verwenden andere Buchstaben oder Symbole wie q
für long long
, b
für Bitfelder
, B
für Booleans
, #
für Klassen
, @
für id
, *
für Zeiger auf char
, ^
für generische Zeiger
und ?
für undefiniert
.
Arrays, Strukturen und Unionen verwenden [
, {
und (
Der Selektor wäre processString:withOptions:andError:
id
wird als @
codiert
char *
wird als *
codiert
Die vollständige Typencodierung für die Methode lautet:
Rückgabetyp (NSString *
): Codiert als @
mit einer Länge von 24
self
(Objektinstanz): Codiert als @
, bei Offset 0
_cmd
(Selektor): Codiert als :
, bei Offset 8
Erstes Argument (char * input
): Codiert als *
, bei Offset 16
Zweites Argument (NSDictionary * options
): Codiert als @
, bei Offset 20
Drittes Argument (NSError ** error
): Codiert als ^@
, bei Offset 24
Mit dem Selektor und der Codierung können Sie die Methode rekonstruieren.
Klassen in Objective-C sind eine Struktur mit Eigenschaften, Methodenzeigern... Es ist möglich, die Struktur objc_class
im Quellcode zu finden:
Diese Klasse verwendet einige Bits des isa-Feldes, um Informationen über die Klasse anzuzeigen.
Dann hat die Struktur einen Zeiger auf die auf der Festplatte gespeicherte Struktur class_ro_t
, die Attribute der Klasse wie ihren Namen, Basismethoden, Eigenschaften und Instanzvariablen enthält.
Während der Laufzeit wird eine zusätzliche Struktur class_rw_t
verwendet, die Zeiger enthält, die geändert werden können, wie Methoden, Protokolle, Eigenschaften...