Laboratorio 5 15/05/2023
slow_printer.file
Dopo aver installato Ghidra e aperto il file binario abbiamo cominciato ad ambientarci e provare a capire cosa avevamo davanti e come funzionasse, studiando codice e interfaccia.
Durante questa fase di “comprensione testo” abbiamo notato una chiamata a funzione usleep
all’interno della seguente funzione:
void FUN_004011d6(void)
{
DAT_00404058 = DAT_00404058 * 2;
usleep((int)DAT_00404058 * 500000);
return;
}
Questa funzione ci ha subito incuriositi in quanto direttamente associata a quello che era il “problema” da risolvere dato che l’obiettivo era stampare più velocemente la flag.
A confermare i nostri sospetti c’era una variabile (presumibilmente globale) che veniva raddoppiata ogni volta che la funzione era chiamata, per poi essere successivamente usata come input della funzione usleep
insieme al numero “500000
” in una moltiplicazione, andando a generare dei tempi esponenzialmente piu’ lunghi.
Date le precedenti considerazioni il primo cambiamento che abbiamo provato ad applicare è stato quello di modificare quel 500000
sospetto tramite il cambiamento del valore 0x7a120
nel contenuto del file a destra (sottolineato in rosso nell’immagine sotto), cambiamento che poi si rivelerà essere sufficiente al compimento dell’obiettivo.
I passi successivi sono stati intuitivamente l’esportazione da Ghidra e l’esecuzione di entrambi (originale e patched) i file da terminale; da questi test abbiamo potuto verificare che la flag venisse stampata correttamente.