Aujourd'hui on s'attaque au challenge "flag" de pwnable.kr. Disponible ici.

Analysons un peu le code source à disposition.

La méthode bourrine

Le code source du challenge

Ce qui m'interpelle en premier lieu, c'est l’absence de la fonction srand(). Comme on peut le découvrir en faisant ses devoirs: l'initialisation du seed avec une variable changeante (date, temps, mesure de température, etc) est une condition nécessaire pour pouvoir utiliser rand() de manière sûre.

https://www.geeksforgeeks.org/rand-and-srand-in-ccpp/

Ce qui veut dire que dans notre cas, rand() produit toujours la même séquence, et comme on est sur du 32 bits il n'y a que 2^32 possibilités à tester.

On peut utiliser un petit script python pour ça, mais ce n'est pas très rapide.

#!/usr/bin/env python3
#-*-coding: utf-8 -*-

from pwn import *
from pprint import pprint

s = ssh(host="pwnable.kr",
        port=2222,
        user="random",
        password="guest")


for i in  range(2**32):
        p = s.process("/home/random/random")
        print("sending: " + str(i))
        p.sendline(str(i))
        r = p.recv()
        print("Received: " + str(r))
        if "Wrong" in str(r):
                print("#")
        else:
                print("founded: " + str(i))
                break

Mais ça c'est la méthode bourrin, essayons d'être plus subtiles.

Plus de subtilité

On sait que rand() est une situé dans une bibliothèque externe et qu'il fournit toujours la même valeur.
Essayons donc de récupérer la valeur de rand() avec ltrace.

Appels à la fonction rand()

Comme on peut le voir, la valeur de rand() est toujours 0x6b8b4567. Il ne reste plus qu'à faire un XOR avec cette valeur et la valeur que l'on souhaite obtenir.

Bingo !

Et voilà, moins de 5 minutes auront suffi à trouver la valeur secrète !

Bonus

On peut vérifier aussi que notre code de bruteforce aurait fonctionné en spécifiant un test sur quelques valeurs avant et quelques valeurs après la valeur secrète.

Le nouveau code
Le script aurait effectivement trouvé la valeur secrète

Social et Media

Comme toujours je suis disponible sur Twitter et cie, si vous avez des questions, des remarques, des suggestions etc. N’hésitez pas !

Twitter: @GhostAgs

Discord: hackraw