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.