Partage de technologie

Recherche statique de l'emplacement d'appel de la fonction de lien dynamique iOS

2024-07-11

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

Recherche statique de l'emplacement d'appel de la fonction de lien dynamique iOS

Le format de fichier exécutable mach-O est un format de fichier binaire utilisé sur les systèmes d'exploitation d'Apple macOS et iOS.

Dans certaines analyses de sécurité iOS, il peut être nécessaire d'obtenir l'emplacement d'appel spécifique d'une fonction, ce qui peut aider les utilisateurs à localiser plus précisément les vulnérabilités.
Prenons maintenant la fonction NSLog comme exemple et recherchez statiquement l'emplacement d'appel spécifique de la fonction de lien dynamique en macho.

Cible

Recherchez l'emplacement spécifique où la fonction NSLog est appelée dans l'application macho.

Idées

L'ensemble du processus de recherche est un processus d'analyse de fichiers machistes et d'analyse de données binaires dans des structures de données appropriées.
Plusieurs parties de macho sont utilisées :
Tableau des chaînes
Tableau des symboles
Tableau des symboles dynamiques
Section 64(TEXTE,talons)
Section 64(TEXTE,texte)

Étapes spécifiques

1. Recherchez d’abord l’emplacement du symbole Talbe et de la table de chaînes dans le fichier macho.

Recherchez LC_SYMTAB dans les commandes de chargement, vous pouvez déterminer le décalage et la taille de StringTable, et vous pouvez également trouver le décalage et le nombre de table de symboles :

Le décalage de la table des symboles est 0x18c478
Le nombre de symboles est 0x9a2d
Le décalage de la table de chaînes est 0x2273b0
La taille de la table de chaînes est 0x108d58

Étant donné que la longueur des données de chaque symbole est de 16 octets, soit 0x10,

La taille de la table des symboles est donc 0x9a2d*0x10 = 0x9A2D0
L'adresse de départ de la table des symboles est 0x18c478.
L'adresse de fin est 0x18c478 0x9A2D0 = 0x226748

L'adresse de départ de la table de chaînes est 0x2273b0
L'adresse de fin est 0x2273b0 0x108d58 = 0x330108
Étant donné que la longueur de la chaîne n'est pas fixe, la longueur de chaque élément de données de la table de chaînes n'est pas fixe.
Lors de la lecture des données d'une table de chaînes en binaire, vous pouvez utiliser « x00 » comme délimiteur de chaîne.

2. Parcourez la table de chaînes et recherchez _NSLog

Vous pouvez d'abord lire les données de la table de chaînes en macho et utiliser « x00 » comme séparateur pour générer un tableau de chaînes.
Parcourez le tableau de chaînes et déterminez si chaque élément de données est égal à "_NSLog".

_NSLog a été trouvé à 0x23331b et le code machine « 5F4E534C6F6700 » est la chaîne « _NSLogn ».

49003 (0xBF6B en hexadécimal) est le numéro d'index de la chaîne actuelle, qui est provisoirement déterminé comme strTab_index = 49003.
Le numéro d'index 49003 est calculé à partir de l'adresse de départ 0x2273b0 de la table de chaînes, le 49003ème octet,
0x2273b0 49003 = 0x23331B, qui se trouve être l'adresse de départ de _NSLog.

3. Selon 49003 (0xBF6B) à l'étape 2, vous pouvez rechercher le symbole correspondant dans la SymbolTable

Dans MachOView, vous pouvez voir que l'adresse 0x00224988 correspond à _NSLog.

Comment trouver les données de la table de symboles correspondantes via le numéro d'index 49003 ?
Connu à l'étape 1 :
L'adresse de départ de la table des symboles est 0x18c478,
L'adresse de fin de la table des symboles est 0x226748.
Dans ce macho, la taille des données d'une seule table de symboles est de 0x10.

La valeur des quatre premiers octets de la 38993ème donnée dans la table des symboles est 0xBF6B, soit 49003.
C'est le même que le numéro d'index de la chaîne _NSLog sur la table de chaînes, donc ces données correspondent à "_NSLog" :

38993 est le numéro d'index des données actuelles dans la table des symboles, provisoirement symTab_index = 38993,
0x18c478 38993 * 0x10 = 0x224988 est exactement l'adresse des données actuelles.

4. Recherchez des données basées sur symTab_index dans la table des symboles dynamiques

L'emplacement des symboles indirects peut être déterminé dans LC_DYSYMTAB sous Charger les commandes dans Macho :

Adresse de départ : 0x226748, il y a 794 éléments de données et la taille de chaque élément de données est 0x4.
Parcourez chaque élément de données dans les symboles indirects. Le 111e élément de données stocke 38993.
Ces données correspondent donc à "_NSLog", définissez dySymTab_index = 111
0x226748 111*0x4 = 0x226904