Pwn0x01

Flag: StarHack{YOU_WON!!}

Challenge

file-archive
3KB
arrow-up-right-from-squareOuvrir
circle-info

Description


return to win!!!

nc 35.180.44.229 1235

circle-exclamation

Solution

On commence par dΓ©compiler le binaire, ici, j'utilise Ghidra. On peut noter 4 choses importantes :

  • La fonction portalGun utilise gets, cette fonction est vulnΓ©rable aux Buffers Overflow.

  • La fonction callMe permet d'afficher le flag, il faut donc faire en sorte de l'appeler.

  • La fonction callMe est Γ  l'adresse 0x080485c6.

  • Le paramΓ¨tre de la fonction callMe doit Γͺtre Γ©gal Γ  0xdeadbeef

Maintenant, on va passer sur GDB (avec le plugin GEFarrow-up-right) pour débugger tout ça. Le buffer qui prend notre input à une taille de 0x44 (68). Notre objectif est de le dépasser pour insérer l'adresse de callMe dans EIP et mettre 0xdeadbeef en paramètre. La commande cyclic permet de générer des patterns et ainsi repérer le nombre de caractères à entrer pour arriver à modifier un endroit spécifique.

EIP contient taaa, on cherche donc l'offset de cette valeur :

Il faut donc 76 caractères pour atteindre EIP. On va donc envoyer 76 * A puis l'adresse de callMe (à l'envers puisque little endian).

ESP + 0, qui correspond à notre premier paramètre de la fonction callMe, contient baaa. On calcule son offset :

On doit mettre 4 caractères random de plus après notre adresse pour accéder au paramètre de la fonction et mettre 0xdeadbeef dedans. J'ai ajouté flag.txt avec un faux flag dedans pour tester notre payload. Ça nous donne :

Le programme crash, mais on a bien eu le flag. Plus qu'Γ  envoyer notre payload au serveur, j'utilise Python avec la librairie pwntoolsarrow-up-right :

Mis Γ  jour