BF Addresses in the Stack
Last updated
Last updated
Aprende y practica Hacking en AWS: HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Si te enfrentas a un binario protegido por un canary y PIE (Ejecutable Independiente de Posición), probablemente necesites encontrar una forma de evadirlos.
Ten en cuenta que checksec
puede que no detecte que un binario está protegido por un canary si fue compilado estáticamente y no es capaz de identificar la función.
Sin embargo, puedes darte cuenta manualmente si encuentras que se guarda un valor en la pila al comienzo de una llamada a función y este valor se verifica antes de salir.
Para evadir el PIE necesitas filtrar alguna dirección. Y si el binario no está filtrando ninguna dirección, lo mejor es forzar el RBP y RIP guardados en la pila en la función vulnerable. Por ejemplo, si un binario está protegido usando tanto un canary como PIE, puedes comenzar a forzar el canary, luego los siguientes 8 Bytes (x64) serán el RBP guardado y los siguientes 8 Bytes serán el RIP guardado.
Se supone que la dirección de retorno dentro de la pila pertenece al código binario principal, lo cual, si la vulnerabilidad se encuentra en el código binario, suele ser el caso.
Para forzar el RBP y el RIP desde el binario puedes darte cuenta de que un byte adivinado válido es correcto si el programa muestra algo en la salida o simplemente no se bloquea. La misma función que se proporciona para forzar el canary se puede usar para forzar el RBP y el RIP:
Lo último que necesitas para derrotar al PIE es calcular direcciones útiles a partir de las direcciones filtradas: el RBP y el RIP.
A partir del RBP puedes calcular dónde estás escribiendo tu shell en la pila. Esto puede ser muy útil para saber dónde vas a escribir la cadena "/bin/sh\x00" dentro de la pila. Para calcular la distancia entre el RBP filtrado y tu shellcode, simplemente coloca un punto de interrupción después de filtrar el RBP y verifica dónde se encuentra tu shellcode, luego puedes calcular la distancia entre el shellcode y el RBP:
Desde el RIP puedes calcular la dirección base del binario PIE que necesitarás para crear una cadena ROP válida.
Para calcular la dirección base, simplemente ejecuta objdump -d vunbinary
y verifica las últimas direcciones desensambladas:
En ese ejemplo puedes ver que solo se necesita 1 byte y medio para localizar todo el código, entonces, la dirección base en esta situación será el RIP filtrado pero terminando en "000". Por ejemplo, si filtraste 0x562002970ecf
, la dirección base será 0x562002970000
.
Según algunas observaciones de esta publicación, es posible que al filtrar los valores de RBP y RIP, el servidor no se bloquee con algunos valores que no son los correctos y el script BF podría pensar que obtuvo los correctos. Esto se debe a que es posible que algunas direcciones simplemente no lo rompan incluso si no son exactamente las correctas.
Según esa publicación en el blog, se recomienda agregar un breve retraso entre las solicitudes al servidor.