Objects in memory
Last updated
Last updated
Impara e pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Gli oggetti CF* provengono da CoreFoundation, che fornisce più di 50 classi di oggetti come CFString
, CFNumber
o CFAllocator
.
Tutte queste classi sono istanze della classe CFRuntimeClass
, che quando chiamata restituisce un indice alla __CFRuntimeClassTable
. La CFRuntimeClass è definita in CFRuntime.h:
La maggior parte dei dati utilizzati dal runtime di ObjectiveC cambierà durante l'esecuzione, quindi utilizza alcune sezioni dal segmento __DATA in memoria:
__objc_msgrefs
(message_ref_t
): Riferimenti ai messaggi
__objc_ivar
(ivar
): Variabili di istanza
__objc_data
(...
): Dati mutabili
__objc_classrefs
(Class
): Riferimenti alle classi
__objc_superrefs
(Class
): Riferimenti alle superclassi
__objc_protorefs
(protocol_t *
): Riferimenti ai protocolli
__objc_selrefs
(SEL
): Riferimenti ai selettori
__objc_const
(...
): Dati r/o
della classe e altri dati (si spera) costanti
__objc_imageinfo
(version, flags
): Utilizzato durante il caricamento dell'immagine: Versione attualmente 0
; I flag specificano il supporto GC preottimizzato, ecc.
__objc_protolist
(protocol_t *
): Elenco dei protocolli
__objc_nlcatlist
(category_t
): Puntatore a categorie non pigre definite in questo binario
__objc_catlist
(category_t
): Puntatore a categorie definite in questo binario
__objc_nlclslist
(classref_t
): Puntatore a classi Objective-C non pigre definite in questo binario
__objc_classlist
(classref_t
): Puntatori a tutte le classi Objective-C definite in questo binario
Utilizza anche alcune sezioni nel segmento __TEXT
per memorizzare valori costanti se non è possibile scrivere in questa sezione:
__objc_methname
(C-String): Nomi dei metodi
__objc_classname
(C-String): Nomi delle classi
__objc_methtype
(C-String): Tipi dei metodi
Objective-C utilizza alcune mangling per codificare selettori e tipi di variabili di tipi semplici e complessi:
I tipi primitivi usano la prima lettera del tipo i
per int
, c
per char
, l
per long
... e usano la lettera maiuscola nel caso sia senza segno (L
per unsigned Long
).
Altri tipi di dati le cui lettere sono utilizzate o sono speciali, usano altre lettere o simboli come q
per long long
, b
per bitfields
, B
per booleans
, #
per classi
, @
per id
, *
per puntatori char
, ^
per puntatori
generici e ?
per indefiniti
.
Array, strutture e unioni usano [
, {
e (
Il selettore sarebbe processString:withOptions:andError:
id
è codificato come @
char *
è codificato come *
La codifica completa del tipo per il metodo è:
Tipo di ritorno (NSString *
): Codificato come @
con lunghezza 24
self
(istanza dell'oggetto): Codificato come @
, all'offset 0
_cmd
(selettore): Codificato come :
, all'offset 8
Primo argomento (char * input
): Codificato come *
, all'offset 16
Secondo argomento (NSDictionary * options
): Codificato come @
, all'offset 20
Terzo argomento (NSError ** error
): Codificato come ^@
, all'offset 24
Con il selettore + la codifica puoi ricostruire il metodo.
Le classi in Objective-C sono una struct con proprietà, puntatori ai metodi... È possibile trovare la struct objc_class
nel codice sorgente:
Questa classe utilizza alcuni bit del campo isa per indicare alcune informazioni sulla classe.
Poi, la struct ha un puntatore alla struct class_ro_t
memorizzata su disco che contiene attributi della classe come il suo nome, metodi di base, proprietà e variabili di istanza.
Durante l'esecuzione, una struttura aggiuntiva class_rw_t
viene utilizzata contenente puntatori che possono essere alterati come metodi, protocolli, proprietà...
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)