¿A qué otro lugar (además de libc) el atacante redirige el flujo de control después de que un ataque como el desbordamiento de búfer haya tenido éxito?

2

No estoy seguro de que este sea el lugar adecuado para hacer esta pregunta o no.

Quiero saber en el tipo anterior o moderno de ataque de desbordamiento de búfer, cuando el atacante sobrescribió la dirección de retorno, ¿dónde estableció la nueva dirección de retorno para que apunte? Como sabemos hoy debido a los nuevos mecanismos de protección, es más difícil insertar un código y ejecutarlo ( Prevención de ejecución de datos ), por lo tanto, el atacante intenta para usar la dirección del código / biblioteca existente como "libc" para cambiar el flujo de control a ellos. Me pregunto junto a "libc" ¿qué oportunidad existe que puedan usar?

    
pregunta Am1rr3zA 14.06.2013 - 03:39
fuente

1 respuesta

3

Actualización : parece que esperas más información concreta, así que amplié un poco mi publicación. Por lo que sé, sin embargo, ningún código, aparte del programa real, las bibliotecas y el código del kernel, generalmente se asigna a la memoria cuando su programa se ejecuta en modo de usuario.

Hay varios lugares a los que podría redireccionar el flujo de control, en caso de que la pila no sea ejecutable:

  • ret2data : coloque el código de explotación en la sección de datos y luego apunte la dirección de retorno allí. A menudo no es posible.
  • ret2text : salte al código existente en la sección .text del binario explotado. Esto incluye saltar a DLL y otras bibliotecas compartidas (y, en teoría, incluso el código del kernel, sin un cambio de modo).
  • devoluciones en cadena : una técnica que se puede utilizar para combinar varios métodos. Básicamente, prepara la pila para que la instrucción de retorno de la primera función salte a la segunda función, y así sucesivamente.
  • devoluciones parciales : Otra técnica. No tienes que saltar al principio de una función, sino que también puedes saltar en el medio o cerca del final.
  • ret2syscall : un ejemplo práctico de lo que puedes hacer. Básicamente, tiene una instrucción int 0x80 (una llamada al sistema Linux que espera sus argumentos en los registros) y cualquier función que limpia la pila, por ejemplo, pop eax; pop ecx; pop edx; pop ebx; ret; Llena la pila con la dirección de la instrucción pop eax , luego los valores de los registros y luego la dirección del syscall.
respondido por el copy 14.06.2013 - 04:18
fuente

Lea otras preguntas en las etiquetas