[Switch] PegaSwitch : un toolkit d’exploit WebKit pour les développeurs
Les hackers sont toujours prêts, dès la sortie d’une nouvelle console, à trifouiller et bidouiller jusqu’aux moindres recoins afin de trouver et exploiter des failles. Le bébé de Nintendo, la Switch, ne déroge pas à la règle : alors qu’une faille WebKit vient d’être trouvée, voilà que la Team ReSwitched publie déjà son toolkit (boîte à outils), destinés aux développeurs expérimentés souhaitant profiter et utiliser l’exploit WebKit.
Comme expliqué plus haut, PegaSwitch est un toolkit (boîte à outils en français) pour les développeurs. Il permet d’ores et déjà de lire/écrire dans la mémoire, appeler des fonctions natives et explorer les fonctionnalités de la Switch à partir du processus WebKit. Il ne permet pas encore de coder des homebrews, mais a surtout été conçu pour permettre à d’autres hackers de travailler ensemble vers cet objectif.
Installation
Installez Node, Python 2.7 et Ruby.
Ouvrez les ports UDP 53 ainsi que TCP 80 et 8100 dans le pare-feu.
Lancez npm install, pip2 install flask, gem install rubydns.
Démarrez le serveur DNS avec la commande suivante : (drop sudo pour Windows) :
sudo ruby rdns.rb $yourlocalIP
Lancez le serveur web :
sudo python serve.py
Lancez watchify :
npm start
Démarrez le shell avec :
node debug.js
Pointez votre Switch vers le serveur DNS.
Accédez à l’eShop pour déclencher le portail captif.
Regardez la connexion au shell.
Utilisation
La manière par défaut de travailler avec PegaSwitch se fait via le shell. Tapez help une fois que la Switch sera connectée pour obtenir une liste des commandes disponibles.
Pour désactiver le shell (et travailler simplement avec l’API), commentez la ligne suivante dans le fichier « exploit/main.js » :
setupListener(sc);
API
Conventions
Les valeurs de 64 bits (les pointeurs, principalement) sont représentées par un tableau JavaScript contenant [lo, hi], où chacun fait 32 bits.
Fonctions utilitaires
paddr(address)
— Convertit une valeur de 64 bits en hexadécimaladd2(a, b)
— Ajoute deux valeurs de 64 bits ou ajoute une valeur de 64 bits plus un nombrenullptr(address)
— Retourne true si le valeur de 64 bits donnée vaut 0eq(a, b)
— Retourne true si les deux valeurs de 64 bits sont égalesparseAddr(address)
— Prend une chaîne de caractères hexadécimale et le parse en une valeur de 64 bits’
SploitCore
SploitCore est le point central de PegaSwitch, fournissant toutes les fonctionnalités de base et la partie la plus importante de l’API.
dumpaddr(address, count)
— Prend une adresse et un nombre de 32 bits pour se connecterread4(address, offset)
— Lit une valeur de 32 bits depuisaddress + offset * 4
read8(address, offset)
— Lit une valeur de 64 bits depuisaddress + offset * 4
write4(value, address, offset)
— Écrit une valeur de 32 bits versaddress + offset * 4
write8(value, address, offset)
— Écrit une valeur de 64 bits versaddress + offset * 4
memview(address, size, cb)
— Appellecb
avec un ArrayBuffer pointant vers la « vue » de la mémoire demandée. NE GARDEZ PAS cette vue ou tout objet l’utilisant autour, ou vous allez remplir le GC et bloquer votre SwitchgetAddr(obj)
— Retourne l’adresse d’un objet JavaScriptdonné
mref(offset)
— Retourne l’adresse du module principal (le binaire de l’application lui-même) plus l’offset (de 32 bits) donnégetBase()
— Retourne l’adresse de base de WebKitgetSP()
— Retourne le pointeur stack actuel (actuel comme un appel de fonction en JS), principalement utiles pour les chaînes JOP/ROPmalloc(bytes)
— Retourne l’addresse d’un buffer allouéfree(addr)
— Libère (free) un buffer allouébridge
andcall
— Documentation plus bassvc(id, registers, dump_regs)
— Appelle un SVC spécifique, en passant un tableau de registres et optionnellement en dumpant tous les registres (mettredump_regs
sur true ou false)getTLS()
— Obtient l’adresse de TLSstr2buf(str)
— Alloue un buffer pour une chaîne terminée par un null et retourne l’adressereadString(addr, length)
— Lit une chaîne de caractères depuisaddr
. Si la longueurlength
n’est pas passée en argument ou vaut -1, la fonction s’attend à ce que la chaîne de caractère soit terminée par un nullgc()
— Force le « ramassage des ordures » (garbage collection).
Call
sploitcore.call
permet d’appeler des fonctions natives avec l’adresse. Il prend les paramètres suivants, le premier étant toujours nécessaire :
address
– L’adresse de la fonction. Soit un offset de 32 bits de l’adresse du module principal, soit un pointeur absolu de 64 bitsargs
– Un tableau d’arguments, qui ira dans x0+fargs
– Un tableau de nombres float, qui ira dans d0+registers
– Un tableau de registres bruts (x16 et x30 ne sont pas assignables)dump_regs
– Un booléen pour définir si les registres doivent être dumpés au retour.
Cette fonction retourne toujours la valeur de 64 bits dans in x0.
Bridge
Bridge vous permet d’envelopper une fonction native dans une fonction JavaScript. Exemple :
var strlen = sc.bridge(0x43A6E8, int, char_p); log(strlen('foo')); // Logs 3 to the console
Le premier paramètre est l’adresse (même format que call), le second est le type de la valeur de retour, le reste sont les arguments.
Voici les types valides :
null
— Utilisé pour les fonctions de type voidint
void_p
— Pointeur arbitrairechar_p
— Pointeur sur chaîne de caractèresfloat
— Argument flottant (actuellement uniquement pris en charge pour les arguments, pas pour les retours).
Crédits
- Daeken ;
- Dazzozo ;
- SciresM ;
- yupferris ;
- SomeoneWeird ;
- Normmatt ;
- crowell ;
- Jaames ;
- shutterbug2000 ;
- Et bien d’autres de la Team ReSwitched…
Wirus
Un virus (étonnamment) gentil, qui ne demande qu'à faire plaisir aux gens ! Et hacker ses consoles, accessoirement...- "bonjour jexplique mon probleme jai effectuer un downgrade 3.73 vers 3.65 sur psvita avec hen2 et moduro mai..." - will11160
- "bonjour j'ai un probleme j'arrive pas a un installer CMA (l'assista,t de gestionnare de contenu ps vita) ..." - juju
- "Hello I am so delighted I found your blog page, I really found you by error, while I was browsing on Digg ..." - Owen
- "Un grand merci pour cette traduction d'excellente qualité. Nintendo n'aurait pas fait mieux ! Vous êtes gén..." - Bastien64x
- "Bonjour ! Désolé pour ce retard, j'espère que tu as pu régler ton problème entre-temps, si ce n'est pas le ..." - Wirus
- "[…] grand nom de la scène hack PSP surtout connu pour son PRO Online, ainsi que noname120, ..." - [PSP] God Eater 2 : un petit patch de traductio...
- "[…] cette nouvelle monture et voir si elle est à la hauteur de nos espérances, car souvenez-vous que ..." - [PSP] [Vita] Le shell CyanogenMod passe en vers...
- "[…] vous en avions déjà parlé, CyanogenMod est un shell PSP développé par Joel16 arborant l..." - [PSP] [Vita] Le shell CyanogenMod passe en vers...
- "[…] Instructions disponibles iciHomebrew non signé CyanogenMod […]" - [PSP] CyanogenMod passe à Android Lollipop - Cu...
- "[…] Pour pouvoir installer le plugin, suivez notre tutoriel : TUTO – Comment installer des plugins ?...." - [PSP] CXMB devient rétro-compatible ! - Custom ...