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 retpermet de créer le gadget:
c6 05 54 98 04 08 5d movb $0x5d,0x8049854 c3 retmais 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.