BF Forked & Threaded Stack Canaries
Si te enfrentas a un binario protegido por un canary y PIE (Ejecutable Independiente de la Posición), probablemente necesites encontrar una forma de evadirlos.
Ten en cuenta que checksec
podría no detectar 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.
Fuerza bruta en el Canary
La mejor forma de evadir un canary simple es si el binario es un programa que crea procesos hijos cada vez que se establece una nueva conexión con él (servicio de red), porque cada vez que te conectas a él se usará el mismo canary.
Entonces, la mejor forma de evadir el canary es simplemente hacer fuerza bruta carácter por carácter, y puedes averiguar si el byte del canary adivinado fue correcto verificando si el programa ha fallado o continúa su flujo regular. En este ejemplo, la función hace fuerza bruta en un canary de 8 Bytes (x64) y distingue entre un byte adivinado correcto y un byte incorrecto simplemente verificando si se envía una respuesta por parte del servidor (otra forma en otra situación podría ser usando un try/except):
Ejemplo 1
Este ejemplo está implementado para 64 bits pero podría ser fácilmente implementado para 32 bits.
Ejemplo 2
Esto está implementado para 32 bits, pero podría cambiarse fácilmente a 64 bits. También tenga en cuenta que para este ejemplo, el programa espera primero un byte para indicar el tamaño de la entrada y la carga útil.
Hilos
Los hilos del mismo proceso también compartirán el mismo token canario, por lo tanto será posible forzar un canario si el binario genera un nuevo hilo cada vez que ocurre un ataque.
Además, un desbordamiento de búfer en una función enhebrada protegida con canario podría usarse para modificar el canario maestro almacenado en el TLS. Esto se debe a que podría ser posible alcanzar la posición de memoria donde se almacena el TLS (y por lo tanto, el canario) a través de un desbordamiento de búfer en la pila de un hilo. Como resultado, la mitigación es inútil porque la verificación se realiza con dos canarios que son iguales (aunque modificados). Este ataque se realiza en el documento técnico: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
Consulte también la presentación de https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015 que menciona que generalmente el TLS se almacena mediante mmap
y cuando se crea una pila de un hilo también se genera mediante mmap
según esto, lo que podría permitir el desbordamiento como se muestra en el documento técnico anterior.
Otros ejemplos y referencias
64 bits, sin PIE, nx, canario BF, escribir en alguna memoria un ROP para llamar a
execve
y saltar allí.
Última actualización