Format Ssortingng Attack

J’ai un petit programme en C à exploiter. Et j’ai aussi compris la logique derrière l’attaque à effectuer. Cependant, même si j’essaie, cela ne fonctionne tout simplement pas pour moi.

#include  #include  #define SECRET1 0x44 #define SECRET2 0x55 int main(int argc, char *argv[]) { char user_input[100]; int *secret; int int_input; int a, b, c, d; /* other variables, not used here.*/ /* The secret value is stored on the heap */ secret = (int *) malloc(2*sizeof(int)); /* getting the secret */ secret[0] = SECRET1; secret[1] = SECRET2; printf("Please enter a decimal integer\n"); scanf("%d", &int_input); /* getting an input from user */ printf("Please enter a ssortingng\n"); scanf("%s", user_input); /* getting a ssortingng from user */ printf(user_input); printf("\n"); /* Verify whether your attack is successful */ printf("The original secrets: 0x%x -- 0x%x\n", SECRET1, SECRET2); printf("The new secrets: 0x%x -- 0x%x\n", secret[0], secret[1]); return 0; } 

J’ai juste besoin d’imprimer l’adresse et la valeur de secret [0] en utilisant le format de chaîne “printf (user_input);”

J’ai essayé de donner quelque chose comme “\ x6e \ xaf \ xff \ xff% x% x% x% x% s”. Mais ça ne fonctionne pas. Toute suggestion sera appréciée. Merci beaucoup.

    Cela ressemble à un exercice pour un cours, je vais donc vous donner quelques indications, mais pas la solution réelle.

    Vous tentez d’exploiter ce programme en fournissant des entrées non fiables. Il y a deux bugs assez évidents ici; le premier est le scanf() utilisant %s , car vous pouvez saturer le tampon et écraser la stack. L’autre est une vulnérabilité de format-ssortingng. Remplacer la stack ne vous laisserait probablement pas faire d’intéressant jusqu’à ce que la fonction soit retournée. En vous basant sur la section “Vérifiez si votre attaque est réussie”, vous souhaiterez probablement exploiter la vulnérabilité avant cette date. J’imagine que c’est supposé être une vulnérabilité de chaîne de format.

    Selon la section de vérification, vous devez écraser la mémoire désignée par secret . Le seul moyen de printf à écrire dans un emplacement contrôlé en mémoire consiste à utiliser le spécificateur de format %n , qui écrit le pointeur donné.

    Maintenant, l’astuce consiste à comprendre comment remonter la stack jusqu’à ce que nous trouvions le pointeur approprié. Commodément, il y a un entier contrôlé par l’utilisateur juste avant le pointeur sur la stack. Donc, nous entrons un nombre avec un motif facile à repérer (peut-être 65535, qui est ffff en hex), et utilisons une chaîne de format avec beaucoup de %x s pour voir ce qui est sur la stack. Une fois que nous trouvons cela, la prochaine chose sur la stack devrait être le pointeur.

    Hmm. Je viens d’essayer cela, et il s’avère que ce n’est pas si simple. La disposition exacte du cadre de stack n’est pas réellement liée à l’ordre des déclarations; et cela diffère entre les différents systèmes pour moi. Au lieu de cela, j’ai dû utiliser beaucoup de %lx s, ainsi qu’une chaîne bien connue au début, et append une ligne pour imprimer le pointeur actuel, afin de savoir quand je le trouverais. Remplacez ensuite le %lx correspondant par le %n pour écrire via ce pointeur. Il serait peut-être plus facile d’essayer juste environ 20 %lx s et de les remplacer par %n , jusqu’à ce que vous ayez réussi à écraser ce pointeur.

    Quoi qu’il en soit, espérons que cela suffit pour vous aider à démarrer. Faites moi savoir si vous avez des questions.