UP | HOME

simple​_overflow

crackmes.one (BitFriends)


The code has been compiled with symbols. A function with the name login is readable in Ghidra. It's a basic buffer overflow, like what do CTFs for beginners, with a password variable next to an uint pointer which contains an UID. The goal of the challenge is to set the UID at 0. The program allocates two memories areas side by side and uses fgets with a bigger size than the buffer, which makes it possible to write outside the buffer.

I run GDB to check the address of memories areas to compute the number of letters I have to put to change the UID value. I know the name of the function, I'll just put a breakpoint and check the desassembly code to see where to put more breakpoints on the malloc. Just look the addresses in eax and making a smoll calculation, we see that the size between them is 32.

python -c 'print("A" * 31)' | ./a.out

Le code a été compilé avec les symboles. Une fonction avec le joli nom de login est lisible dans Ghidra. Il s'agit d'un basique dépassement de tampon, comme tous les CTFs font pour les débutants, avec une variable password à côté d'un pointeur uint qui désigne l'UID. Le but est de mettre ce UID à 0. Le programme alloue deux zones mémoires côte à côte et utilise fgets avec une taille plus grande que le tampon, ce qui permet de dépasser dans la zone mémoire du voisin.

Je lance GDB pour pouvoir voir les zones mémoires concernées afin de calculer le nombre de lettres que je dois mettre pour empiéter sur la valeur de l'UID. Je connais le nom de la fonction, je vais juste mettre un point d'arrêt dessus puis regarder le code désassembler pour pouvoir mettre d'autres points aux différents malloc. En regardant les adresses dans eax et en faisant un petit calcul, on voit la taille qui sépare les deux zones mémoires : 32.

python -c 'print("A" * 31)' | ./a.out

Author: rick

Email: rick@gnous.eu

Created: 2024-10-06 dim. 16:49

Validate