Mes premiers Buffers Overflows – Partie 2 – Introducing Peda

Comme vous avez pu le lire précédemment, Peda est une extension pour GDB, qui est vraiment très pratique, voyons un peu comment nous en servir pour l’exploitation et obtenir un shell depuis un programme faillible ..

Un shell ? Il a dit un shell ? Et oui ! Rappelez vous que tout ceci a pour but d’obtenir plus de privilèges via l’exploitation d’un programme faillible !

Peda

Comme expliqué sur le github du projet peda s’installe très simplement :
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit

Facile non ? Vous pouvez cependant avoir quelques problèmes si vous avez un GDB compilé avec python3. Cela peut etre le cas avec un Ubuntu 13. A vous de le recompiler avec python2.

A la recherche d’EIP

Comme vous avez pu le comprendre ( je m’appuie pas mal sur le post précédant ) On va chercher a trouver la taille du buffer puis en determiner la position d’eip.
Pour cela on peut tester en remplissant petit a petit notre buffer jusqu’a avoir un segfault.
Et … Ca peut etre vite ennuyant .. Et pas précis. Mais heureusement ! Il y a Peda !
On va utiliser un petit truc sympa qui va nous permettre de connaitre la position d’eip par rapport au début de notre buffer.
Cela se passe au niveau des arguments que l’on passe au programme.
Pour cela dans GDB on utilise la commande suivante :

pset arg ‘cyclic_pattern(128)’

Ce qui va nous mettre en argument un pattern généré par peda de 128 caracteres.
On lance ensuite le programme, avec notre argument donc.
Il va nous sortir un joli segfault comme vous vous en doutez.
A ce moment la utilisons la commande pattern_search . Celle ci va nous donner la position d’eip.
C’est plus simple comme cela non ?

Et voila ! On sait maintenant que EIP se trouve a 37 octets du début du buffer !
 
Il est aussi possible de faire cela avec l’outil pattern_create/pattern_offset de Metasploit. Mais on verra cela dans un autre article.

Shellcode

Nous avons donc la taille du buffer, il nous faut aussi un shellcode pour mener à bien cette exploitation.
Et encore une fois nous allons en récupérer un tout prêt avec peda.
Avec une simple commande : shellcode generate [plateforme] [type]
Notre shellcode est donc : « x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x31xc9x89xcax6ax0bx58xcdx80 »
Transformons le en variable, car je vous rappel que peda est basé sur python !
Pour cela il suffit de taper « python » pour entrer dans la console python, ensuite classique entrez le nom de votre variable et son contenu et CTRL+D pour quitter cette console.
Il ne nous reste plus qu’a provoquer un nouvel overflow avec les nouvelles informations que nous avons, soit :
pset arg ‘ »A »*37+ »XXXX »+ »x90″*1337+shellcode’
Nous avons :
A*37    => Notre overflow
XXXX => L’adresse ou pointera eip ( inconnue pour le moment )
x90*1337 => 1337 NOP des instructions vides qui vont remplir la stack
shellcode => Notre shellcode qui va glisser dans la stack grace aux nops.
Très bien ! Nous pouvons maintenant choisir une des adresses de la stack que peda nous montre pour la placer dans EIP. Le programme glissera alors dans la chaine de NOPs et executera ensuite notre shellcode.
Et voila un shell !
Voici donc pour cette petite introduction à peda.
Vous aurez donc compris pourquoi cette extension est bien pratique ! Que vous soyez d’accord ou non, votre avis m’intéresse ! N’hésitez pas a commenter !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *