¿Es posible usar un desbordamiento de búfer en el código inyectado de DLL?

2

¿Es posible aplicar un desbordamiento de búfer en el código que se inyectó usando la inyección de DLL?

Por ejemplo, si inyecto una función foo () en el proceso, ¿es posible llamar a foo () usando un desbordamiento de búfer? Si no, ¿significa que el desbordamiento de búfer solo se puede usar para llamar a funciones internas arbitrarias?

Gracias

    
pregunta Lor 15.06.2014 - 08:16
fuente

2 respuestas

1

Bufferoverflow permite que un atacante permita que el procesador salte a una dirección arbitraria de la memoria del proceso. Dado que el código inyectado de la DLL formará parte del espacio de direcciones del proceso atacado, es posible saltar al código inyectado. El desafío será averiguar cuál es la dirección de Foo.

    
respondido por el Philipp Murry 15.06.2014 - 11:29
fuente
0

Se utiliza un desbordamiento de búfer para sobrescribir otro campo de datos que se encuentra ubicado en la memoria RAM cerca del búfer desbordado. Clásicamente, los desbordamientos de búfer se aprovechan para sobrescribir una ranura de "dirección de retorno" en la pila, o un puntero de función (por ejemplo, en un vtable en lenguajes orientados a objetos), así que haga que la CPU salte a una ubicación elegida por el atacante.

Cuando se produce un salto de este tipo, puede ser a cualquier dirección que contenga código ejecutable, y los contenidos de DLL son, por definición, elegibles. Una DLL es un fragmento de código que, cuando se utiliza, se hace evidente en el espacio de direcciones de la aplicación, como código que se puede ejecutar.

Esto puede ser un reto para el atacante:

  • Muchos sistemas operativos modernos aplican Aleatorización del diseño del espacio de direcciones , lo que significa que el DLL se cargará en una dirección que El atacante no puede necesariamente adivinar por adelantado. Esto contrasta con el ejecutable principal, que en algunos sistemas operativos aún aparecerá en una dirección predecible (aunque hay un sistema operativo que también habilita el procesamiento similar a ASLR para el ejecutable principal). Los detalles varían mucho. Si el atacante puede probar su ataque miles de veces, entonces puede esperar "tener suerte", especialmente en sistemas de 32 bits donde el ASLR tiene relativamente poco espacio para la asignación aleatoria de direcciones.

  • Según el tipo de búfer que se desborda, el atacante puede tener problemas para sobrescribir su campo de dirección de destino con contenido arbitrario. En particular, cuando el búfer contiene texto, en un sistema basado en C, el desbordamiento puede detenerse en el primer byte de valor 0x00, por lo que el atacante podría encontrar que no es posible sobrescribir un campo de dirección con un valor que contenga dicho byte nulo en un lugar inconveniente.

  • Hacer que un proceso de destino cargue una DLL específica, elegida por el atacante, ya requiere mucho control sobre dicho proceso. Normalmente, el atacante tiene que conformarse con la DLL "normal" que la aplicación carga como parte de su procesamiento regular. Esto incluye la DLL "básica" del sistema (por ejemplo, kernel32.dll en sistemas Windows). En los desbordamientos de búfer clásicos, los contenidos del búfer se utilizaron como código; sin embargo, muchas máquinas modernas y sistemas operativos distinguen a datos de código ejecutable , por lo que cualquier intento de "saltar a la pila" activará una excepción del kernel (y normalmente la terminación del proceso) . Es por esto que los atacantes intentan saltar al código DLL existente.

respondido por el Tom Leek 15.06.2014 - 14:42
fuente

Lea otras preguntas en las etiquetas