xman_2019_format
- Inspection de routine, programme 32 bits, nx est activé
- Récupération de la chaîne dans le programme, trouvé la fonction de porte dérobée, back_doorr = 0x80485AB
- Cette question buf n'est pas stockée sur la pile, mais sur le tas demandé par malloc
- Puis buf comme paramètre, entrez sub_80485C4
- Puisqu'il existe une fonction de porte dérobée, vous pouvez utiliser la chaîne de format pour changer l'adresse de retour en back_door , qui est
principalement utilisée pour écrire la%ac$bn
longueura
des données dansb
la position de décalage . - Les vulnérabilités de chaîne de format doivent généralement divulguer d'abord l'adresse de la pile, puis calculer le décalage, mais il n'y a aucun moyen de l'utiliser ici, car les s ici sont stockés sur le bloc, pas sur la pile. Par conséquent, nous pouvons utiliser les données déjà présentes sur la pile pour placer un pointeur vers la pile d'adresses de retour de fonction sur la pile, puis détourner la pile d'adresses de retour.
La chaîne ebp est à un décalage de 10 par rapport à notre point d'entrée, la chaîne ebp 2 est à 0x12 et l'adresse de retour est à 0x13. En combinant avec 0xcf3c et de multiples changements, on constate que le dernier pointeur de l'adresse de retour est 0xc, l'adresse de retour est 0x8048697, puis back_doorr = 0x80485AB - Mon idée est d'utiliser la chaîne ebp pour modifier le pointeur qui pointe la chaîne ebp vers l'adresse de retour, puis de changer l'adresse de retour en back_door, et il suffit de modifier deux octets.
payload='%12c%10$hhn|%34219c%18$hn'
Expliquez un peu la charge utile.
%12c%10$hhn
Supposons que le dernier bit du pointeur de l'adresse de retour soit 0x0c (0 ~ F sont tous OK, avec une probabilité de 1/16) et que le décalage est de 10 (le premier ebp encerclé dans la figure ci-dessus) L'octet de poids faible du contenu de la chaîne) est remplacé par 0xc. Maintenant, le contenu de 0xffffcf38 est 0xffffcf0c. Continuez
%34249c%18$hn
ensuite à modifier le décalage à 18 (la chaîne ebp encerclée dans le deuxième cercle de la figure ci-dessus) car nous avons déjà mis 0xffffcf38 dans Le contenu est modifié en 0xffffcf0c, donc ce qui est modifié ici est le contenu de 0xffffcf0c (en supposant que ce soit l'adresse de retour), nous changeons l'adresse en back_door, car seuls les 2 derniers octets sont différents , alors modifiez-le légèrement Oui, 34219 = 0x85ab
Le moment est venu de tester le personnage. J'ai essayé plusieurs fois avant de réussir.
Terminer l'expérience
from pwn import *
p = remote("node3.buuoj.cn",27585)
#p=process('./xman_2019_format')
backdoor = 0x080485AB
payload='%12c%10$hhn|%34219c%18$hn'
p.sendline(payload)
p.interactive()