BF Addresses in the Stack
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Si te enfrentas a un binario protegido por un canario y PIE (Ejecutable Independiente de la Posición), probablemente necesites encontrar una manera de eludirlos.
Ten en cuenta que checksec
puede no encontrar que un binario está protegido por un canario si este fue compilado estáticamente y no es capaz de identificar la función.
Sin embargo, puedes notar esto manualmente si encuentras que un valor se guarda en la pila al comienzo de una llamada a función y este valor se verifica antes de salir.
Para eludir el PIE necesitas filtrar alguna dirección. Y si el binario no está filtrando ninguna dirección, lo mejor que puedes hacer es fuerza bruta el RBP y RIP guardados en la pila en la función vulnerable. Por ejemplo, si un binario está protegido usando tanto un canario como PIE, puedes comenzar a forzar bruta el canario, 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, que, si la vulnerabilidad se encuentra en el código binario, generalmente será el caso.
Para forzar bruta el RBP y el RIP del binario, puedes deducir que un byte adivinado válido es correcto si el programa produce algo o simplemente no se bloquea. La misma función que se proporciona para forzar bruta el canario se puede usar para forzar bruta el RBP y el RIP:
Lo último que necesitas para derrotar el PIE es calcular direcciones útiles a partir de las direcciones filtradas: el RBP y el RIP.
Desde el 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 puedes poner un punto de interrupción después de filtrar el RBP y verificar 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 es lo que necesitarás para crear una cadena ROP válida.
Para calcular la dirección base, simplemente haz objdump -d vunbinary
y verifica las últimas direcciones desensambladas:
En ese ejemplo, puedes ver que solo se necesitan 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 es 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 de BF pensará que obtuvo los buenos. Esto se debe a que algunas direcciones simplemente no lo romperán incluso si no son exactamente las correctas.
Según esa publicación de blog, se recomienda agregar un breve retraso entre las solicitudes al servidor.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)