Para anotar antes de compilar el programa, deshabilité ASLR a través de:
$ sudo -i
root@laptop:~# echo "0" > /proc/sys/kernel/randomize_va_space
root@laptop:~# exit
logout
Luego compilé el programa a través de:
gcc -ggdb -mpreferred-stack-boundary=4 -o test vuln.c
(Tampoco entendí el parámetro -mpreferred-stack-boundary=4
)
Tengo un programa:
Eldesbordamientoenteoríadeberíaocurrircuandoelcompiladorllegaalalíneadegets(buff);
dondeheestadointentandodesbordarladirecciónderetorno($RIP
).
Acontinuaciónsemuestraeldesmontajedemimétodoprincipal,getInput()
ysayHello()
(conelpropósitodemostrarladireccióndelmétodosayHello
,0x4005d
,queesperoquesobrescribalapilaRIP
).
Cuandodoyunaentradademásde15xA,seguroelprograma.Ycuandoproporcionomásde24xA,comienzoasobrescribirel$RIP
,esdecir,25xAharíanqueelvalordeRIP
0x0000000000400041.Lógicamente,intentéproporcionarlosvaloreshexadecimalespara"4005dc" (dirección sayHello ()) sin embargo, cuando intento eso, fallo. Al usar convertidores de texto hexadecimales en línea, el valor de texto correspondiente que obtengo de "4005dc" es "@ Ü" .
Más, por lo que entiendo que cuando el programa alcance la instrucción retq dentro de getInput()
, aparecerá la dirección de retorno de la parte superior de la pila y saltará a ella.