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 CFAllocatior
.
Todas estas clases son instancias de la clase CFRuntimeClass
, la cual al ser llamada devuelve un índice a la __CFRuntimeClassTable
. CFRuntimeClass está definida en CFRuntime.h:
La mayoría 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 la memoria:
__objc_msgrefs
(message_ref_t
): Referencias de mensajes
__objc_ivar
(ivar
): Variables de instancia
__objc_data
(...
): Datos mutables
__objc_classrefs
(Class
): Referencias de clases
__objc_superrefs
(Class
): Referencias de superclases
__objc_protorefs
(protocol_t *
): Referencias de protocolos
__objc_selrefs
(SEL
): Referencias de selectores
__objc_const
(...
): Datos de clase r/o
y otros datos (con suerte) constantes
__objc_imageinfo
(versión, flags
): Utilizado durante la carga de imagen: Versión actualmente 0
; Las banderas especifican soporte preoptimizado de GC, 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 Objective-C No Perezosas definidas en este binario
__objc_classlist
(classref_t
): Punteros a todas las clases 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
(Cadena-C): Nombres de métodos
__objc_classname
(Cadena-C): Nombres de clases
__objc_methtype
(Cadena-C): Tipos de métodos
Objective-C utiliza un cierto enmascaramiento para codificar los tipos de selector y variables de tipos simples y complejos:
Los tipos primitivos usan la primera letra del tipo i
para int
, c
para char
, l
para long
... y usa 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, usan otras letras o símbolos como q
para long long
, b
para bitfields
, B
para booleans
, #
para classes
, @
para id
, *
para char pointers
, ^
para punteros
genéricos y ?
para indefinido
.
Los arreglos, estructuras y uniones usan [
, {
y (
El selector sería processString:withOptions:andError:
id
se codifica como @
char *
se codifica como *
La codificación completa de tipos para el método es:
Tipo de Retorno (NSString *
): Codificado como @
con longitud 24
self
(instancia del 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.
Las clases en Objective-C son 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 modificados, como métodos, protocolos, propiedades...