¿Por qué necesitamos eliminar los bytes nulos del código de shell?

2

Estoy estudiando los conceptos básicos de hacer códigos de shell. Tengo una pregunta al respecto.

En mi libro de texto, el autor almacena su código de shell en una variable de entorno e inyecta la dirección usando strcpy() en un programa.
Cuando hace su código de shell, elimina bytes nulos. Él dice que esto se debe a que strcpy() se detendrá en bytes nulos.

Sin embargo, creo que, como strcpy() solo obtiene la dirección de la variable de entorno (almacenando su código de shell), si su código de shell tiene bytes nulos, no importa. Creo que su objetivo es cambiar la dirección de retorno en la ruta de la variable de entorno.
En el libro de texto, un código de shell que tiene bytes nulos no funciona en esta situación, pero un código de shell libre de nulos sí lo hace.
No puedo entender la razón por la que necesitamos eliminar los bytes nulos en esta situación.

    
pregunta John Smith 30.04.2018 - 03:18
fuente

2 respuestas

2

Tienes razón en esta situación; strcpy de hecho dejará de leer cuando llegue a un byte nulo, pero esto solo debe hacerse al shellcode que se pasa directamente a una función de cadena que espera cadenas terminadas en nulo. Por supuesto, los bytes nulos son un código de máquina válido.

Dado que solo está inyectando la dirección a su carga útil y no a la carga útil en sí, strcpy no leerá la carga útil, como ha supuesto.

Tal vez el autor hizo una mezcla simple; sin duda, puede haber escenarios en los que sea deseable pasar la carga útil completa a través de algo como strcpy , en cuyo caso, de hecho, deberías lidiar con los bytes nulos.

Consulte esta respuesta para obtener información sobre el historial.

    
respondido por el multithr3at3d 30.04.2018 - 04:23
fuente
0

Un terminador nulo es un método de codificación "segura" porque se supone que la cadena ha terminado una vez que se lee un byte nulo. Esto supuestamente ayuda a prevenir los desbordamientos de búfer y otros problemas similares. En el caso de copia de cadena, la función irá a la dirección de memoria que especifique, leerá un byte de datos y la escribirá en la nueva ubicación. Incrementará las direcciones de memoria y copiará los valores hasta que se lea nulo y la función se cerrará.

Si tiene un valor nulo en su código de shell, cuando pasa por strcpy() , la función asumirá que el nulo en su código de shell es el final de la cadena y sale, dejando su copia de código de shell incompleta.

    
respondido por el SuperAdmin 30.04.2018 - 03:39
fuente

Lea otras preguntas en las etiquetas