Desbordamiento de búfer no tiene suficiente espacio para explotar después de que se bloquee

2

Así que estoy tratando de escribir un desbordamiento de búfer para una aplicación de servidor a sabiendas vulnerable, quiero aprender cómo hacerlo por mi cuenta y solo quiero una dirección.

Lo estoy viendo en el depurador de inmunidad en el servidor y tengo control sobre el ECX, el EBP y, lo que es más importante, el registro EIP. El envío de mi búfer desde la máquina atacante bloquea el programa, sin embargo, después no tengo suficiente espacio para colocar mi shell inverso, tengo suficiente espacio en la primera parte de mi búfer. Sólo tengo unos pocos bytes para averiguarlo y más allá de este punto estoy atascado. ¿Es posible colocar un conjunto de instrucciones en una parte anterior de mi búfer y usar esos pocos bytes para volver a él? ¿Dónde puedo leer cómo hacer esto?

    
pregunta Hadoken 17.11.2017 - 08:15
fuente

2 respuestas

1

Hay varias maneras de hacer esto. ¿Puede obtener un punto fijo en el código para configurar su EIP? No nos está diciendo si tiene restricciones de ASLR, pero si las tiene, ¿puede obtener una ubicación fija para consultar? Mira en:

enlace

enlace

Son una gran lectura y deberías encontrar algunas respuestas allí.

    
respondido por el RLFP 17.11.2017 - 09:57
fuente
3

Suponiendo que está hablando de una sobrescritura de EIP de vainilla y no de algo como SEH, tiene dos opciones disponibles para usted. Ninguno de estos son lo que yo consideraría técnicas "principiantes", ya que requieren un poco de conocimiento de ensamblaje, aunque hay algunos sitios web excelentes que pueden ayudarlo.

1. Emplea un Egg Hunter . Un cazador de huevos implica pegar una pequeña parte de un código de shell en un espacio de almacenamiento limitado y luego preparar un huevo de 8 bytes (es decir, n00bn00b) antes de su código de shell. El cazador de huevos buscará en la memoria su único huevo y luego saltará al código de la cáscara que lo sigue. Ejemplo de variable de búfer

buffer = "\x41" *100 + "n00bn00b" + shellcode + "\x90" * 50 + egghunter + offset + jmpback

Donde más arriba "offset" podría ser un simple JMP ESP en una DLL y "jmpback" sería una instrucción de ensamblaje para saltar al búfer a algún lugar en el nopslide.

Aunque parece un poco confuso, el flujo de ejecución es el siguiente

  1. La variable offset se coloca donde está la sobrescritura de EIP. Esta variable simplemente mantiene la dirección en una instrucción JMP ESP que luego apunta a la variable jmpback

  2. La variable jmpback contiene una instrucción de ensamblaje (es decir, \xeb\xc4 ) que regresa al nopsled.

  3. El shellcode de egghunter se ejecuta y comienza a buscar la cadena n00bn00b.

  4. Cuando se encuentra la cadena n00bn00b, salta al código de shell que se ejecuta.

El Egghunter es una excelente manera de darte más espacio de almacenamiento.

2. Saltar hacia atrás en el búfer : la segunda opción, si el espacio del búfer está disponible para usted, es emitir algunas instrucciones de ensamblaje para saltar nuevamente al búfer para ejecutar su código de shell. Esto suena como la más fácil de las dos opciones, sin embargo, es posible destruir la pila si no tienes cuidado de volver a alinear la pila después de la ejecución del código de shell.

Si tiene una sobrescritura limpia de otro registro, como ECX, podría ser posible simplemente JMP ECX disparar su código de shell.

Tenga en cuenta que esta respuesta asume que cosas como DEP y ASLR no están habilitadas en la máquina que está intentando explotar.

    
respondido por el DKNUCKLES 17.11.2017 - 19:07
fuente

Lea otras preguntas en las etiquetas