mercoledì 14 dicembre 2011

Protostar Net0 writeup

Mi sono bloccato al livello 5 della stessa macchina, devo ben capire come iniettare la shellcode... Per non fermarmi, e visto che di solito i primi livelli sono molto semplici, ho deciso di procedere con questo livello... Io l'ho fatto in locale questa volta, ma si poteva fare benissimo in remoto... Non cambia nulla, solo l'indirizzo della macchina... Visionando il codice del livello:

si capisce molto bene come procedere... Vogliamo soddisfare la condizione presente nell'if(i == wanted) per ottenere il messaggio corretto... Anche se wanted è un numero random, ci viene fornito dal primo printf()... Quindi non dobbiamo fare altro che leggere il dato ed inviarlo alla macchina, ovviamente come little endian 32 bit int...

Al solito mi affido al python... Molto semplice da utilizzare, e risolviamo tramite il modulo struct. Questo modulo ci permette con un semplice passaggio di inviare i dati in little endian... Prima di risolvere questo wargame si deve lanciare l'applicazione tramite il comando /opt/protostar/bin/net0... Poi in /tmp/ mettiamo il codice python e lo avviamo... Finiremo così il livello... Questo il codice:

Provo a spiegare come funziona lo script, anche se è semplicissimo... Alla settima riga si connette alla porta 2999(definita dal codice C), memorizza i dati inviati nella variabile dato, che per mia maggior comprensione stampa sulla shell... Da questa riga estrae il numero inviato random, lo stampa di nuovo sulla shell, lo converte poi come intero e lo passa alla funzione pack(), dove i simboli hanno chiaro significato se si è sbirciato il link precedente di struct... Lo invia alla macchina e riceve il messaggio di risposta dalla macchina...

Piccola pecca dello script... A volte la macchina manda un numero con un carattere in meno, quindi il codice salva anche l'apice che si trova alla fine del numero... In questo caso si ottiene un errore da parte della funzione num()... Niente di preoccupante, si riavvia lo script tante volte finchè il numero non è composta da 10 caratteri... Purtroppo non ho così esperienza da estrarre un numero da una stringa di caratteri... Avevo provato con il modulo re, ma quel 32bit finale non mi permette di utilizzare una sostituzione di caratteri... Quindi anche se non è la soluzione più bella, questa è una soluzione funzionante quando il numero inviato è di 10 caratteri... L'importante è finire...

Nessun commento: