martes, 7 de abril de 2009

Solución al reto 1 de Panda (II parte, FPqué!?)

-------------------------------------------------------------------- Solución al reto 1 de Panda (I parte, fracaso absoluto) Solución al reto 1 de Panda (II parte, FPqué!?) Solución al reto 1 de Panda (III parte, las dos comprobaciones) -------------------------------------------------------------------- En la anterior entrada hemos llegado a la conclusión de que las operaciones realizadas para verificar un password introducido no son triviales. Al menos sabemos el formato que debe tener: %d-%f-%f-%c. Y parece que se realizan operaciones con la FPU, algo no muy habitual.

Vamos a ojear que operaciones se hacen a continuación del scanf para intentar encontrar donde verifica si nuestro password es correcto o no.

image

Como vemos, se copian a los registros ecx y eax, los valores %d y %f1 introducidos y se llama a una función. Así que sabemos que posiblemente esa función haga algún tipo de comparaciones con esos dos valores.

Entramos a la función con F7 y observamos horrorizados el paisaje, el desensamblado.

image

Es una función muy larga y usa un montón de operaciones de la FPU. Yo, ciego por las prisas, no se me ocurre otra cosa que pensar que lo mejor sería ponerse manos a la obra y empezar a analizar todo lo que hace la función.

image

Ahí se puede observar como comenté gran parte de las instrucciones, bieeeen. Lo bueno es que aprendí algo sobre el funcionamiento de la FPU, lo malo es que tras analizar algunas instrucciones mas llegué a la conclusión de que eso no estaba haciendo nada con sentido. Reescribía valores obtenidos de anteriores operaciones, realizaba operaciones sin sentido o que provocaban algún tipo de error en la FPU, etc. Estaba perdiendo el tiempo.

Lo peor de todo es que no estaba seguro de si el programa hacia un uso “avanzado” de la FPU y no era capaz de comprender qué operaciones se estaban realizando.

Así que momentáneamente me desesperé y lo di por imposible. Y es en estos momentos en los que uno piensa, recapacita, pero no mucho.

Pensé en que lo mejor sería, como se dice en los primeros tutoriales de cracking, encontrar “el chico bueno” y “el chico malo”. El mensaje que nos diga que hemos superado la protección y el mensaje que nos diga que no lo hemos hecho. El segundo ya lo tenemos es el mensaje “bad!”. ¿Pero y el chico bueno? ¿Qué imprime el programa cuando introducimos un serial válido?, y lo mas importante, ¿cuándo y porqué lo hace?.

Umm, vamos a ver que APIs usa, quizás eso nos aclare un poco las ideas. Botón derecho sobre la zona central “Search for > Name (label) in current module”

image

Como ya sabíamos se usan las funciones printf y scanf. printf se usará para mostrar lo de “Password:”, a continuación se utiliza scanf para recoger lo que escribimos y de nuevo un printf para decirnos si es correcto o no.

Entonces busquemos todos los sitios donde se usa printf, en alguno de ellos se tendrá que imprimir un mensaje parecido a “Conseguido”. Clic derecho sobre printf, “Find references to import”.

image

Hay 3, ya que la última corresponde a la IAT. Pulsamos sobre cada referencia y vemos que parámetros se le pasan a printf en las 3 situaciones.

image

El primero estamos seguros que no es. Los otros dos pues depende de lo que se le valgan los parámetros LOCAL.3 y EAX en su debido momento. Si nos fijamos en el código y buscamos operaciones que modifiquen la variable LOCAL.3 vemos que solo se modifica al principio, asignándole el valor “bad!”.

image

Podemos verificar que en 403030 se encuentra la cadena “bad” y que casualidad, unos bytes mas adelante está la cadena “yes”, ¿será lo que buscamos?

image

Así que sabemos que el segundo printf imprime siempre “bad!”. Seguramente se llegue aquí después de alguna comprobación que determine que nuestro serial es incorrecto. De hecho un par de instrucciones antes del segundo printf hay una comparación apetitosa.

image

Si no se activa el flag zero en las operaciones anteriores al JNZ nos lleva al segundo printf que imprime siempre bad :( Mas adelante tendremos que revisar como evitar esto. pero antes vamos a echar un ojo al último printf.

Al tercer printf se le pasa el registro EAX, donde estará la dirección de lo que imprimirá. Como podemos ver en el código, EAX vale la suma de la dirección de la cadena “bad” + un desplazamiento sacado de LOCAL.4

image Sabemos, porque lo vimos en el anterior, que la variable LOCAL.3 se mantiene siempre con la dirección de la cadena “bad”. Y que si la variable LOCAL.4 vale 0, se imprimirá “bad!”, pero si LOCAL.4 vale 4, se imprimiría “yes!”.

Resumiendo. Sabemos que hay una comprobación que si no se cumple nos llevará al segundo printf, mostrando “bad!”. Y que el tercer printf nos mostrará el mensaje “yes!” si conseguimos que LOCAL.4 valga 4. Ya tenemos mas o menos analizadas las condiciones necesarias para que un serial sea correcto, en la siguiente entrada veremos como conseguir que esto ocurra…

lunes, 6 de abril de 2009

Solución al reto 1 de Panda (I parte, fracaso absoluto)

-------------------------------------------------------------------- Solución al reto 1 de Panda (I parte, fracaso absoluto) Solución al reto 1 de Panda (II parte, FPqué!?) Solución al reto 1 de Panda (III parte, las dos comprobaciones) --------------------------------------------------------------------

El día 1 de este mes, abril, Panda organizó unos retos orientados al estudio de las aplicaciones o ingeniería inversa, vamos, al cracking.

En total eran 3 retos separados en el tiempo, el primero de cada uno se llevaba un jugoso premio, una PSP, un IPOD y un miniportátil.

Yo me enteré de los retos el mismo día que salió el primero gracias a Pedro Laguna. El primer reto aún puede encontrarse en su web. Mirror en google groups

Tras abrirlo vemos una ventana de consola pidiéndonos un password:image

Incorrecto, ya decía yo que no podía tener tanta suerte. Lo abrimos con OllyDbg

image

No se ve nada interesante a primera vista. Lo primero que se me ocurre es buscar las cadenas que usa el programa para localizar la cadena “bad!” que imprime cuando introducimos un password incorrecto y encontrar la cadena que se mostrará cuando el password sea correcto. Botón derecho sobre la zona central, “Search for > All referenced text strings”.

image

Encuentro:

  • “bad!”, la cadena mostrada cuando se introduce el password incorrectamente
  • “Password: ”, lo que imprime printf al comienzo
  • “%d-%f-%f-%c”, parece una típica cadena de formato usada en scanf, tendría sentido ya que espera un entero, guion, dos float separados por guión y un carácter. Algo así 1234-678.45-234,43-T
  • “%s!”, a saber puede ser el formato cadena usado en printf o scanf

Lo raro es que no encontramos ninguna cadena que nos muestre que hemos introducido el password correctamente.

Ahora se me ocurren varias posibilidades.

  • Inspeccionar las instrucciones que hagan uso de la cadena “bad!” , antes de llegar ahí tiene que haber una comparación que nos lleve a la zona buena o a esta mala. Lo malo es que puede ser mucho antes e ir de adelante hacia atrás es mas complicado.
  • Ver donde se usa la cadena de formato típica de scanf y tracear hacía delante viendo que se hace con los valores introducidos hasta llegar a una zona que decida si mostrarnos el mensaje bueno o malo.

Sigamos la segunda ya que el programa no parece muy largo. Botón derecho sobre la posible cadena de formato “Follow in Disassembler”

image

Pues si, va a ser una cadena usada por scanf. Sabemos que los 5 parámetros insertados en la pila antes de llamar a scanf serán:

  1. La dirección de la cadena de formato
  2. La dirección donde se guardará el primer entero, %d
  3. La dirección donde se guardará el primer float, %f1
  4. La dirección donde se guardará el segundo float, %f2
  5. La dirección donde se guardará el carácter %c

Ponemos un breakpoint en el CALL scanf, ejecutamos, tras parar en el breakpoint vemos el estado de la pila, encontramos todos los parámetros pasados al CALL:

image

Podemos poner un breakpoint en cada una de las 4 direcciones para que el programa detenga su ejecución cuando se lean o escriban esos parámetros. De este modo tendríamos una idea de las operaciones que se hace con los números que introducimos para verificar si es un password correcto o no.

Haremos eso, seleccionamos cada dirección del stack, clic derecho, “Follow in dump”.

image

Seleccionamos los 4 primeros bytes que es lo que ocupa un entero, botón derecho “Breakpoint > Hardware, on access > Dword”. Seguimos el mismo procedimiento para los otros 3 valores, teniendo en cuenta que un float también ocupa 4 bytes y un carácter ocupa uno.

Perfecto, ahora recordemos que el programa lo tenemos parado en el breakpoint que pusimos a la instrucción Call scanf. Así que pulsamos F8 para ejecutar scanf.

El programa estará a la espera de que introduzcamos el password por la consola, nosotros introduciremos el valor “1-2.0-3.0-A”.

El programa parará varias veces ya que accede a las zonas de memoria donde guarda los valores recogidos desde la consola y donde pusimos los hardware breakpoint. Pulsamos F9 hasta ver que nos encontramos en la siguiente instrucción del CALL scanf.

Podremos comprobar en el DUMP, que en las direcciones que vimos en la pila se sitúan los valores que hemos introducido por consola.

image

Vemos la ‘A’, 40400000, 40000000 y 00000001. Recordad que se usa Little-Endian. Los dos float, se almacenan en coma flotante de ahí que no se distinga a primera vista el 2.0 y el 3.0.

Seguimos pulsando F9 y vemos que el programa se va deteniendo según usa los valores recogidos desde la consola. Vemos que se detiene a veces en instrucciones muy raras.

image

Buscando con el perrito del ciego de lycos, encontramos que son instrucciones del coprocesador matemático, la FPU, “operaciones para trabajar con números en coma flotante”. Mierda !

Seguimos pulsando F9 y deteniéndonos por los malditos hardware breakpoints. Hasta que el programa finaliza sin habernos dado cuenta de que ha pasado.

Doble mierda, plan fallido ! Mi idea era que durante el progreso hubiese encontrado cómo fácilmente se mueven los valores a los registros habituales y se usan instrucciones comunes para compararlos con algún valor esperado. Pero lo mas cercano que he encontrado han sido un montón de instrucciones raras de la FPU.

Primera aproximación fallida. Tendremos que ir poco a poco viendo lo que hacen instrucciones posteriores al scanf, hasta comprender porque nuestro password no es correcto.

Continuará...

viernes, 27 de marzo de 2009

El mp3 ejecutable

metallica1

Esto de aquí arriba es una bonita canción de Metallica ... o eso parece.

metallica2

Si, tras escucharla he verificado que es una hermosa canción de Metallica. Tan bonita, tan bonita que me apetece verla hexadecimalmente, seguro que sigue los esquemas binarios mas armónicos del mundo !!

metallica3

¿MZ? Eso no era lo de...como era...si, eso del msdos, los ejecutables y tal, no? No se yo...que raro es esto, ¿perooo ... no era una canción?. Voy a renombrar el archivo a exe a ver que me dice windows.

metallica4

Vaya, parece que se ejecuta y me muestra ese cartel. Pero ¿cómo es posible que sea un mp3 y un exe al mismo tiempo?

Por lo que comentan en este enlace, el formato mp3 se compone de varios frames que no están en posiciones fijas. Y que para reproducir un mp3 lo primero que se hace es hallar el primer frame. Así que en teoría antes del primer frame puede haber lo que quiera, incluso un exe. El reproductor de música buscará el primer frame saltándose toda la basura inicial e ignorando el posible ejecutable.

Así que tenemos un archivo que, según la extensión que tenga, windows lo ejecuta correctamente como un ejecutable o lo envía al reproductor por defecto el cual lo interpreta adecuadamente como un mp3 válido.

Umm pero y como lo ejecutará el comando start de cmd, ¿cómo exe o cómo mp3?

metallica5

Como un ejecutable, parece que omite la extensión y se fija en la cabecera del fichero. Interesante....

Si, interesante porque alguien podría hacer acceso directo que ejecutase el comando "cmd.exe /c metallica.mp3" /C Ejecuta el comando especificado en cadena y luego finaliza

metallica6 *Nótese el atractivo titulo del acceso directo

cmd.exe interpretaría el archivo como un fichero ejecutable y ... BOOM.

De aquí podéis descargar el fabuloso disco de Metallica (en realidad es un solo mp3-exe y el malvado acceso directo). El incauto usuario se lo baja y desolado comprueba que no es todo el disco, es una sola canción.

metallica7

Tras escucharla se fija en ese link que dice llevarle a la página donde podrá bajarse el disco completo, pero tras pulsarlo...

metallica8

Windows le muestra un extraño cartel y decide ir a tienda a comprarse el disco original que seguro que acaba antes.

El pobre usuario ha sido contaminado por los virus mas horripilantes de la faz de la tierra y Metallica conquista el corazón de otro fiel seguidor.

*Nota: El ejecutable podría en vez de mostrar un cartel, mostrar la página web a la que aparenta llevar el link y hacer otras atroces acciones. De modo que todo funciona como debería...aparentemente.

Dedicatoria: Esto me lo he encontrado gracias a HacKDarK, en un post en el que se retaba a los usuarios a comprobar si un archivo estaba infectado o no. Pero él no había subido un exe, sino "el mp3xe" :D

miércoles, 25 de marzo de 2009

La botnet de routers

Hace-unos-meses-comentaba como los routers eran perfectos para redireccionar nuestras conexiones y aumentar un poco el anonimato o acceder a servidores con una IP distinta a la nuestra.

Y hoy leo en una-al-dia, un articulo que trata de como una botnet se alimenta de estos cacharros silenciosos que están encendidos las 24 horas y con escasa vigilancia. http://www.hispasec.com/unaaldia/3805/routers-modems-botnets

Estos locos han ido bastante mas lejos y han subido bots compilados para MIPS, la arquitectura de algunos routers, que se conectan a un IRC y reciben malvadas ordenes. Y claro como estos dispositivos suelen estar encendidos las 24 horas del día es el bot perfecto.

Supongo que el malware dependerá mucho del modelo de router que se quiera infectar... Ya no solo de la arquitectura sino del sistema operativo que use, IOS¿?, versión de este... no tengo ni idea.

Vaya infierno, ya uno no se puede fiar ni de su ordenador, ni de su router, ni del teléfono... Pobres personas con escasos conocimientos de informática que quieran solo ver el marca y chatear por internet, están completamente indefensos. Que Dios se apiade de nuestros bytes.

miércoles, 28 de enero de 2009

Nuestros queridos amigos los routers: Atarascado

No paran esos tipos, los Tarasco han publicado una nueva versión del FHSCAN, Fast HTTP Vulnerability scanner v1.1.23.

Esta vez incluye una bonita GUI:
fhscan_gui

Listo para seguir buscando routers con passwords por defecto.

En anteriores episodios comentaba como era posible usar estos routers para redireccionar conexiones y así conseguir anonimato.

La idea es usar NAT. Network Address Translation es lo que usan los routers para poder redirigir conexiones que llegan desde internet al router hacia un ordenador que este conectado a este. Por ejemplo, tienes 2 ordenadores conectados al router y quieres montar en uno de ellos un servidor web, ¿como sabe el router, cuando le llega una petición al puerto 80, a que ordenador de los dos enviársela? Consultando la tabla NAT. La cual se suele configurar a mano.

Y ahí entra en juego una persona maliciosa que va por ahí accediendo a routers indefensos y configurando NAT para que redirija el tráfico que recibe a otra ip pública.

Así es posible que al acceder con el navegador a un router este redirija la conexión a una página web. Quedando registrada en el servidor web de dicha página la dirección IP del router y no la nuestra. Esto se puede hacer con tantos routers encadenados como queramos, viéndose muy poco afectada la velocidad de navegación.

La realidad es que muy pocos routers te dejan hacer esto. La mayoría directamente te pide una ip privada para configurar NAT como es normal, otros te dejan poner la IP que quieras pero después no redireccionan la conexión que les llega desde fuera.

Pero algunos siguen dejando y eso sin entrar en profundidad a configurarlos mediante telnet y sin ni siquiera plantearse el suplantar el firmware por otro modificado maliciosísimamente.

sábado, 24 de enero de 2009

¿Quieres herramientas indetectables? Compílalas!

Por necesidades de la vida me vi en la necesidad de usar cryptcat. Como buen paranoico que desconfía de todo exe descargado de la interné lo subí a VirusTotal, 21 detecciones, nada raro ya que mas o menos todos los detectan como network/hack tool.

Pero ya puestos que mejor que bajarse el código y compilarlo uno mismo, por supuesto leyendo todo el código para verificar que no haga nada malo... (vale, no lo hice).

Ya sabía que usar distintos compiladores confundía mucho a los antivirus, al fin y al cabo todas las firmas que tengan en sus bases de firmas o ya no existen o han sido desplazadas. Pero no me esperaba que ninguno lo detectase. Ya de paso también compilé el netcat...por si algún día "quiero usarlo en un equipo de mi propiedad que tenga antivirus y no tenga la capacidad de añadir exclusiones". Con el mismo resultado 0 AVs lo detectan.

Resultados de VirusTotal: Netcat original 25/39 Netcat compilado con Visual Studio 2008 0/39

Cryptcat original 21/39 Cryptcat compilado con Visual Studio 2008 0/39

Así de fácil. ¿Para que tener norton o panda instalados? ¿Para que me consuma la mitad de la memoría RAM y parte de la CPU intentando encontrar viejos virus? Vale si, está bien como una capa mas de seguridad. Pero ante un ataque dirigido los antivirus no tienen nada que hacer.

martes, 2 de diciembre de 2008

Buen texto sobre análisis de malware

Aquí hay un buen texto sobre análisis de malware. Mas bien es un recorrido por las herramientas que cualquiera podría usar para ver si un archivo hace algo mas de lo que dice :P La mayoría de esto no serviría de mucho si se usa algún crypter con código que detecte si se está ejecutando sobre una máquina virtual y entonces no lanzase sus malvadas funciones. Algún día me gustaría examinar los códigos que se suelen usar para detectar máquinas virtuales, encontrar algún modo de localizarlos y anularlos para poder seguir con el análisis del malware en un entorno seguro. ¿Y porque me ha dado por mirar esto? Porque en un foro donde participo se postea malware y es habitual que alguno postee malware infectado con malware. Y yo me estoy aficionando a pillar a estos pillos :D Que divertido, ¿no?

martes, 18 de noviembre de 2008

Nuestros queridos amigos los routers. La salvación

En anteriores entregas andaba yo quejandome, que si los routers, que si el fscan...pelándome con la versión 0.6, suplicando que alguien me diera la versión 1.0, intentando entender el código...un infierno.

El señor escucho mis ruegos nocturnos y un día después de aquello la web de los hermanos Tarasco¿? volvió a la luz. Con la versión 1.0 beta 5 del fscan.

Grandes cambios, facilidad para usar la libreria HTTP FScan Core en nuestros programas, mas esquemas, mas passwords, mas de todo.

Una maravilla !!

Gracias señor...señor Tarasco.

miércoles, 12 de noviembre de 2008

Nuestros queridos amigos los routers. Reloaded

...En anteriores episodios...
Nuestros queridos amigos los routers.

Muy poco a poco he ido ojeando el código del fscan. Es horrible ver códigos que no los has hecho tú de cero, que no sabes el por qué se hacen las cosas y además tan complicados :S

Al final me tope con lo que empecé buscando, el porqué del fallo que me dió. Resulta que sucede que falla con combinaciones "user" + ":" + "pass" mas largas de 27 carácteres:

void *Escanea(void *thread){
   ...
   char password[28]
   ...

Pues fale, aumento el tamaño del buffer y a correr. Ahora el programa pilla el super password de mi router, lo malo es
que le quité el soporte para openSSL y la salida no sale bien ordenada, estaba pensado para 27 carácteres ...Que kaos xDD

El código está muy bien, me gustaría rescribirlo para comprenderlo y poderlo adaptarlo facilmente a otros programas. Quizás algún día me de por automatizar la búsqueda y el redireccionamiento de puertos de estos cacharros...

Pero antes de ponerse a hacer un trabajo tan duro, porque no usar la versión 1.0 de este programa.
¿Que !!? ¿Pero existe la versión 1.0 y nosotros haciendo el tonto con la 0.6?
Pues si y no. Existe la 1.0, juro que un día la use y todo, pero ahora no encuentro la herramienta por ningún lado y en su página no puede descargarse :(  Es mas, la caché de google me dá la razón:

2008, March: Fscan HTTP Proxy developed. Improved Fscan core API
2008, February: Fscan v1.0 project and Fscan HTTP Core API published

¿Donde está tarasco? ¿Ya le abdujo una mujer? Vuelve !!!

Lo que si está todavía en su página es el "Fscan HTTP Core API":
http://www.tarasco.org/Web/fscan/index.html

Fscan core
This library is our HTTP/1.1 implementation for developing HTTP security software under win32/linux. Supports multithreading, SSL and native digest/NTLM/basic authentication.

Esto ya es otra cosa, otra cosa que da mucho mas miedo que la anterior :S

Ahora tendré que meditar que hacer: seguir con la 0.6, programarme la mía que funcionará peor pero comprenderé o seguir buscando la 1.0.

¿Y todo esto para que? Pues para el final usar varios routers para hacer saltos de uno a otro y al final acceder a una ip de forma "anónima".

martes, 11 de noviembre de 2008

Como casi soluciono el reto 6 de S21Sec

Estaba un día revisando blogs y tal cuando me tope que justo acababan de publicar el reto 6 en el blog de S21sec.

Para empezar en el texto del reto no estaba el reto...ya estamos. Lo primero fue ver el código fuente, "seguro que hay alguna pista" y efectivamente, allí hay una frase muy rara:

<!-- Hola, sí, el reto está aquí: Venga, 3,1,2, a ello!!!!: +>>+++++++++++++++++++++++++++++++++[+++< .....

Eso me sonaba a un lenguaje de programación que había visto en alguna parte, buscando por "lenguajes de programación raros" encontré que se llamaba brainfuck y en la wikipedia había un enlace a un compilador/debugger, perfecto.

Seguro que es compilar y listo....NO. Eso no funcionaba, se quedaba pillado :( Así que toco entender un poco brainfuck y ver como había muchísimos bucles sin sentido, cabrones ¿y ahora que?  Ganas de matar en aumento.

Un descanso, una ducha y recuerdo eso de "venga 3, 1, 2 a ello", eso era muy raro. ¿Se conmutarán cada 3 instrucciones?

Eran 18.087 instrucciones, umm justo divisible por 3. Así que fui al final y miré las últimas 3. .]< habrá que ordenarlas de modo que hagan algo con sentido, y lo mas lógico es que el programa acabe imprimiendo una letra con el ., así que lo normal es que acabara así: <].

Realice esa conmutación sobre todos los grupos de 3 instrucciones. Ejecute el programa y devolvió una horrenda salida:

Huk pawf, qv tq ohjgpdmmg sd xaiax rwd bmzga. Dsjs wntm hwjuwma rokw vwwee rwkusmgmflw wd nisiawflz fuqzwjg, yex emw qs yiedgfwk ga ocfljsnezws vw vzsowxjsvj. hmqzwlwoebshmfljpgblgtsmrmpsjjsrwidmflgnvqwflamioesuhmfooocetsjmapskusjbaepsjjsmefckwakbuucftsbjggwgftseorokwljzsbiflgrdp Niwfs kpedhw

Ganas de matar ++
Lo ojee un poco traté de aplicar cesar y nada. Además esas líneas intermedias sin espacios entre los caracteres daban bastante miedo.

Tras estar a punto de mandarlo a tomar vientos, me fijo en que seguro que lo último que dice es "Buena suerte"´. Y que si así fuera coincide que el 3 y el 11 carácter que corresponden a la letra w serian la e de Buena suerte. Umm además a una distancia de 8 caracteres, ¿será la clave de longitud 8?

Tras sacar los desplazamientos y pasarlo a caracteres se me queda la clave FAOMIIII y el texto se descifra, bieeeeen.

Muy bien, ya te aproximas al final del juego. Para esta tercera fase debes des- cargarte el siguiente fichero, del que ya dispones la contrasenia de descifrado. hachetetepepuntopuntobarrabarrawwwpuntosveintiunosecpuntocombarradescargasbarra- retoseisguionbajoguionbajofasetrespuntozip Buena suerte.

A descargar el fichero zip, voy a descomprimirle, pongo la clave de descifrado de antes y ZAS password incorrecto. Ganas de matar aumentando mas y mas.

Tras repostar un rato y pensarlo mas detalladamente recordé que vigenere lo había aplicado al revés. Ya que en la aplicación web que use puse el texto cifrado como plano y la clave FAOMIIII, pero debería haberlo hecho al revés!! Y efectivamente la clave real era VAMOSSSS. Fichero descomprimido.

Pero el juego sigue mas y mas, no se cansan!! Abro el fichero y la cabecera dice que es un GIF, pero no lo reconoce ningún programa. Leo un poco el RFC y veo que la longitud es absurda, 10 de alto por ~10000 de ancho. Cree un gif de ese tamaño para comparar la estructura y nada tenia sentido, el gif mío ocupaba muchísimo menos. Hay un hola y adios desconcertantes. Mikel da unas pistas de lo mas extrañas de vivaldi, mozart, bach. Nada tiene sentido.

Las ganas de matar llegan a su limite y abandono hasta nueva idea feliz que nunca llegó.

 

Hace unos días han publicado la solución en ella, Dani Kachakill y Dreyer & Uri han puesto el solucionarío del reto completo siguiendo unos procedimientos muy correctos y bien explicados.

Lo que me falto fue identificar que ese último fichero no era un GIF sino un archivo WAV :S Nunca lo habría logrado.

Muerte a los retos.