La WWDC 2016 a eu lieu en Juin 2016

iOS 10

EDIT le 10/09/2016 : J Levin a mis à jour joker pour qu’il decompresse automatiquement un kernelcache

Peu de temps après la fin de la conférence d’ouverture de la WWDC, Apple a publié la première beta d’iOS 10 (build ID : 14A5261v). Celle-ci est arrivée avec le kernelcache et les rootfs des appareils 64 bits non encryptés, pendant un moment certains ont cru à une énorme erreur de la part de la pomme.

Apple a démenti l’erreur en disant vouloir améliorer les performances des appareils sans pour autant compromettre la sécurité d’iOS. Le dechiffrement du kernelcache ne prenant que quelques centaines de millisecondes (la décompression étant toujours aussi longue) le changement n’est pas visible pour l’utilisateur lambda.

Ce mardi (05/07/2017), Apple a publié une seconde beta d’iOS 10 (build ID : 14A5297c). Le lendemain Musclenerd annoncait que les bootloaders (32 bits) le kernelcache, les ramsdisks n’étaient plus crytpés avec iOS 10.0 beta 2.

Decompresser le kernelcache

Donc, je vais expliquer comment décompresser le kernelcache pour l’ouvrir en tant que Mach-O dans IDA.

Voici les pré-requis :

  • Un editeur hexadecimal
  • Un desassembleur
  • lzssdec : Je vous conseille de pas l’utiliser sur Windows, montez plutôt une VM Linux ou OS X

Pourquoi faut tout ça ? Le kernel étant compressé au format lzss, IDA le detecte en tant fichier binaire. C’est pas ce qu’on veut.

Trouver le bon offset

Bon maintenant lancez votre editeur hexadecimal vous faites un drag & drop du kernelcache vers le logiciel.

Voilà ce que ça donne avec le kernel d’un 5S

Le bon offset étant le premier après le header : 1B4

Decompression avec lzssdec

Donc maintenant il faut lzssdec. Vous téléchargez le code puis vous le compilez avec g++ (oui oui c’est du C++).

$ g++ lzssdec.cpp -o lzssdec

Vous testez :

$ ./lzssdec
Usage: lzssdec [-d] [-o OFFSET] <kernelcache> <output>

Si ça retourne le texte au dessus c’est ok.
Maintenant vous allez lancer l’outil en passant les arguments suivants :

$ ./lzssdec -o 0x1B4 <kernelcache.release.n51> kernelcache.release.n51.dec

Et voilà, le kernelcache est maintenant decompressé. Vous pouvez l’ouvrir avec votre desassembleur et commencer la longue étape de reverse engineering

En esperant que ce post a été utile.
Si vous avez besoin d’infos contactez-moi sur Twitter : @matteyeux