
framework d'exploitation du heap jemalloc
shadow est un framework d'exploitation du tas jemalloc. Il a été conçu pour être agnostique de l'application cible qui utilise jemalloc comme allocateur de tas (que ce soit la libc d'Android, Firefox, la libc de FreeBSD, jemalloc autonome, ou autre). La version actuelle (2.0) a été testée de manière approfondie avec les cibles suivantes :
Outre le code source de l'outil, ce dépôt comprend également de la documentation sur la mise en place d'un environnement de débogage userland Android pour utiliser shadow, un aperçu rapide des structures jemalloc d'Android à l'aide de shadow, et quelques notes sur la manière dont les bugs de double libération, de libération non alignée et de libération arbitraire se comportent sur le jemalloc d'Android.
Lorsque vous émettez une commande spécifique à jemalloc pour la première fois, shadow analyse toutes les métadonnées jemalloc qu'il connaît et les enregistre dans un fichier pickle Python. Les commandes suivantes utilisent ce fichier pickle au lieu de ré-analyser les métadonnées à partir de la mémoire pour être plus rapides.
Lorsque vous savez que l'état des métadonnées jemalloc a changé (par exemple lorsque vous avez effectué des allocations ou déclenché un garbage collection), utilisez la commande jeparse pour ré-analyser les métadonnées et recréer le fichier pickle.
La première étape consiste à installer pyrsistence sur votre machine hôte.
Sur un appareil rooté, faites ce qui suit :
host$ adb shell
phone$ su root
phone# ps -e
À partir de la sortie de ps, sélectionnez un processus, par exemple com.google.process.gapps :
...
u0_a19 4679 3214 1668980 69216 SyS_epoll_ 7fa5f41430 S com.google.process.gapps
...
phone$ cd /data/local/tmp
phone$ ./gdbserver64 :5039 --attach 4679
Vous pouvez trouver les binaires du serveur GDB pour ARM32 et ARM64 dans le répertoire "bin". Ou, si vous ne nous faites pas confiance, faites :
host$ git clone http://android.googlesource.com/toolchain/gdb
host$ cd ./gdb/gdb-7.11
host$ mkdir build64; cd build64
host$ ../configure --program-prefix=aarch64-eabi-linux- --target=aarch64-eabi-linux --disable-werror
host$ make
host$ sudo make install
Ensuite, sur la machine hôte, faites :
host$ adb forward tcp:5039 tcp:5039
host$ aarch64-eabi-linux-gdb
(gdb) target remote :5039
(gdb) source /dir/with/shadow/gdb_driver.py
(gdb) jeparse -c /dir/with/shadow/cfg/android7_64.cfg
(gdb) jeruns -c
Parfois, le serveur GDB cesse d'écouter si vous mettez trop de temps à émettre la commande target remote :5039. Donc, si vous voyez des erreurs étranges lorsque vous émettez la commande jeparse, recommencez depuis le début.
shadow pour Windows/Firefox a été testé avec les éléments suivants :
Remarque : Si vous travaillez avec une version de Firefox antérieure à 36.0, utilisez la branche mozjs !
Vous devez d'abord configurer WinDBG avec [le serveur de symboles de Mozilla] (https://developer.mozilla.org/fr/docs/Using_the_Mozilla_symbol_server). Vous devez également installer pykd. Copiez ensuite le répertoire shadow que vous avez cloné depuis GitHub dans un chemin (par exemple C:\tmp\).
Vous trouverez également un exemple de script d'initialisation WinDBG dans le fichier "windbg-init.cmd". Placez-le dans C:\tmp\ et démarrez WinDBG avec windbg.exe -c "$$>< C:\tmp\windbg-init.cmd".
Enfin, depuis WinDBG, émettez les commandes suivantes :
!load pykd.pyd
!py c:\\tmp\\shadow\\pykd_driver help
[shadow] De Mysteriis Dom jemalloc
[shadow] shadow v2.0
[shadow] Firefox v56.0a1 (x86-64)