[Hackvens 2023][Write Up – Pwn] Random
Enoncé
Parviendrez vous à deviner le code secret ?
nc 13.237.218.78 1337
Reconnaissance
Le binaire « random.elf » qui est fourni est un exécutable linux x86-64.
En termes de protections:
- Full RELRO: La Global Offset Table (GOT) n’est pas réinscriptible.
- No canary: Pas de protections contre les buffers overflow
- NX: La stack n’est pas exécutable
- PIE: Les adresses du programme seront aléatoires (à un offset près)
Reverse
Le programme va lire 0x1d bytes dans /dev/random.
Ensuite, le programme va lire 0x1d bytes depuis stdin.
Enfin, le programme va appeler strcmp pour comparer les deux chaînes de caractères. Si les deux sont égales, la fonction getFlag, qui affiche le flag est appelée.
La vulnérabilité
Comparé à strncmp, qui spécifie une taille précisée en argument, strcmp s’arrête aux null bytes.
Ainsi, avec une chance sur 256, la chaine de caractère aléatoire commencera par un null byte, et notre entrée sera comparé avec la chaine de caractère vide.
Plus qu’à bruteforce!
Solve.py
from pwn import * data = b'' while data == b'': r = remote('15.237.218.78', 1337, level='error') print(r.recvuntil(b'\n\n')) print(r.recvuntil(b'\n\n')) r.send(b'\x00') data = r.recvrepeat(0.1) print(data) r.close()
Flag
J’ai oublié de faire un screen du flag ^^
BDENNEUINGÉNIEUR SÉCURITÉYolo