int main (int argc, char **argv, char **envp, char **apple)
{
for (int i=0; apple[i]; i++)
printf("%d: %s\n", i, apple[i])
}
```
# macOS Dynamic Linker (dyld) Process Injection
---
## macOS Bibliothèque Injection
La bibliothèque injection est une technique couramment utilisée pour injecter du code malveillant dans un processus en cours d'exécution sur un système macOS. Cette méthode exploite le chargeur dynamique macOS (dyld) pour charger une bibliothèque externe dans l'espace d'adresse du processus cible. Une fois chargée, la bibliothèque injectée peut être utilisée pour exécuter du code malveillant, contourner les mécanismes de sécurité du système et potentiellement escalader les privilèges.
```
0: executable_path=./a
1:
2:
3:
4: ptr_munge=
5: main_stack=
6: executable_file=0x1a01000012,0x5105b6a
7: dyld_file=0x1a01000012,0xfffffff0009834a
8: executable_cdhash=757a1b08ab1a79c50a66610f3adbca86dfd3199b
9: executable_boothash=f32448504e788a2c5935e372d22b7b18372aa5aa
10: arm64e_abi=os
11: th_port=
```
{% hint style="success" %}
Au moment où ces valeurs atteignent la fonction principale, les informations sensibles ont déjà été supprimées ou il y aurait eu une fuite de données.
{% endhint %}
Il est possible de voir toutes ces valeurs intéressantes en déboguant avant d'entrer dans la fonction principale avec :
lldb ./apple
(lldb) target create "./a"
Exécutable actuel défini sur '/tmp/a' (arm64).
(lldb) process launch -s
[..]
(lldb) mem read $sp
0x16fdff510: 00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 ................
0x16fdff520: d8 f6 df 6f 01 00 00 00 00 00 00 00 00 00 00 00 ...o............
(lldb) x/55s 0x016fdff6d8
[...]
0x16fdffd6a: "TERM_PROGRAM=WarpTerminal"
0x16fdffd84: "WARP_USE_SSH_WRAPPER=1"
0x16fdffd9b: "WARP_IS_LOCAL_SHELL_SESSION=1"
0x16fdffdb9: "SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.4.sdk"
0x16fdffe24: "NVM_DIR=/Users/carlospolop/.nvm"
0x16fdffe44: "CONDA_CHANGEPS1=false"
0x16fdffe5a: ""
0x16fdffe5b: ""
0x16fdffe5c: ""
0x16fdffe5d: ""
0x16fdffe5e: ""
0x16fdffe5f: ""
0x16fdffe60: "pfz=0xffeaf0000"
0x16fdffe70: "stack_guard=0x8af2b510e6b800b5"
0x16fdffe8f: "malloc_entropy=0xf2349fbdea53f1e4,0x3fd85d7dcf817101"
0x16fdffec4: "ptr_munge=0x983e2eebd2f3e746"
0x16fdffee1: "main_stack=0x16fe00000,0x7fc000,0x16be00000,0x4000000"
0x16fdfff17: "executable_file=0x1a01000012,0x5105b6a"
0x16fdfff3e: "dyld_file=0x1a01000012,0xfffffff0009834a"
0x16fdfff67: "executable_cdhash=757a1b08ab1a79c50a66610f3adbca86dfd3199b"
0x16fdfffa2: "executable_boothash=f32448504e788a2c5935e372d22b7b18372aa5aa"
0x16fdfffdf: "arm64e_abi=os"
0x16fdfffed: "th_port=0x103"
0x16fdffffb: ""
## dyld\_all\_image\_infos
Il s'agit d'une structure exportée par dyld avec des informations sur l'état de dyld que l'on peut trouver dans le [**code source**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld\_images.h.auto.html) avec des informations telles que la version, le pointeur vers le tableau dyld\_image\_info, vers dyld\_image\_notifier, si le processus est détaché du cache partagé, si l'initialisateur de libSystem a été appelé, le pointeur vers l'en-tête Mach de dyld, le pointeur vers la chaîne de version de dyld...
## Variables d'environnement dyld
### dyld de débogage
Variables d'environnement intéressantes qui aident à comprendre ce que fait dyld :
* **DYLD\_PRINT\_LIBRARIES**
Vérifie chaque bibliothèque chargée :
```
DYLD_PRINT_LIBRARIES=1 ./apple
dyld[19948]: <9F848759-9AB8-3BD2-96A1-C069DC1FFD43> /private/tmp/a
dyld[19948]: /usr/lib/libSystem.B.dylib
dyld[19948]: /usr/lib/system/libcache.dylib
dyld[19948]: /usr/lib/system/libcommonCrypto.dylib
dyld[19948]: /usr/lib/system/libcompiler_rt.dylib
dyld[19948]: <65612C42-C5E4-3821-B71D-DDE620FB014C> /usr/lib/system/libcopyfile.dylib
dyld[19948]: /usr/lib/system/libcorecrypto.dylib
dyld[19948]: <8790BA20-19EC-3A36-8975-E34382D9747C> /usr/lib/system/libdispatch.dylib
dyld[19948]: <4BB77515-DBA8-3EDF-9AF7-3C9EAE959EA6> /usr/lib/system/libdyld.dylib
dyld[19948]: /usr/lib/system/libkeymgr.dylib
dyld[19948]: <1A7038EC-EE49-35AE-8A3C-C311083795FB> /usr/lib/system/libmacho.dylib
[...]
```
* **DYLD\_PRINT\_SEGMENTS**
Vérifiez comment chaque bibliothèque est chargée :
```
DYLD_PRINT_SEGMENTS=1 ./apple
dyld[21147]: re-using existing shared cache (/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e):
dyld[21147]: 0x181944000->0x1D5D4BFFF init=5, max=5 __TEXT
dyld[21147]: 0x1D5D4C000->0x1D5EC3FFF init=1, max=3 __DATA_CONST
dyld[21147]: 0x1D7EC4000->0x1D8E23FFF init=3, max=3 __DATA
dyld[21147]: 0x1D8E24000->0x1DCEBFFFF init=3, max=3 __AUTH
dyld[21147]: 0x1DCEC0000->0x1E22BFFFF init=1, max=3 __AUTH_CONST
dyld[21147]: 0x1E42C0000->0x1E5457FFF init=1, max=1 __LINKEDIT
dyld[21147]: 0x1E5458000->0x22D173FFF init=5, max=5 __TEXT
dyld[21147]: 0x22D174000->0x22D9E3FFF init=1, max=3 __DATA_CONST
dyld[21147]: 0x22F9E4000->0x230F87FFF init=3, max=3 __DATA
dyld[21147]: 0x230F88000->0x234EC3FFF init=3, max=3 __AUTH
dyld[21147]: 0x234EC4000->0x237573FFF init=1, max=3 __AUTH_CONST
dyld[21147]: 0x239574000->0x270BE3FFF init=1, max=1 __LINKEDIT
dyld[21147]: Kernel mapped /private/tmp/a
dyld[21147]: __PAGEZERO (...) 0x000000904000->0x000101208000
dyld[21147]: __TEXT (r.x) 0x000100904000->0x000100908000
dyld[21147]: __DATA_CONST (rw.) 0x000100908000->0x00010090C000
dyld[21147]: __LINKEDIT (r..) 0x00010090C000->0x000100910000
dyld[21147]: Using mapping in dyld cache for /usr/lib/libSystem.B.dylib
dyld[21147]: __TEXT (r.x) 0x00018E59D000->0x00018E59F000
dyld[21147]: __DATA_CONST (rw.) 0x0001D5DFDB98->0x0001D5DFDBA8
dyld[21147]: __AUTH_CONST (rw.) 0x0001DDE015A8->0x0001DDE01878
dyld[21147]: __AUTH (rw.) 0x0001D9688650->0x0001D9688658
dyld[21147]: __DATA (rw.) 0x0001D808AD60->0x0001D808AD68
dyld[21147]: __LINKEDIT (r..) 0x000239574000->0x000270BE4000
dyld[21147]: Using mapping in dyld cache for /usr/lib/system/libcache.dylib
dyld[21147]: __TEXT (r.x) 0x00018E597000->0x00018E59D000
dyld[21147]: __DATA_CONST (rw.) 0x0001D5DFDAF0->0x0001D5DFDB98
dyld[21147]: __AUTH_CONST (rw.) 0x0001DDE014D0->0x0001DDE015A8
dyld[21147]: __LINKEDIT (r..) 0x000239574000->0x000270BE4000
[...]
```
* **DYLD\_PRINT\_INITIALIZERS**
Affiche quand chaque initialiseur de bibliothèque est en cours d'exécution :
```
DYLD_PRINT_INITIALIZERS=1 ./apple
dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
[...]
```
### Autres
* `DYLD_BIND_AT_LAUNCH`: Les liaisons paresseuses sont résolues avec des liaisons non paresseuses
* `DYLD_DISABLE_PREFETCH`: Désactive le préchargement du contenu \_\_DATA et \_\_LINKEDIT
* `DYLD_FORCE_FLAT_NAMESPACE`: Liaisons à un seul niveau
* `DYLD_[FRAMEWORK/LIBRARY]_PATH | DYLD_FALLBACK_[FRAMEWORK/LIBRARY]_PATH | DYLD_VERSIONED_[FRAMEWORK/LIBRARY]_PATH`: Chemins de résolution
* `DYLD_INSERT_LIBRARIES`: Charge une bibliothèque spécifique
* `DYLD_PRINT_TO_FILE`: Écrit le débogage dyld dans un fichier
* `DYLD_PRINT_APIS`: Affiche les appels d'API de libdyld
* `DYLD_PRINT_APIS_APP`: Affiche les appels d'API de libdyld effectués par main
* `DYLD_PRINT_BINDINGS`: Affiche les symboles lorsqu'ils sont liés
* `DYLD_WEAK_BINDINGS`: Affiche uniquement les symboles faibles lorsqu'ils sont liés
* `DYLD_PRINT_CODE_SIGNATURES`: Affiche les opérations d'enregistrement de signature de code
* `DYLD_PRINT_DOFS`: Affiche les sections du format d'objet D-Trace telles qu'elles sont chargées
* `DYLD_PRINT_ENV`: Affiche l'environnement vu par dyld
* `DYLD_PRINT_INTERPOSTING`: Affiche les opérations d'interposition
* `DYLD_PRINT_LIBRARIES`: Affiche les bibliothèques chargées
* `DYLD_PRINT_OPTS`: Affiche les options de chargement
* `DYLD_REBASING`: Affiche les opérations de réadressage de symboles
* `DYLD_RPATHS`: Affiche les expansions de @rpath
* `DYLD_PRINT_SEGMENTS`: Affiche les mappages des segments Mach-O
* `DYLD_PRINT_STATISTICS`: Affiche les statistiques de timing
* `DYLD_PRINT_STATISTICS_DETAILS`: Affiche des statistiques de timing détaillées
* `DYLD_PRINT_WARNINGS`: Affiche les messages d'avertissement
* `DYLD_SHARED_CACHE_DIR`: Chemin à utiliser pour le cache de bibliothèques partagées
* `DYLD_SHARED_REGION`: "use", "private", "avoid"
* `DYLD_USE_CLOSURES`: Active les fermetures
Il est possible d'en trouver davantage avec quelque chose comme :
```bash
strings /usr/lib/dyld | grep "^DYLD_" | sort -u
```
Ou télécharger le projet dyld depuis [https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz) et l'exécuter à l'intérieur du dossier :
```bash
find . -type f | xargs grep strcmp| grep key,\ \" | cut -d'"' -f2 | sort -u
```
## Références
* [**\*OS Internals, Volume I: User Mode. Par Jonathan Levin**](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
Apprenez le piratage AWS de zéro à héros avec htARTE (Expert de l'équipe rouge AWS de HackTricks)!
Autres façons de soutenir HackTricks:
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts GitHub.