Código Interpretado bajo Windows.

Iniciado por Fraile, Noviembre 23, 2021, 06:21:08 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

No todos los lenguajes de programación, una vez compilados, el binario o "EXE", se traducen directamente a "código maquina", si no que su programa o binario "EXE", depende de un "interprete" incorporado que pasa su "EXE" a código maquina.

Para los profesionales que se dedican a la ingeniería inversa, esto puede suponer tener  que aprender a trabajar con diferentes herramientas, depuradores o desensambladores.

Me gustaría hablar en este artículo de Microsoft Visual Studio, esta gran plataforma de programación, en la cual se puede programar en diferentes lenguajes como C#, Visual Basic, C++... realmente una vez compilados sus proyectos o soluciones, se traducen a un código intermedio.

Microsoft Intermediate Languaje.

O como realmente se le conoce "MSIL".

Lenguaje Intermedio de Microsoft. Código «semi ejecutable» preparado para ser lanzado posteriormente en cualquier tipo de máquina.

Cuando se compila el código escrito, el compilador lo traduce a un código intermedio denominado MSIL o simplemente IL, correspondiente a un lenguaje independiente de la unidad central de proceso (UCP).

Este código intermedio es pasado a la CPU, por el CLR "Common Languaje Runtime", en tiempo de ejecución.


Estos tipos de binarios, le van a costar un poco mas de analizar, o tendrá que usar algunas herramientas que están en el mercado que le facilitaran mucho el trabajo. Yo le voy a realizar una introducción de cómo analizarlos con OllyDBG, pero no entrare en muchos matices pues no es la finalidad de este artículo.

Para seguir este artículo por favor solicíteme la POC "BinarioIntermedioVB.exe". Lo abrimos con OllyDBG.

Lo primero que va hacer es ejecutar el programa para ver que hace. Verá que el programa es muy simple, solo pide un texto y una validación con el botón "Clave", si el texto que mete es "Cayetano", saldrá un msgbox mostrando "Ok".

Como le he comentado un poco más arriba este tipo de binarios, lleva lo que se denomina un código intermedio, vamos el "EXE", no lleva un código nativo puro, lleva en este caso el código MSIL de Microsoft. En el mercado tiene aplicaciones como Net Reflector, que le permitirán interpretar el código MSIL.

Bien pues vamos a ejecutar el binario abierto anteriormente "BinarioIntermedioVB", y Ejecútelo con "F9". Lo primero que quiero que observe, es el mapa de memoria una vez ejecutado el binario:


Fíjese que debería de ver en la parte de arribar el nombre de su binario con sus cabeceras y secciones:


Y un poco más abajo vera DLL que usara su binario como:


Solo al ver "CLR", ya sabe que este binario es de código intermedio, que pertenece a Microsoft.

Le explico primero que es lo que se va a encontrar en su primer bloque "BinarioIntermedioVb.exe", vera que tiene su cabecera como cualquier otro binario, sus secciones, .text, .data...... Bien, entre en la sección de .text. Directamente se le abrirá el "Dump" y estará viendo el ya mencionado código intermedio "MSIL", conforme usted vaya ejecutando el programa, Windows le ira pasando este código intermedio MSIL, al CLR y el CLR a su vez lo pasara a "CLRJIT". Este último será el encargado de convertir el código intermedio en código nativo y pasárselo a la CPU.

Como se puede imaginar depurar este tipo de binarios puede ser un poco más complejo.

Si va bajando por el "Dump", viendo el código "MSIL", la inmensa mayoría del código, son configuraciones del formulario, colores, etiquetas, propiedades........ Si se fija con atención verá algo como esto:


Bien, pues esto es, en perfecto código "MSIL" básicamente el núcleo de su pequeño programa. En definitiva está cogiendo el contenido de la caja de texto, y lo está comparando con una variable global, que esta inicializada a "Cayetano", si en la caja de texto también pone "Cayetano. Lo comparara y si las dos cadenas son iguales mostrara "OK".

Mi objetivo ahora mismo es enseñarle a tratar este código una vez que el "CLRJIT", lo tiene pasado a nativo, para que antes de ser procesado lo podamos interceptar y hacer cosas con él.

Como le he comentado al principio esta aplicación es muy sencilla:

Verá que el programa es muy simple, solo pide un texto y una validación con el botón "Clave", si el texto que mete es "Cayetano", saldrá un msgbox mostrando "Ok".

Pues bien, quiero que teclee en la caja de texto "Cayetano", y seguidamente le dé al botón "Clave", vera que le aparece una ventana de "MessageBox", que le dice "ok". Seguidamente pause la ejecución de OllyDBG con,   


tiene que hacerlo muy, muy rápido. Y seguidamente pulse


Si todo ha ido bien, tiene que estar viendo una pantalla como esta:


Desde esta pantalla podemos ver todo lo que está en la pila, y la funciones o API, que se están ejecutando en el momento de pausar la aplicación.

Usted se va a fijar en:


Como se estará figurando ese "MessageBoxW", le va a llevar a las tripas del entramado de este binario..... Si da dos clic rápidos sobre él, "user32.MessageBoxW", Debería estar viendo esta pantalla.


Esta es la api, de la librería USER32.dll , "MessageBoxw", va a poner un punto de ruptura justo en el RETN 10, de esta forma podremos volver una vez pulsado el botón de aceptar del "OK", al procedimiento que llamo a esta API o función.

Una vez puesto el punto de ruptura, le volvemos a dar al botón de nuestra aplicación "Clave". Debería haber saltado a su punto de interrupción, ahora va a pulsar la tecla F8.


Fíjese que la línea que debería de ejecutar ahora el OllyDBG, en caso de volver a pulsar la tecla F8, seria:


Con lo cual quiere decir que la línea superior a esta, fue la que llamo a la API, "MessageBox".


Bien Mire ahora a su sección de registros y observe lo siguiente:


Aparece el titulo del la ventana y el contenido "ok". Bien, pues va a buscar el "ok", en la memoria para que OllyDBG, se lo pueda mostrar en el "Dump".


De un clic sobre el registro EDI, y seguidamente botón derecho del ratón, y de clic sobre "Follow in Dump". Ahora fíjese en la sección del "Dump".


Debería de estar viendo el "o k", baje un poco el desplazamiento del "Dump", debería de estar viendo ahora:


Ve ¿"Cayetano"?, bueno pues ahí va a poner un punto de ruptura de tipo memoria, quedaría de la siguiente forma:


Subraye en el "Dump" , la palabra "Cayetano" y de clic al botón derecho del ratón, se posiciona sobre BreakPoint, y da clic sobre Memory.


Pulse sobre ella, el botón de "OK".

Ahora en el Dump, debería de estar viendo en color rojo marcado los bytes de "Cayetano".


Pulse "F9", posiblemente si hay algún punto de ruptura mas, tendrá que volver a pulsar "F9", el caso es que una vez que tenga de nuevo la aplicación en memoria y pulse el botón "Claves", OllyDBG", le abra llevado casi al núcleo que vio anteriormente en MSIL, pero ya en código nativo.

Le propongo un reto, ¿sería capaza de terminar este ejercicio?, el reto seria una vez localizado el núcleo del proceso en nativo con OllyDBG, cambiar el código, para que independientemente de lo que ponga en la clave salga el mensaje de "OK".

Puede solicitarme el "exe" en el email: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta. Envié la solución mediante capturas de pantalla y gane un 25% de descuento sobre nuestro curso de reversing o lenguaje ensamblador, donde aprenderá esto y mucho mas. Para este reto necesita el OllyDBG v 2.01.

Independientemente del reto, si tiene cualquier consulta, puede ponerse en contacto con nosotros en el email mencionado en el párrafo anterior.

No deje de ver No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Le quiero dedicar este artículo a mi amigo y compañero de retos en "Atenea", Raúl Rivero, con el que he aprendido muchísimo.

Espero que le haya gustado o parecido por lo menos interesante este artículo.



Un cordial saludo,

Cayetano De Juan