4 minutes
đ«đ· ROPEmporium - ret2win (x64)
Note
Je suis actuellement entrain dâapprendre le pwn donc il est possible que je fasse des erreurs ou que je dise des choses fausses dans ce post, si vous en voyez nâhĂ©sitez pas Ă me contacter sur discord.
File information
Avant de commencer Ă regarder dans lâexecutable, il faut savoir Ă quoi on sâattaque, on va utiliser file
pour avoir des informations sur le fichier, puis checksec
pour voir les éventuelles sécuritées avec lesquelles il a été compilé
On va donc sâattaquer Ă un executable en 64bit, linkĂ© dynamiquement et qui nâest pas strippĂ©
Maintenant le checksec
Exploitation
On va le run et voir ce quâil se passe
En lisant ce que le programme Ă©crit on apprend plusieurs choses:
- La taille du buffer oĂč est stockĂ© notre input: 32 bytes
- La fonction read() est utilisée pour lire notre input
- read() va lire 56 bytes au maximum
On va pouvoir overflow le buffer puisquâon peut Ă©crire un nombre de bytes supĂ©rieur Ă la taille du buffer
Voici donc le début de notre exploit:
Ici, on déclare deux variables, une qui correspond au padding nécessaire pour remplir le buffer (padding), et une qui correspond au padding pour overwrite la sauvegarde de rbp
(rbp)
On envoie ensuite notre payload mais en lâoccurence ici il ne va rien se passer puisque la sauvegarde de rip
nâa pas Ă©tĂ© overwrite.
La prochaine Ă©tape est de lister les symboles de lâexecutable pour trouver notre fonction âwinâ (une fonction qui va nous permettre de lire le flag). Pour faire ça, on peut utiliser pwndbg
par exemple:
Une fonction sort du lot: ret2win
(situĂ©e Ă lâadresse 0x0000000000400756
)
On va donc regarder ce quâelle fait plus en dĂ©tail, toujours avec pwndbg
Il y a 2 call
, un sur puts
et un sur system
. On voit quâil passe un argument Ă system
, situĂ© Ă lâadresse 0x400943
On va donc regarder ce qui se trouve Ă cette adresse:
Ok, donc câest effectivement notre fonction win, puisquâelle passe "/bin/cat flag.txt"
en argument dans system()
.
LâidĂ©e va donc ĂȘtre dâajouter lâadresse de cette fonction Ă la fin de notre payload, pour quâelle finisse dans la sauvegarde de rip
La sauvegarde de
rip
contient toujours lâadresse de la prochaine instruction Ă Ă©xecuter. Ici, en rĂ©ecrivant sa valeur actuelle par lâadresse de la fonctionret2win
, on modifie la prochaine Ă©tape du programme en lui faisant appeler une fonction qui ne devait jamais ĂȘtre appelĂ©e. On a donc modifiĂ© son flux dâĂ©xecution.
On peut compléter notre exploit:
Maintenant, on lance lâexploit et on devrait avoir le flag
Et⊠le flag nâa pas Ă©tĂ© print car le programme a segfault
. Puisque je suis sous Ubuntu 22.04, qui est une version ultérieure à la 18.04 je suis affecté par les problÚmes de stack alignment (MOVAPS)
Pour régler ça, on peut ajouter un gadget ret
, quâon va trouver en utilisant ROPgadget
, aprĂšs notre padding
Final Payload
Maintenant quâon a lâaddresse du ret
on peut lâajouter Ă notre payload, et il devrait fonctionner cette fois. Voici donc la version finale de lâexploit
Et on a le flag, gg!