30 octubre 2012

Reversing malware tales: Persiguiendo a GetProcAddress()

En la anterior entrada de la saga hablábamos de la función GetProcAddress() y como permite enmascarar llamadas a funciones 'comprometedoras' de forma que, ante un análisis estático, parte de la funcionalidad mas comprometedora quede enmascarada por esa función al usarla como 'proxy'.

Hoy, vamos a ver como lidiar cuando nos encontramos con un ejecutable que, curiosamente, hace uso de esa función en varios puntos.

Partiendo del post anterior, habíamos dejado dos ejecutables 'prueba.exe' y 'pruebaget.exe' con la misma funcionalidad (descargar y ejecutar un fichero) pero con la salvedad de que uno lo hacía directamente y otro a través de GetProcAddress()

Veamos a Olly analizando ambos binarios (click para ver mas grande):

Prueba.exe (usa directamente las funciones)

PruebaGet.exe (usa las funciones a través de GetProcAddress()
Si jugamos al juego de las diferencias, podemos ver que el binario que no emplea GetProcAddress() anuncia que usa URLDownloadToFile() y WinExec(). En el segundo binario esas funciones ya no aparecen anunciadas y sin embargo sabemos que hace uso de ellas.

En este escenario, con el binario prueba.exe podríamos simplemente poner unos breakpoints en las funciones sospechosas y esperar a ver de que forma son empleadas. En el segundo binario no es tan fácil.

Lo primero que vamos a hacer es poner un breakpoint en la función GetProcAddress():

Buscamos la lista de funciones del binario


Ponemos el BP en GetProcAddress()
Una vez hecho esto, tan solo tenemos que pulsar F9 y esperar a que pare en algún punto sospechoso


Sorpresa ! Ya tenemos el primer punto sospechoso, vemos que GetProcAddress() está siendo llamado para obtener la dirección de memoria de URLDownloadToFile() función altamente sospechosa.

En este punto debemos pulsar F8 para que GetProcAddress() termine y nos enseñe en que dirección de memoria está URLDownloadToFile()

Si miramos en la ventana de los registros:



Vemos que en EAX se encuentra la dirección de memoria de la función que está enmascarando GetProcAddress().

En este punto podemos poner directamente un breakpoint en esa dirección y esperar, es muy recomendable tener cargado el plugin para Olly CommandBar para poder poner BPs sin mucha complicación



En mi caso pongo el BP en 444C4868 porque es la dirección que ha devuelto GetProcAddress()

Si volvemos a pulsar F9, vemos que se para justo en esa dirección y si miramos atentamente la ventana del stack:



Encontramos los parámetros de URLDownloadToFile().

Podemos repetir este método tantas veces como sea necesario para seguir la pista a GetProcAddress()

Si queréis descargar los binarios lo podéis hacer desde aquí. Recordad que el código fuente de ambos está en el anterior post

Nota: Algunos antivirus saltan con esos ejecutables.

5 comments :

Angel Alvarez Nuñez dijo...

como agua de Mayo esperaba yo este post, muy bueno, que el siguiente no se haga esperar tanto, y muchas gracias Yago XD

Yago Jesus dijo...

¡¡¡ Muchas gracias !! Se que son posts duros de leer :/

Arduino dijo...

Gracias Yago Jesus por compartir este tute... Normalmente los principiantes son mas egoistas y no suelen escribir sobre lo que van aprendiendo... No desesperes con tu aprendizaje y animo... El camino es largo pero si te esfuerzas llegaras al zen... Un abrazo y buena suerte!

Angel Alvarez Nuñez dijo...

Imagino que va en gustos, para mi si que es duro de leer porque me faltan muchas piezas del rompecabezas, con cada artículo de este tipo voy aprendiendo y poniendo pieza, tambien te digo que si escribes un libro de Ingenieria inversa aqui esta tu primer lector/comprador, muchas gracias por compartir conocimiento amigo, un abrazo XD

JohnnyCanel dijo...

No sé si ha sido por error pero parece que mi anterior comentario se ha borrado, espero que no te hubiera molestado Yago Jesús puesto que nadie nace sabiendo y siempre hay un comienzo para todo. No desesperes en tu aprendizaje, el camino es largo y duro, pero todos te apoyamos. Confío en que tu esfuerzo dará sus frutos, no desistas, algún día llegarás a ser el gran Caballero Jedi del malware.

P.D. ¿Yago y Jesús sois dos personas distintas o es como Ramón y Cajal?

Un abrazo,
Johnny Canel.