scripts de ataque de desbordamiento de búfer

8

Vi varios scripts diferentes para un ataque de desbordamiento de búfer. Muchos de los scripts incluyen líneas que se parecen a esto:

char code[] =
"\xdb\xd7\xd9\x74\x24\xf4\xb8\x79\xc4\x64\xb7\x33\xc9\xb1\x38"
"\x5d\x83\xc5\x04\x31\x45\x13\x03\x3c\xd7\x86\x42\x42\x3f\xcf"

Este es de la CastRipper [.m3u] 2.9.6 stack overflow overflow exploit . ¿Alguien puede explicar qué es este bit? ¿Y qué está haciendo exactamente?

Se parece a los archivos de cabecera de Linux que he visto en herramientas forenses.

    
pregunta BubbleMonster 03.08.2013 - 07:11
fuente

2 respuestas

8

En realidad es código de byte .

  

Bytecode, también conocido como p-code (código portátil), es una forma de   Conjunto de instrucciones diseñado para la ejecución eficiente por un software.   Interprete. A diferencia del código fuente legible por humanos, los códigos de bytes son compactos   Códigos numéricos, constantes y referencias (normalmente direcciones numéricas)   que codifican el resultado del análisis y análisis semántico de las cosas.   Tipo, alcance y profundidad de anidamiento de los objetos del programa. Ellos   por lo tanto, permiten un rendimiento mucho mejor que la interpretación directa de   código fuente.

Es un programa compilado que está hecho de instrucciones que la CPU entiende directamente. A menudo se utiliza para explotar vulnerabilidades al hacer que el programa en ejecución vulnerable ejecute este programa desbordando su búfer y haciendo que la dirección de retorno sea la primera instrucción del programa de código de bytes. A menudo intentas generar un shell interactivo, en este caso se llama shellcode .

  

En seguridad informática, un código de shell es una pequeña pieza de código utilizada como   Carga útil en la explotación de una vulnerabilidad de software. Se llama   "shellcode" porque normalmente inicia un comando shell desde el cual el   el atacante puede controlar la máquina comprometida, pero cualquier pieza de código   que realiza una tarea similar puede llamarse shellcode. Porque el   La función de una carga útil no se limita simplemente a generar una cáscara, algunos   han sugerido que el nombre de shellcode es insuficiente. 1 Sin embargo,   Los intentos de reemplazar el término no han ganado amplia aceptación.   Shellcode se escribe comúnmente en código de máquina.

Hay un buen libro sobre el tema llamado Manual de Shellcoder.

    
respondido por el Lucas Kauffman 03.08.2013 - 08:29
fuente
7

Background:

Lo que estás viendo es un código de lenguaje de máquina. Son los valores de datos que son instrucciones reales para un chip de CPU.

Cuando un programador escribe un programa en un lenguaje de nivel superior como C o C ++, las herramientas llamadas compiladores toman esas instrucciones y las convierten en el lenguaje de máquina. Normalmente, a los programadores no les importan esas instrucciones en lenguaje de máquina. Pero los programadores que escriben esos compiladores se preocupan mucho por las instrucciones de la máquina, por supuesto, y también a las personas que están escribiendo una versión optimizada de una rutina (algo que podría ser ineficiente en un lenguaje de alto nivel). Y también a los piratas informáticos.

Incluso cuando los programadores tienen una razón para preocuparse por las instrucciones de la máquina, no escriben su código en valores de byte en bruto difíciles de leer como este. En su lugar, los programadores utilizarán un conjunto de instrucciones mnemotécnicas llamado lenguaje ensamblador. Los mnemónicos son solo nombres abreviados que representan los números que se ven aquí. Un ejemplo simple es MOV CL,0x38 que mueve el valor del byte 38 a la mitad inferior del registro llamado C. Debajo de las cubiertas, "MOV CL" es un byte de lenguaje de máquina con el valor de b1.

Una herramienta llamada desensamblador ayudará a traducir de los dígitos que ve al lenguaje ensamblador que los humanos pueden leer más fácilmente. Puede poner estos bytes en enlace y ver las instrucciones que harán que se ejecute la CPU. Su muestra contenía estas instrucciones:

.data:0x00000006    b879c464b7  mov eax,0xb764c479
.data:0x0000000b    33c9        xor ecx,ecx
.data:0x0000000d    b138        mov cl,0x38
.data:0x0000000f    5d          pop ebp
.data:0x00000010    83c504      add ebp,0x4
.data:0x00000013    314513      xor DWORD PTR [ebp+0x13],eax
.data:0x00000016    033cd7      add edi,DWORD PTR [edi+edx*8]
.data:0x00000019    864242      xchg BYTE PTR [edx+0x42],al
.data:0x0000001c    3f          aas
.data:0x0000001d    cf          iret

(Puedes ver las instrucciones de ensamblador mnemónico arriba incluidas mov, xor, pop, etc.)

Sin embargo, prepárate para más decepciones. Has seleccionado un ataque muy sofisticado que utiliza una técnica llamada Programación Orientada al Retorno (ROP), por lo que la mayoría de los bytes no tienen sentido para nosotros porque no son instrucciones de la CPU. En su mayoría son datos que contienen parámetros y direcciones de otras rutinas. Eso hace que este exploit sea particularmente difícil de aplicar ingeniería inversa sin mucho trabajo.

Más cerca de tu respuesta:

Más a su pregunta, un desbordamiento de búfer funciona debido a la forma en que se usa la memoria en la arquitectura x86. Cuando un programador permite que la memoria se sobrescriba, los datos adicionales pasan por encima de otra cosa. Si escribe el número correcto de bytes, esa otra cosa es el puntero de retorno de la función. Si proporciona una rutina de lenguaje de máquina en los datos del búfer, sobrescriba el puntero de retorno para regresar a su búfer (en lugar de su ubicación de retorno normal), cuando la CPU regrese ejecutará su código en lugar del código que estaba destinado a ejecutar.

El código de máquina que engaña al puntero de instrucción para ir a donde el pirata informático lo necesita para ir se conoce como código de explotación. El código de explotación está escrito de forma personalizada para aprovechar cada error específico.

El código que hace algo útil para el pirata informático se llama la carga útil. Las cargas de pago generalmente son pre-pensadas por otra persona, y son a menudo un asunto de copiar y pegar al hacker. Una carga útil muy común se llama "shellcode", que es una instrucción de máquina que proporciona un shell de comando al atacante.

Un exploit necesita ambos. Una vez que el exploit tiene el control, invoca el shellcode, lo que le da al hacker el acceso que desea.

Un buen recurso:

Hay un tutorial en línea bien documentado de este tipo de explotación aquí: enlace Tenga en cuenta que esto es Cosas bastante profundas, y el autor de esa página está asumiendo que usted comprende los fundamentos de la operación de la CPU, las pilas, los punteros, los lenguajes ensambladores, los lenguajes de máquina, etc.

    
respondido por el John Deters 05.08.2013 - 08:57
fuente

Lea otras preguntas en las etiquetas