Querido Ndugu,

Ahora que ya quedan apenas unos minutos para que se termine el reto, te voy a contar hasta dónde hemos llegado los teclarios en el reto lanzado en la página web http://canyoucrackit.co.uk/. Cuando leas esto no sé que aparecerá en la página, pero ahora mismo lo que yo veo es esto:

Captura de http://canyoucrackit.co.uk al final del 12/12/2011

con el “time remaining” bajando a un segundo por segundo.

La página me la descubrieron unos alumnos hace algo más de una semana un día de laboratorio en el que ni ellos ni yo teníamos muchas ganas de dedicar tiempo a la práctica de Java que supuestamente tenían que hacer (y yo explicar)…

Así que me puse manos a la obra. Ellos (aspirantes a informáticos, pero también a matemáticos) al ver números ya estaban hablando de hacer un análisis de las apariciones, probabilidades y demás historias. Yo, teclario informático de pro (con afición en las matemáticas, pero nada más) al ver la secuencia de números pensé “estos números son algo en little-endian y tiene la pinta de código máquina”. Así que estuvimos trasteando un rato en el laboratorio; el tiempo dió para poco (además, había que compaginarlo con resolver las dudas a otros alumnos…), pero luego seguí dandole vueltas al asunto. Por motivos que no vienen al caso el año pasado volví a ponerme el gorro de programador de bajo nivel y estuve trasteando con la ingeniería inversa a partir de código máquina, así que dispongo de una licencia del mejor desensamblador que conozco: el IDA Pro.

Con el desensamblador pude entender la mayor parte del código. En realidad no es algo demasiado enrevesado que intente luchar contra la ingeniería inversa: un par de saltos y nop por el medio y un pop esp poco habitual que hace que la rutina no pueda volver. También salta a la vista que la rutina está pensada para ser ejecutada en Linux, porque termina con un int 80h. De todas formas, el resto del código es independiente de Linux o Windows, así que Visual Studio en mano, me puse a ejecutar el código (cargándolo en un Heap creado con derecho de ejecución…), una vez que había comprobado con el IDA que aquello era seguro ;)

Las conclusiones fueron… desconcertantes. El código NO estaba completo. Claramente era una rutina que desencriptaba un mensaje que NO estaba. La rutina esperaba que justo después del último byte publicado:

  • Aparecieran cuatro bytes 0x42 0x42 0x42 0x42.
  • Después cuatro bytes con el tamaño del mensaje a desencriptar.
  • Por último, el mensaje cifrado.

La rutina deja el resultado final… como “variable local” en la pila (tras una tabla de descifrado que construye durante la ejecución).

En fin, Ndugu, una pequeña decepción. ¡Después de la intriga me quedaba sin saberlo! Asumí que el texto “The challenge continues” que aparece en la página significaba que cuando terminara la cuenta atrás aparecería el mensaje cifrado… y me olvidé….

… hasta unas pocas horas después, cuando me di cuenta de que si no daban todos los datos… ¿por qué podías meter la contraseña? Mi mente ya no daba más de sí, así que pedí ayuda a Google, y lo que ví me hizo pensar en la famosa canción del “ey, Manolete, si no sabes torear p’a qué te metes”. Resulta que la página… es de los servicios de inteligencia británicos que la han puesto para buscar futuros trabajadores, a modo de prueba. Un artículo en The Telegraph da los detalles.

Querido Ndugu, eso ya se me viene grande. Yo no tengo pretensiones de ser espía, ni cualidades para lograrlo. De haber sabido al principio de qué iba la historia no habría intentado descrifrar ni siquiera el primer paso para el que mi intelecto sí tenía alcance. Ahora ya sé (por las pistas que da el artículo de The Telegraph) que el mensaje a descifrar está escondido entre los metadatos del PNG que contiene el código. Y lo confirmo, está ahí. Pero su descifrado luego te lleva a una segunda fase, y luego a una tercera hasta dar con la clave. Pero yo me planto antes. Me lo pasé bien haciendo la ingeniería inversa, pero no me ví con fuerzas de mucho más.

Yo no quiero ser espía.

P.D.: Tic, tac, tic, tac, … ya sólo quedan 54 minutos…

Desde que yo recuerdo, se no has intentado vender la obra de Don Miguel de Cervantes Saavedra: El Ingenioso Hidalgo Don Quixote de la Mancha (sí, así con X), como un libro que hay que leer con seriedad y solemnidad. Si no me cree ud. estimado lector, puede ver las caras y las voces de las personas que participan en la “lectura continuada de El Quixote” (http://www.youtube.com/watch?v=25UymDjBcWE). Continúa leyendo »

Antes de empezar mis comentarios sobre la “Paradoja divina” de Antonio Vaquero [Vaquero, 2009] , es menester que establezca las premisas en las que están basados:

  1. Lo que usted crea, estimado lector, sobre la divinidad de su predilección (e.g., Elvis, Maradona, Alá, Buda, Ganesha, el monstruo volador de espagueti, etc.) se sale fuera  del ámbito de estos comentarios. No estoy aquí para probar su existencia ni mucho menos para razonar sobre ellas. Mi objetivo general es mostrar que cuando se usa la razón y una de sus herramientas (e.g., la lógica matemática) muchas de las premisas o enunciados sobre estas entidades (sino es que todas) son falsas, verdaderas y falsas al mismo tiempo o paradójicas.
  2. Continúa leyendo »

Diario de Rorschach, 20 de Julio de 2009:

Me cuentan que en el panorama de las descargas directas hay tres actores principales: MegaUpload, GigaSize y RapidShare. Todos proporcionan un uso gratuito (y limitado) y otro de pago (y sin restricciones). Aunque varía con la localización geográfica, normalmente sólo permiten una descarga simultánea, y algunos tiempos de espera entre descargas. Por ejemplo, los dos primeros te fuerzan a esperar cosa de un minuto antes de poder comenzar la descarga. El último es mucho más estricto: aparte de esa espera, te exige un tiempo de nada más y nada menos que 15 minutos para realizar una segunda descarga.

Como ocurre en estos casos, el amigo de un amigo quería bajarse precisamente de RapidShare (el de los 15 minutos entre descargas) varios ficheros. Con paciencia y unas cañas no hay problema… pero si el número de ficheros asciende a nada más y nada menos que 400, la cosa se convierte en inmanejable. En realidad, si no hay prisa para la descarga, de nuevo, no hay problema por hacerla… pero es demasiado laborioso. Además, mi amigo me contaba que le resultaba muy agobiante tener que andar pendiente de si habían ya pasado los 15 minutos de espera y podía poner el siguiente.

De modo que me pidió ayuda…

De un rápido vistazo es fácil darse cuenta de que RapidShare es el único de los tres que no tiene captcha, esos pequeños retos de letras retorcidas que sirven para averiguar si el solicitante de la página (o servicio) es o no humano. A si es que… gotcha! ¿Habría alguna manera de automatizar las descargas? Dado que no hay prisa (mi amigo no necesitaba esquivar la limitación de los 15 minutos) ¿podría hacerse algún programita para conseguir que los 400 enlaces se bajaran solos?

Con mi sombrero de analizador  de aplicaciones Web y un diccionario de alemán, me cargué de paciencia y empecé…

Cuando se introduce la URL de la descarga directa, RapidShare nos saluda con:

Elección tipo de usuario en RapidShare

Si se analiza el .html veremos que el botón “Free user” está en un formulario, que invoca a una URL de un mirror de RapidShare con el parámetro dl.start=Free. Por tanto, el primer paso de nuestro programilla es ir a la página del enlace original, buscar la URL del formulario (un simple grep servirá), y llamar a la URL usando el método Post de HTTP con el parámetro anterior.

Tras pulsar el botón, un usuario normal,  verá la segunda página:

Espera en RapidShare

En ella se exige una espera determinada, cuya longitud depende del tamaño del fichero solicitado. Si miramos en Matrix (esto… en el html) veremos que toda esta página está programada con JavaScript. Cuanto termina el contador, el html se automodifica y nos deja ver un botón de descarga, e incluso elegir el servidor espejo del que descargárnoslo. El código del botón, y las opciones de los servidores lo tenemos en realidad desde el principio en el .html, por lo que nuestro programilla podría leerlo sin la espera. Sin embargo, los servidores se comunican entre sí, y si nos vamos directamente al servidor del fichero éste nos dirá que necesitamos JavaScript en nuestro navegador al haber podido pulsar el botón sin hacer la espera :)

Por tanto, lo que tenemos que hacer en nuestro programa es sacar el tiempo y esperar. Para eso basta buscar var c= y mirar el valor asignado, que será justo el tiempo inicial de espera en segundos. De nuevo, un grep y un poco de magia de expresiones regulares son suficiente para sarcalo.

Una vez hecha la espera, un usuario normal verá la página completa, para realizar la descarga:

 Boton de descarga en RapidShare

Si se pulsa el “+” a la izquierda de “Advanced download settings” aparecen un grupo de botones de radio para elegir el servidor espejo del que descargarse el fichero, aunque normalmente el marcado automáticamente (elegido por RapidShare) será el que se use.

Nuestro programa debe extraer del .html (y de los botones de radio) la URL para comenzar la descarga. Para eso, lo sacamos de las líneas:

'<input  type="radio" name="mirror" onclick="... [mirror] ... " >

del formulario de elección del servidor. Si queremos escoger el que RapidShare nos ha propuesto, podemos buscar la cadena checked para saber cual estaba marcado.

Una vez elegido, saltamos a él. Pero, de nuevo, el botón está en un formulario, y la solicitud de descarga debe hacerse con Post. Ahora los parámetros son mirror=on&x=32&y=64 y listo. El servidor nos enviará sin más problemas el fichero.

Ten en cuenta, que en ocasiones la segunda página (la de la cuenta atrás) no nos llega así, sino con un error, bien porque tenemos que esperar 15 minutos hasta la siguiente descarga, bien porque no tenemos “slot de descarga” libre y nos toca esperar dos minutos a ver si hay más suerte la próxima vez. En ambos casos, nuestro programa debería salir limpiamente.

Una vez terminado, es suficiente con invocarlo un montón de veces, uno por cada URL que tengamos. Lo metemos en un script que espere 15 minutos entre invocaciones, y nos vamos a dormir.

Mi amigo me dice que anoche se bajó ya los 30 primeros enlaces.

Cuando vivíamos en el tranquilo mundo de la programación estructurada (incluso con C), era fácil saber que la igualdad era real. Por ejemplo ante la sentencia:

a = b;

Sabremos que el resultado de la expresión del lado derecho se asignará a la variable del lado izquierdo. Si por el camino tienes punteros, te da igual: se asignan los punteros y listo.

Pero cuando llega la orientación a objetos, la igualdad pasa a ser mucho más dudosa. De nuevo, ante el código:

a = b;

asignamos en el atributo a, el objeto b. Pero, ¿lo asignamos realmente? Si cambio el objeto b, ¿cambiará también el objeto a? En Java no soy consciente de los punteros (como lo era en la programación estructurada), y sin embargo, como todos sabemos, si cambio b, también cambia a.

Obviamente, el problema está en si la igualdad hace copia superficial o profunda. Pero, en realidad, no he venido hoy a hablar de eso. He venido a hablar de un tipo de igualdad que hoy está mucho más de moda. Un tipo de igualdad que también ha cambiado en el salto a la orientación a objetos (siendo estrictos, la anterior era asignación, no igualdad).

Y es que, en la programación estructurada, teníamos las variables, y las funciones. Ahora tenemos los objetos, los atributos, los métodos y los interfaces.

En el único sitio donde ellas permanecen es en las clases. Pero, en realidad, es una confabulación para engañarlas y tenerlas contentas. Porque todos seguimos pensando en masculino. Por eso hablamos de la clase padre.

Menos mal que nuestra ilustrísima Ministra de Igualdad no programa. O, al menos, no pasó de Pascal (claro, que si alguna vez aprendió a programar, seguro que lo hizo en Ada).

© 2011 Teclarios Suffusion theme by Sayontan Sinha