Programación orientada al retorno: la dirección del sistema () contiene un byte NULO

1

Descargo de responsabilidad: estoy haciendo esta pregunta únicamente con fines educativos.

Estoy tratando de encadenar algunas llamadas de función usando programación orientada al retorno, explotando un binario vulnerable que usa strcpy() . Una de estas llamadas de función debe ser una llamada a system() (para ejecutar algún comando de shell). Desafortunadamente, la dirección de system() contiene un byte NULL que llevará a strcpy() a dejar de copiar la carga útil una vez que se observe este byte.

Por lo tanto, mi pregunta es: ¿cuál es el mejor enfoque para resolver este problema?

Ya he revisado libc para funciones similares a system() , pero no he encontrado nada. Otra idea mía sería llamar a fork() , exec() y wait() posteriormente. Sin embargo, esto aumentaría la complejidad de la carga útil.

    
pregunta foobar 19.11.2018 - 18:16
fuente

1 respuesta

1

¿Hay alguna razón por la que deba dejar el proceso original vivo cuando se ejecuta su Shellcode? Simplemente llame a execve directamente (suponiendo que pueda controlar la pila lo suficientemente bien), o una de sus funciones de ayuda , que convertirá el proceso actual en su proceso objetivo.

Un enfoque más complicado que podría funcionar es utilizar dlsym para recuperar un puntero a system , al que luego puede llamar con su comando de destino. Sin embargo, podría tener que llamar primero a dlopen ; No estoy seguro de la semántica de dlsym . La función de Windows correspondiente GetProcAddress toma la dirección base del módulo cargado (biblioteca o ejecutable) como primer puntero, y dlsym podría hacer lo mismo; ya que estás usando ROP, probablemente no te molestará ASLR, por lo que la dirección debería ser predecible.

Finalmente, ya que estás usando ROP, puedes encontrar uno o más dispositivos que te permitan producir aritméticamente la dirección deseada. Hay muchas combinaciones de operandos (constantes en su código de shell, registros o direcciones con valores conocidos en tiempo de explotación, etc.) y operaciones (sumar, restar, o, xor, etc.) que podrían usarse para producir un valor específico que contiene un byte NULO de piezas que no lo contienen, y las operaciones de ALU son cortas, por lo que no debería ser difícil encontrar los gadgets adecuados.

    
respondido por el CBHacking 20.11.2018 - 01:48
fuente

Lea otras preguntas en las etiquetas