Compartir tecnología

Búsqueda estática de ubicación de llamada de la función de enlace dinámico de iOS

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Búsqueda estática de ubicación de llamada de la función de enlace dinámico de iOS

El formato de archivo ejecutable mach-O es un formato de archivo binario utilizado en los sistemas operativos macOS e iOS de Apple.

En algunos análisis de seguridad de iOS, puede ser necesario obtener la ubicación de llamada específica de una función, lo que puede guiar a los usuarios a localizar vulnerabilidades con mayor precisión.
Ahora tome la función NSLog como ejemplo y busque estáticamente la ubicación de llamada específica de la función de enlace dinámico en macho.

Objetivo

Busque la ubicación específica donde se llama a la función NSLog en la aplicación macho.

Ideas

Todo el proceso de búsqueda es un proceso de análisis de archivos macho y análisis de datos binarios en estructuras de datos apropiadas.
Se utilizan varias partes de macho:
Tabla de cadenas
Tabla de símbolos
Tabla de símbolos dinámicos
Sección 64(TEXTO,talones)
Sección 64(TEXTO,texto)

Pasos específicos

1. Primero busque la ubicación de Symbol Talbe y String Table en el archivo macho.

Busque LC_SYMTAB en Load Commands, puede determinar el desplazamiento y el tamaño de StringTable, y también puede encontrar el desplazamiento y el número de la tabla de símbolos:

El desplazamiento de la tabla de símbolos es 0x18c478
El número de símbolos es 0x9a2d
El desplazamiento de la tabla de cadenas es 0x2273b0
El tamaño de la tabla de cadenas es 0x108d58

Debido a que la longitud de los datos de cada símbolo es de 16 bytes, que es 0x10,

Entonces el tamaño de la tabla de símbolos es 0x9a2d*0x10 = 0x9A2D0
La dirección inicial de la tabla de símbolos es 0x18c478.
La dirección final es 0x18c478 0x9A2D0 = 0x226748

La dirección inicial de la tabla de cadenas es 0x2273b0
La dirección final es 0x2273b0 0x108d58 = 0x330108
Debido a que la longitud de la cadena no es fija, la longitud de cada dato en la tabla de cadenas no es fija.
Al leer datos de la tabla de cadenas en binario, puede utilizar 'x00' como delimitador de cadena.

2. Recorra la tabla de cadenas y busque _NSLog

Primero puede leer los datos de la tabla de cadenas en macho y usar 'x00' como separador para generar una matriz de cadenas.
Recorra la matriz de cadenas y determine si cada dato es igual a "_NSLog".

_NSLog se encontró en 0x23331b y el código de máquina "5F4E534C6F6700" es la cadena "_NSLogn".

49003 (0xBF6B en hexadecimal) es el número de índice de la cadena actual, que se determina provisionalmente como strTab_index = 49003.
El número de índice 49003 se calcula a partir de la dirección inicial 0x2273b0 de la tabla de cadenas, el byte 49003,
0x2273b0 49003 = 0x23331B, que resulta ser la dirección inicial de _NSLog.

3. Según 49003 (0xBF6B) en el paso 2, puede buscar el símbolo correspondiente en la Tabla de símbolos

En MachOView, puede ver que la dirección 0x00224988 corresponde a _NSLog.

¿Cómo encontrar datos de la tabla de símbolos coincidentes a través del número de índice 49003?
Conocido en el paso 1:
La dirección inicial de la tabla de símbolos es 0x18c478,
La dirección final de la tabla de símbolos es 0x226748.
En este macho, el tamaño de los datos de una única tabla de símbolos es 0x10.

El valor de los primeros cuatro bytes del dato número 38993 en la tabla de símbolos es 0xBF6B, que es 49003.
Es el mismo que el número de índice de la cadena _NSLog en la tabla de cadenas, por lo que estos datos corresponden a "_NSLog":

38993 es el número de índice de los datos actuales en la tabla de símbolos, tentativamente symTab_index = 38993,
0x18c478 38993 * 0x10 = 0x224988 es exactamente la dirección de los datos actuales.

4. Busque datos basados ​​en symTab_index en la tabla de símbolos dinámicos

La ubicación de los símbolos indirectos se puede determinar en LC_DYSYMTAB en Comandos de carga en Macho:

Dirección inicial: 0x226748, hay 794 datos y el tamaño de cada dato es 0x4.
Recorra cada dato en Símbolos indirectos. El dato 111 almacena 38993.
Entonces estos datos corresponden a "_NSLog", establezca dySymTab_index = 111
0x226748 111*0x4 = 0x226904