En el pasado, he logrado desbordar mis propios programas vulnerables y los de otros, pero solo en un entorno de 32 bits. Cada vez que intento un simple aplastamiento de pila en una máquina de 64 bits, me encuentro con problemas. Una dirección que intento escribir siempre contiene bytes nulos.
Un ejemplo simple de un problema de ayer; Intenté sobrescribir el GOT para hacer que una llamada posterior a printf()
se convierta en una llamada a system()
. Tenía todas las direcciones que necesitaba (ASLR desactivado, DEP activado).
Me quedé atascado cuando intenté sobrescribir un puntero stackland (dirección de memoria alta) con un valor de heapland (dirección de memoria baja).
0x7fffffff_ff480a90 -> 0x00000000_0068a9a0
Mi desbordamiento terminó con \xa0\xa9\x68
, que con el terminador nulo dejó el puntero como si estuviera;
0x7fffffff_0068a9a0
Lo que no era bueno, lo observé durante horas y no pude encontrar una manera de evitarlo. Como he dicho, me he topado con este problema de bytes nulos muchas veces. Siempre pensé que era solo una de esas cosas, pero parece que es completamente imposible hackear un sistema de 64 bits, ya que las direcciones suelen contener bytes nulos.
¿Solo tengo mala suerte? ¿Me estoy perdiendo algo obvio? No he escuchado a nadie hablar sobre este tema en términos de 32 contra 64.