c assembly stack buffer-overflow nop

¿Cómo funciona un trineo NOP?



assembly stack (2)

Algunos ataques consisten en hacer que el programa salte a una dirección específica y continúe ejecutándose desde allí. El código inyectado debe cargarse previamente de alguna manera en esa ubicación exacta.

La aleatorización de pila y otras diferencias de tiempo de ejecución pueden hacer que la dirección donde el programa saltará sea imposible de predecir, por lo que el atacante coloca un trineo NOP en un gran rango de memoria. Si el programa salta a cualquier lugar dentro del trineo, ejecutará todos los NOP restantes, sin hacer nada, y luego ejecutará el código de carga, justo al lado del trineo.

La razón por la que el atacante usa el trineo NOP es para agrandar la dirección del objetivo: el código puede saltar a cualquier parte del trineo, en lugar de exactamente al comienzo del código inyectado.

Un trineo NOP de 128 bytes es solo un grupo de instrucciones NOP de 128 bytes de ancho.

NOTA n. ° 1: NOP (No-OPeration) es una instrucción disponible en la mayoría de las arquitecturas (¿todas?) Que no hace nada, aparte de ocupar memoria y algo de tiempo de ejecución.

NOTA n. ° 2: en arquitecturas con instrucciones de longitud variable, una instrucción NOP suele tener solo un byte de longitud, por lo que se puede utilizar como un relleno de instrucciones conveniente. Desafortunadamente, eso también hace que sea más fácil hacer un trineo NOP.

No puedo encontrar una buena fuente que responda esta pregunta. Sé que un trineo nop es una técnica utilizada para eludir la distribución aleatoria de la pila en un ataque de desbordamiento del búfer, pero no entiendo cómo funciona.

¿Qué es un ejemplo simple que ilustra este método?

¿Qué significan términos como trineo de 128 bytes?


Para agregar a la explicación de rodrigo: incluso con un sled NOP, la ubicación aproximada del búfer en la memoria debe predecirse de antemano. Una técnica para aproximar la ubicación de la memoria es usar la ubicación de la pila cercana como marco de referencia. Al restar un desplazamiento de esta ubicación, se puede obtener la dirección relativa de cualquier variable.

NOTA LATERAL: en la arquitectura x86, la instrucción NOP es equivalente al byte hexadecimal 0x90, por lo tanto, un búfer explotado completo podría verse más o menos así:

| Trineo NOP | Shellcode | Dirección de devolución repetida |

Al ver como si el registro EIP apunta a cualquier dirección encontrada en el trineo NOP, se incrementaría mientras se ejecuta cada instrucción NOP, una a la vez, hasta que finalmente llegue al código de shell