CTF #nullcon 2012: Ingeniería inversa 1

nullcon1.jpg

Esta prueba consistía pues en lo típico, nos dan un binario y busca el flag. :/

Voy a intentar explicar lo que hice, pero como no estoy seguro si se va a entender muy bien, ya verás porque lo digo, también he grabado un pequeño vídeo de demostración.

El binario que nos dan después de ejecutar el prólogo (file y strings :) ), vemos que es un binario de Windows. Cuando lo ejecutamos, vemos que abre al menú de inicio, run (ejecutar) y escribe: wmplayer.exe y lo ejecuta, es decir, que también manda la tecla intro (enter).

Para esta prueba usé Immunity Debugger. Lo primero que nos damos cuenta es que el ejecutable está empaquetado con UPX, aunque si lo ejecutamos desde el debugger, el programa reacciona de la misma manera, con lo que en principio no tiene ninguna protección anti-debugger.

Viendo que lo que el binario hace es mandar eventos de teclado, lo primero que hice es poner un breakpoint en la llamada SendInput (user32). El problema es que no veía que tecla estaba siendo enviada, pero después de depurar un poco vi que era MapVirtualKey (concretamente la versión ANSI, MapVirtualKeyA) la que creaba la tecla virtual y uno de sus parámetros es el código ASCII de la tecla que queremos enviar.

Así que una vez puesto el breakpoint en MapVirtualKey e ir resumiendo me aparecía en la pantalla:

Selection_004.png

Cerraba dicha ventana, pulsaba F9 (continuar) y me aparecía de nuevo, pero con una letra distinta. Después del susto y de pensar un poco, el binario está mandando eventos de teclado, y estos van a la ventana/control que tenga el foco en ese momento. En Immunity Debugger, cuando estás en la ventana principal (primer cuadrante donde están las instrucciones que se ejecutan) y pulsas una tecla se abre la ventana Assemble At … con la tecla que has pulsado.

Después de ir resumiendo la ejecución, todo tenía sentido, la ventana se abría con la tecla w, m, p, l, a, y, e, r, ., e, x, e, intro, w, e, (espacio), c, o, u, … WAIT! O sea que abre el wmplayer.exe, pero luego sigue mandando teclas, ¡uy! esto tiene buena pinta.

De repente se me iluminó la bombilla y me dije, ¿y por qué no nos aprovechamos de la carámbola de la ventanita Assemble At? :D

Así que lo que hice fue, poner el breakpoint en la MapVirtualKeyA. Situándonos en el cuarto cuadrante de la ventana principal, para evitar la ventana de Assemble At, pulsamos F9, hasta que llegamos cuando se va a mandar el intro, código 0D. Modificamos dicho evento y para que mande un x20 (espacio en blanco), pero antes de pulsar F9, borramos el breakpoint que teníamos en MapVirtualKeyA, nos situamos en el primer cuadrante de la ventana (este paso es muy importante), para que cuando resumamos la ejecución, el primer carácter que se manda será el espacio en blanco y a continuación el resto del texto, que como no tenemos el breakpoint, la aplicación va a escupir el flag en la ventana de Assmble At.

Como todo esto es muy oscuro y rocambolesco, decidí grabar un screencast para que se vea más claro.

Por lo tanto nuestro flag: We could talk all day about what AutoHotKey can do for an online poker player