2015-03-05 1 views
1

Dans le livre de Jon Erickson Hacking: l'art de l'exploitation, il veut écrire 0xbffffd72 à une valeur qui existe à 0x08049794. Donc il va ...Exploitation de chaîne de format en utilisant des écritures courtes: 4 octets off

./fmt_vuln $(printf "\94\x97\x04\x08"%x%x%x%hn 

... 

test_val @ x08049794 = -65515 0xffff0015 

15 est le nombre d'octets écrits jusqu'à présent.

Ensuite, il soustrait 8 de 0xfd72 pour le premier court et obtient 64874. Pourquoi soustrait 8 et pas 15 ou un autre nombre?

Et après qu'il retranche 0xfd72 de 0x1bfff pour obtenir 49805.

Puis il le fait

./fmt_vuln $(printf "\94\x97\x04\x08\96\x97\x04\x08")%64874x%4\$hn%49805x%5\$hn 

Et puis il obtient le résultat correct de 0xbffffd72.

Mais quand je l'ai

./fmt_vuln $(printf "\94\x97\x04\x08")%64874x%4\$hn 

Je 0xfffffd6e obtenu. Je ne sais pas pourquoi j'ai obtenu fd6e au lieu de fd72.

+1

Le décalage correspond probablement à la taille du 'cadre de pile' pour la fonction, ou à peu près. –

+0

@JonathanLeffler, Comment puis-je vérifier si c'est le cas? –

+0

Le livre ne l'explique-t-il pas? Cela devrait. –

Répondre

1

Par hasard si quelqu'un rencontre le même problème, la valeur de 64874 est la valeur calculée pour atteindre les deux premiers octets de l'adresse. Donc c'est 0xfd72 - 8 = 64874. Il soustrait 8 parce qu'il y a quatre octets de l'adresse écrite via la commande printf. Lorsque j'essaie d'exécuter la même chose avec seulement quatre octets imprimés via le printf, il est désactivé par quatre octets car quatre octets de moins ont été écrits.