Jailbreak Challenge
Last updated
Last updated
Lors de la décompilation sur cutter, on remarque une fonction qui s'appelle JailbreakTest1Tapped :
Il suffit de double cliquer dessus :
Un jump (bl ou blr ou jmp) est réalisé vers la fonction DVIA_v2.JailbreakDetectionViewController.jailbreakTest1Tapped(Any)
De nouveau, double cliquez dessus :
On distingue dans les rectangles rouges des jmp vers d'autre fonction. La première n'est pas intéressante. Le deuxième est un jmp vers un registre x9. Or on ne connait pas son adresse puisque l'adressage fait sur notre décompilateur n'est pas le bon du à l'ASLR mais les offset oui donc on va essayer de retrouver l'adresse de ce registre pour investiguer la fonction.
On connait l'offset :
Offset : 192c60
Avec cette information on va essayer de récuperer la réel adresse du registre à l'aide de frida et l'injection de fichier JS en utilisant l'API Interceptor. :
RĂ©sultat :
Donc la valeur du registre x9 = 0x100b689a8
Il ne faut pas oublier que c'est un blr x9 donc un jump vers l'adresse contenu dans le registre x9
Donc pour le retrouver sur notre décompilateur on va calculer l'offset entre l'adresse de base du programme et l'adresse contenu dans le registre x9 :
L'offset est le suivant : 1949A8 donc sur notre décompilateur on va donc chercher l'instruction ayant l'adresse 0x1001949A8
C'est une fonction qui renvoie un boolean true (0x01) pour jailbreak et false (0x00) pour non jailbreak.
Donc on peut à l'aide de l'api interceptor la valeur de retour ou changer la valeur de la valeur x0 qui est un registre assez speciale car il renferme la valeur de retour d'une fonction juste après un bl ou blr jump. Si le registre n'est pas altérer.
On s'attache ici :
"il y a une instruction de retard avant l'exécution"
On lit le registre x0 Ă cette adresse Ă l'aide de ce script et on change sa valeur Ă 0 :
Ici on change la valeur de retour de la fonction en manipulant le registre x0.
Comme le challenge 2 on cherche la fonction en lien avec ce challenge.
De nouveau un jump (bl) est réalisé vers une fonction du nom Dvia-v2.........JailbreakTest2Tapped
On double clique :
De nouveau un jump vers ici une class du nom de JailbreakDetection.
Le pseudo code de l'image au dessu est :
On voit bien que JailbreakDetection est une classe est que x0 est une instance de cette classe.
Cherchons donc les méthodes associés à cette classe :
On voit la méthode isJailbroken :
En lançant sur ghidra on voit que cette fonction est aussi une fonction boolean :
On va donc juste changer la valeur de retour afin de bypass le jailbreak :
On a l''offset du début de la fonction, on écrit alors un script pour changer la valeur de retour :
Le bypass est effectif.
On fait la même méthodologie :
On regarde le pseudo code génerer pour avoir une idée de ce que fait cette fonction, et on remarque que globalement elle recherche des fichiers ou comportement des téléphone jailbreak avec une multitude de if et il y a un if final qui nous dis si l'appareil est jailbreak :
On récupere l'adresse de l'instruction if est on fait en sorte qu'on rentre dedans en modifiant la variable local40 :
On fait un script js pour modifier la valeur de w8 en 0 pour bypass le jailbreak attenntion w_number c'est des registre de 32 bits donc pas compatible avec mon système exploitation. Donc on mets x8 pour récupérer la valeur et la modifier :
Même chose que le précedent :
MĂŞme principe que pour le test 3 & 4