[Hackvens 2023][Write Up – Pwn] Random
Enoncé
Parviendrez vous à deviner le code secret ?
nc 13.237.218.78 1337
![Random ? Random ?](https://www.login-securite.com/wp-content/uploads/2023/11/random1.png)
Random ?
Reconnaissance
Le binaire « random.elf » qui est fourni est un exécutable linux x86-64.
![file random.elf file random.elf](https://www.login-securite.com/wp-content/uploads/2023/11/random2.png)
file random.elf
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)
![checksec random.elf checksec random.elf](https://www.login-securite.com/wp-content/uploads/2023/11/random3.png)
checksec random.elf
Reverse
![fonction main fonction main](https://www.login-securite.com/wp-content/uploads/2023/11/random4.png)
fonction main
Le programme va lire 0x1d bytes dans /dev/random.
![call à /dev/random call à /dev/random](https://www.login-securite.com/wp-content/uploads/2023/11/random5.png)
call à /dev/random
Ensuite, le programme va lire 0x1d bytes depuis stdin.
![call à strcmp et getFlag call à strcmp et getFlag](https://www.login-securite.com/wp-content/uploads/2023/11/random6.png)
call à strcmp et getFlag
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!
![man strcmp man strcmp](https://www.login-securite.com/wp-content/uploads/2023/11/random7.png)
man strcmp
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 ^^
![](https://www.login-securite.com/wp-content/uploads/2021/11/Bdenneu.png)