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