6 votes

Format String Attack

J'ai un petit programme en C qui doit être exploité. Et j'ai également compris la logique derrière l'attaque à réaliser. Cependant, j'ai beau essayer, ça ne marche pas pour moi.

#include <stdio.h>
#include <stdlib.h>

#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 string\n");
  scanf("%s", user_input); /* getting a string 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 la chaîne de format "printf(user_input) ;".

J'ai essayé de donner quelque chose comme " \x6e\xaf\xff\xff %x%x%x%x%s". Mais cela ne fonctionne pas. Toute suggestion sera appréciée. Merci beaucoup.

9voto

Brian Campbell Points 101107

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

Vous tentez d'exploiter ce programme, en fournissant des données non fiables. Il y a deux bugs assez évidents ici ; l'un est le scanf() en utilisant %s car vous pouvez faire déborder le tampon et écraser la pile. L'autre est une vulnérabilité de type chaîne de format. L'écrasement de la pile ne vous permettrait probablement pas de faire quelque chose d'intéressant avant le retour de la fonction. D'après la section "vérifier si votre attaque est réussie", vous voulez probablement exploiter la vulnérabilité avant cela, donc je suppose que c'est supposé être une vulnérabilité de type chaîne de format.

D'après la section de vérification, vous êtes censé écraser la mémoire pointée par secret . Le seul moyen de provoquer printf pour écrire dans un emplacement contrôlé de la mémoire, il faut utiliser la fonction %n spécificateur de format, qui écrit le pointeur donné.

Il s'agit maintenant de trouver comment remonter la pile jusqu'à ce que nous trouvions le pointeur approprié. De façon pratique, il y a un entier contrôlé par l'utilisateur juste avant le pointeur sur la pile. Donc, nous entrons un nombre avec un motif facile à repérer (peut-être 65535, qui est ffff en hexadécimal), et utiliser une chaîne de format avec beaucoup de %x pour voir ce qu'il y a sur la pile. Une fois qu'on a trouvé ça, la prochaine chose sur la pile devrait être le pointeur.

Hmm. Je viens d'essayer, et il s'avère que ce n'est pas si simple. La disposition exacte du cadre de la pile n'est pas réellement liée à l'ordre des déclarations, et elle diffère selon les systèmes pour moi. Au lieu de cela, j'ai dû utiliser beaucoup de %lx avec une chaîne bien connue au début, et ajoutez une ligne pour imprimer le pointeur réel, afin de savoir quand je l'ai trouvé. Ensuite, remplacez le fichier %lx avec le %n pour écrire à travers ce pointeur. Le plus simple est peut-être d'essayer une vingtaine de fois %lx et les remplacer un par un par %n jusqu'à ce que vous ayez réussi à écraser ce pointeur.

Quoi qu'il en soit, j'espère que c'est suffisant pour vous permettre de commencer. Faites-moi savoir si vous avez des questions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X