desbordamientos de AMD64 y bytes nulos

11

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.

    
pregunta lynks 15.08.2012 - 13:01
fuente

2 respuestas

3

Primero, hay algo extraño con tu ejemplo. Los procesadores actuales que implementan el modo amd64 (también conocido como x86_64 aka x64 aka un montón de otros nombres) no Utilice los 64 bits completos de los registros de direcciones. Utilizan direcciones de 48 bits, y hacen obligatorio que los bits 48 a 63 sean idénticos (como si fuera una "extensión de signo"). Por lo tanto, ninguna CPU producida actualmente aceptará una dirección como 7fffffff_ff480a90 . Lo más probable es que tengas 00007fff_ff480a90 . Esto reduce su problema a dos bytes en lugar de cuatro.

Un método genérico es realizar varios desbordamientos sucesivos; Dependiendo de las condiciones exactas con las que puede desbordar datos, esto puede o no ser posible. Con varios desbordamientos, reemplaza tu ranura de destino con 00000054_54545454 , luego 00000000_54545454 y, finalmente, 00000000_0068a9a0 . Cada desbordamiento le permite escribir un solo byte nulo de terminación, usted quiere escribir tres bytes nulos, por lo tanto, tres desbordamientos.

    
respondido por el Thomas Pornin 25.03.2013 - 16:20
fuente
4

Es posible que desee leer este enlace

Esencialmente, x86 y x64 son diferentes en la forma en que funcionan. El nuevo ABI describe las nuevas formas en que lo hace con las llamadas Leaf y Non Leaf, el manejo y el desenlace de excepciones.

Dado que el propósito es esencialmente desbordar, es necesario comprender el nuevo ABI cómo funciona y dónde están las cosas ahora en lugares ligeramente diferentes para poder "insertar" y "alterar".

    
respondido por el Madison Cat 24.08.2012 - 10:47
fuente

Lea otras preguntas en las etiquetas