venerdì 24 febbraio 2012

hes2010 level2 writeup

Questo livello è un livello basato essenzialmente sulla cifratura... Abbiamo un programma che sappiamo sia un eseguibile perchè per prima cosa diamo un file somebinary e ci ritorna che è un eseguibile... Non abbiamo i sorgenti del file, quindi le strade da prendere erano almeno 3... Reverse engineer, modificare la variabile con qualche sistema(non so se sia possibile) e andare di bruteforce...

Io ho seguito l'ultima, se qualcuno è riuscito a finirlo in modo diverso, può scriverlo sotto che sono molto interessato a vedere le altre soluzioni... Ho dato uno strings somebinary ed ho notato che sono spuntati fuori 2 stringhe molto lunghe... La prima 1234567890abcdef e la seconda è 53f4e3d0419c6e0957f5f8... La prima mi da l'idea di essere la base del cifrario utilizzato... la seconda invece è il risultato che vogliamo ottenere...

Ho provato per prima cosa a fare delle prove, ed ho capito che si trattava appunto di un cifrario a rotazione di caratteri hex che cambiavano di posizione(o comunque seguivano regole strane)... Io ho utilizzato un semplice metodo per le prime 4 lettere... Ho creato un file con dentro tutti i caratteri stampabili e facevo eseguire da un semplice bash script un comando così fatto:
./somebinary 1234567890abcdef $i

Controllando alla fine i risultati ottenuti andavo a prendere il carattere corrispondente (facevo anche un print $i)... Il sistema è molto idiota, e non presenta tecnicismi di alto livello... E' proprio fatto alla buona... Comunque dopo aver capito il sistema si impiega pochissimo tempo per capire quale rotazione o sostituzione si deve utilizzare(tipo tutti i caratteri \x2* dove asterisco varia è uno dei caratteri 1234567890abcdef del cifrario, presentavano lo stesso valore finale tipo *1, quindi se si stava cercando un 41 si dove cercare lì)...

Io mi sono bloccato sul quarto carattere... Non avevo preso in considerazione che il codice potesse consistere di due parole, come infatti era... Quindi avevo si lo spazio dentro al file dei caratteri stampabili, ma quando lo immettevo con quel codice ovviamente mi usciva al primo spazio dopo la seconda parola passata...

Ho ovviato al problema facendo uso degli apici '... Così non usciva allo spazio... E dopo aver tradotto \x20 con spazio, ed aver scritto 'veri ' la combinazione mi è tornata corretta... Quindi ho continuato iterando sempre il processo...

Ovviamente ringrazio StevenVanAcker perchè mi ha suggerito un sistema per printare ogni carattere nella console... Io non lo conoscevo... Con $(printf "\x20") si stampa uno spazio ad esempio... Mi è stato molto utile per capire meglio l'andamento dei cifrari a rotazione...

Nel programma sempre con strings si leggeva anche /etc/pass/carey... E si leggeva pure lo strcmp(), che è la funzione di C/C++ per confrontare stringhe... Ecco perchè io ho ragionato così...

Per ottenere la password dell'utente carey si deve lanciare questo comando:
./somebinary 1234567890abcdef 'veri s3cret'

Nessun commento: