5 Dec 2010

2eme GSDays - ROP

Return Object Programming

Le but de la conférence est de démontrer les nouvelles techniques de bufferoverfl0w.

StackOverflow

Apres un rappel sur la structure de la stack, l'orateur explique le fonctionnement des stackoverflows 'classiques', c'est-a-dire sans ASLR, DEP, ...

Return Into Libc

La mise en place de DEP (Data Execution Prevention) - en clair rendre la stack non exécutable (utilisation du bit NX sur les processeur x86), rend caduque le codage de shellcode 'classiques'.
Le Return Into Libc consiste a chainer des appels à la libc dans la stack, pour créer un code d'exploitation:
call libc_function
dummy ebp
dummy eip
args...

Les contre-mesures sont:
  • ASLR (Address Space Layout Randomisation): chargement random des adresses de la libc (kernell32.dll est positionnée au démarrage du système) ;
  • Compiler le binaire en ôtant les fonctions libc inutilisées ;
  • inclure des octets 0x00 dans les adresses des fonctions dangereuses (execve, system, ...).

ROP

Mener a bien une attaque de type bufferoverfl0w en utilisant le ROP nécessite au moins une grande librairie sans ASLR. Même sans fonctions intéressantes, elle permet de séquencer des instructions assembleurs pour créer un shellcode.
On commence par chercher des 'gadgets' dans cette librairie ; un gadget étant une partie de code assembleur se terminant par l'opcode RET. Ainsi, on peut séquencer des calls a ces 'gadgets' ; l'instruction RET permettra de dépiler eip sur l'adresse (dans la stack) suivant l'appel a ce gadget.

Petite démonstration de l'orateur: sur un processeur type x86, le nombre de gadgets disponibles pour un RET est bien supérieur au nombre d'instructions précédant ce RET. En effet, une instruction peut contenir un bytecode correspondant à une instruction assembleur.

Par exemple le code:
c6 05 54 98 04 08 5d     movb   $0x5d,0x8049854
c3                       ret
permet de créer le gadget:
c6 05 54 98 04 08 5d     movb   $0x5d,0x8049854
c3                       ret
mais aussi le gadget:
5d                       pop %ebp
c3                       ret

En "ROPpant", il est aussi possible de rendre une zone mémoire exécutable (donc bypasser le DEP): on crée une séquence de WriteProcessMemory (désactive le bit NX) avec le shellcode stocké dans le buffer contrôlé par l'attaquant, puis effectuer un call a l'adresse du buffer pour procéder à l'exécution.

De même, une exploitation en ROP sur l'iPhone permet de s'affranchir des zones mémoires signées.

Outils

L'orateur cite Metasm, RopMe et Zynamics qui est un outil de recherche pure pour un compilateur de gadget.