web-dev-qa-db-fra.com

Puis-je faire un exploit au format de chaîne pour les systèmes X64?

J'essayais de reproduire l'expérience dans Gray Hat Piratage - troisième édition , chapitre 12, à propos des exploits de chaîne de format, mais leur architecture est IA32, tandis que le mien est une AMD 64bits. Par conséquent, lorsque je vérifie les valeurs en pile avec des commandes telles que:

$ ./fmtstr "AAAAAAAA %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x"   

Rien ne montrant, qui ressemble à sa représentation en mémoire (41414141 41414141). Pourquoi le tampon d'exploitation ne renvoie pas les données de mémoire réelles et séquentielles ?? Pour plus d'informations, veuillez vous reporter sa console image Aide!.

7
Fernando Pérez

Si vous utilisez le code exemple du livre (ci-dessous), à un moment donné, vous devez atteindre le modèle "AAAAAAAA" (0x41). Notez que, puisque vous l'exécutez sur une machine 64 bits qui stocke des éléments de la pile avec 8 octets chacun, vous devez l'exécuter avec $ ./fmtstr "AAAAAAAA %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x" Au lieu de cela, ou si vous manquerez une partie de chaque élément sur la pile.

#include <stdlib.h>
int main(int argc, char *argv[]){
        static int canary=0;   // stores the canary value in .data section
        char temp[2048];       // string to hold large temp string
      strcpy(temp, argv[1]);   // take argv1 input and jam into temp
      printf(temp);            // print value of temp
      printf("\n");            // print carriage return
      printf("Canary at 0x%08x = 0x%08x\n", &canary, canary); //print canary
}

Vous devez faire attention à la citation du livre qui indique:

Le fait que le quatrième élément montré (de la pile) était notre chaîne de format dépend de la nature de la fonction de format utilisé et de l'emplacement de l'appel vulnérable dans le programme vulnérable. Pour trouver cette valeur, utilisez simplement une force brute et continuez à augmenter le nombre de jetons% 08x jusqu'au début de la chaîne de format. Pour notre exemple simple (FMTSTR), la distance, appelée décalage, est définie comme 4.

N'oubliez pas que le paramètre étant analysé à printf n'est pas la chaîne elle-même, mais l'adresse de la chaîne. Donc, il est de position sur la mise en page de la mémoire du programme par rapport à la pile printf est ce qui définira la davantage à laquelle vous devrez rechercher pour la rechercher.

5
murphsghost