Da notare prima di compilare il programma ho disabilitato ASLR tramite:
$ sudo -i
root@laptop:~# echo "0" > /proc/sys/kernel/randomize_va_space
root@laptop:~# exit
logout
Ho quindi compilato il programma tramite:
gcc -ggdb -mpreferred-stack-boundary=4 -o test vuln.c
(Inoltre non ho capito il parametro -mpreferred-stack-boundary=4
)
Ho un programma:
L'overflowinteoriadovrebbeverificarsiquandoilcompilatoreraggiungelarigadigets(buff);
dovehotentatoditraboccarel'indirizzodiritorno($RIP
).
Diseguitoèlosmontaggiodelmiometodoprincipale,getInput()
esayHello()
(alloscopodimostrarel'indirizzodelmetodosayHello
,0x4005d
,chesperodisovrascriverelostackRIP
con).
Quandoforniscouninputsuperiorea15xA,seggoilprogramma.Equandoforniscopiùdi24xA,comincioasovrascrivereil$RIP
,cioè25xArestituisconoilvaloreRIP
0x0000000000400041.Logicamente,hoprovatoafornireivaloriesadecimaliper"4005dc" (indirizzo say ()), ma non riesco a provarlo. Quando si utilizza un convertitore esadecimale online in un convertitore di testo, il valore di testo corrispondente ricevuto da "4005dc" è "@ Ü" .
Ancora di più capisco che quando il programma ha raggiunto l'istruzione retq in getInput()
, farà apparire l'indirizzo di ritorno in cima allo stack e vi salterà sopra.