Objects in memory
Last updated
Last updated
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Los objetos CF* provienen de CoreFoundation, que proporciona más de 50 clases de objetos como CFString
, CFNumber
o CFAllocator
.
Todas estas clases son instancias de la clase CFRuntimeClass
, que al ser llamada devuelve un índice a la __CFRuntimeClassTable
. La CFRuntimeClass está definida en CFRuntime.h:
La mayor parte de los datos utilizados por el tiempo de ejecución de ObjectiveC cambiarán durante la ejecución, por lo tanto, utiliza algunas secciones del segmento __DATA en memoria:
__objc_msgrefs
(message_ref_t
): Referencias de mensajes
__objc_ivar
(ivar
): Variables de instancia
__objc_data
(...
): Datos mutables
__objc_classrefs
(Class
): Referencias de clase
__objc_superrefs
(Class
): Referencias de superclase
__objc_protorefs
(protocol_t *
): Referencias de protocolo
__objc_selrefs
(SEL
): Referencias de selector
__objc_const
(...
): Datos de clase r/o
y otros datos (esperemos) constantes
__objc_imageinfo
(version, flags
): Utilizado durante la carga de la imagen: Versión actualmente 0
; Las banderas especifican soporte de GC preoptimizado, etc.
__objc_protolist
(protocol_t *
): Lista de protocolos
__objc_nlcatlist
(category_t
): Puntero a categorías no perezosas definidas en este binario
__objc_catlist
(category_t
): Puntero a categorías definidas en este binario
__objc_nlclslist
(classref_t
): Puntero a clases de Objective-C no perezosas definidas en este binario
__objc_classlist
(classref_t
): Punteros a todas las clases de Objective-C definidas en este binario
También utiliza algunas secciones en el segmento __TEXT
para almacenar valores constantes si no es posible escribir en esta sección:
__objc_methname
(C-String): Nombres de métodos
__objc_classname
(C-String): Nombres de clase
__objc_methtype
(C-String): Tipos de métodos
Objective-C utiliza cierta mangling para codificar selectores y tipos de variables de tipos simples y complejos:
Los tipos primitivos utilizan la primera letra del tipo i
para int
, c
para char
, l
para long
... y utilizan la letra mayúscula en caso de que sea sin signo (L
para unsigned Long
).
Otros tipos de datos cuyas letras se utilizan o son especiales, utilizan otras letras o símbolos como q
para long long
, b
para bitfields
, B
para booleans
, #
para classes
, @
para id
, *
para char pointers
, ^
para pointers
genéricos y ?
para undefined
.
Los arreglos, estructuras y uniones utilizan [
, {
y (
El selector sería processString:withOptions:andError:
id
se codifica como @
char *
se codifica como *
La codificación de tipo completa para el método es:
Tipo de Retorno (NSString *
): Codificado como @
con longitud 24
self
(instancia de objeto): Codificado como @
, en el desplazamiento 0
_cmd
(selector): Codificado como :
, en el desplazamiento 8
Primer argumento (char * input
): Codificado como *
, en el desplazamiento 16
Segundo argumento (NSDictionary * options
): Codificado como @
, en el desplazamiento 20
Tercer argumento (NSError ** error
): Codificado como ^@
, en el desplazamiento 24
Con el selector + la codificación puedes reconstruir el método.
Clases en Objective-C es una estructura con propiedades, punteros a métodos... Es posible encontrar la estructura objc_class
en el código fuente:
Esta clase utiliza algunos bits del campo isa para indicar información sobre la clase.
Luego, la estructura tiene un puntero a la estructura class_ro_t
almacenada en disco que contiene atributos de la clase como su nombre, métodos base, propiedades y variables de instancia.
Durante el tiempo de ejecución, se utiliza una estructura adicional class_rw_t
que contiene punteros que pueden ser alterados, como métodos, protocolos, propiedades...
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)