L'exploitation de failles applicatives de type buffer overflow sur architecture MIPS [2] s'avère légèrement plus complexe que sur architecture IA-32. Ceci est principalement lié à la désynchronisation des caches d'instructions et de données. Afin de forcer cette synchronisation et pouvoir exécuter le code injecté durant le débordement, une opération de cache writeback peut s'avérer nécessaire. Cependant, ce service1 fourni par la bibliothèque C n'est pas systématiquement présent. C'est le cas, par exemple, des dernières versions de µClibc livrées dans les firmwares des routeurs Linksys de type WRTxxx2.Nous proposons, en premier lieu, une méthode permettant d'effectuer un appel à cacheflush(), même si celle-ci n'est pas présente dans la bibliothèque C. Nous détaillons ensuite une méthodologie d'appels de fonctions de la bibliothèque C permettant de s'affranchir de l'injection de code exécutable.
1. Petits rappels concernant l'assembleur MIPS
1.1 Registres et instructions usuels
Les processeurs MIPS possèdent 31 registres généraux. Leur utilisation est plus ou moins normalisée. Nous retrouvons les registres :
- a0 - a3, utilisés pour les paramètres des fonctions ;
- v0 - v1, utilisés pour les valeurs de retour des fonctions ;
- s0 - s7, utilisés en tant que stockage temporaire. Ceux-ci sont sauvegardés, puis restaurés avant un retour de fonction ;
- sp, utilisé comme pointeur de pile ;
- gp, utilisé pour adresser des variables globales, et effectuer des appels de fonctions chargées dynamiquement (typiquement les fonctions de la libc) ;
- t9, utilisé pour contenir l'adresse de la fonction dynamique à appeler ;
- ra, utilisé pour les retours de fonctions. L'équivalent de l'eip sauvegardé sur IA-32.
Le compte n'est pas bon, mais les autres registres ne nous seront d'aucune utilité pour comprendre la suite de l'article. La pile...
- Accédez à tous les contenus de Connect en illimité
- Découvrez des listes de lecture et des contenus Premium
- Consultez les nouveaux articles en avant-première