HackIt’2010: Level 2

Más de lo mismo 🙂 Aunque ahora el código Javascript está ofuscado con un empaquetador (packer).
Basta con abrir el level2.js y analizar la primera línea:

eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\b'+e(c)+'\b','g'),k[c]);return p}('C D(){f a=q.t('u').w;f r=z A(8);f x="";B(f i=0;i<r.g;i++){r[i]=z A()}c(a.g==8){c(a.b(5)=="n"){r[7]=["l","j","k","j","9","1","l","m"];c(a.b(4)=="0"){r[2]=["x","d","e","j"];c(a.b(0)=="3"){r[8]=["s","s","3","j","o","E","k"];c(a.b(3)=="y"){r[6]=["7","5","k","j","n","v","k"];r[0]=["l","j","k","j"];c(a.b(1)=="4"){r[3]=["l","j","4","j"];r[1]=["l","j","k","j"];c(a.b(2)=="s"){r[5]=["l","j","k","j","h","o","p"];c(a.b(6)=="3"){r[4]=["l","j","k","j","2","8","h"];B(f j=0;j<r[7].g;j++){x=x+r[j][j]}c(x.F("e","3")==r[7][0]+r[2][3]+a.b(6)+r[5][3]+"2"+r[8][4]+r[1][2]+r[7][7]){q.t('u').w=a.b(0)+a.b(1)+a.b(2)+a.b(3)+a.b(4)+a.b(5)+a.b(6);G()}}}}}}}}}}',43,43,'|||||||||||charAt|if|||var|length||||||||||document|||getElementById|password||value|||new|Array|for|function|check|S|replace|Login'.split('|'),0,{}))

Busando packers de Javascript en Google, llegamos a éste (usando «eval(function(p,a,c,k,e,r)» como cadena de búsqueda).

Desempaquetamos y obtenemos código mucho más clarito (donde vemos también que hey_neken metió líneas de código espurio)

function check() {
	var a = document.getElementById('password').value;
	var r = new Array(8);
	var x = "";
	for (var i = 0; i < r.length; i++) {
		r[i] = new Array()
	}
	if (a.length == 8) {
		if (a.charAt(5) == "n") {
			r[7] = ["l", "j", "k", "j", "9", "1", "l", "m"];
			if (a.charAt(4) == "0") {
				r[2] = ["x", "d", "e", "j"];
				if (a.charAt(0) == "3") {
					r[8] = ["s", "s", "3", "j", "o", "S", "k"];
					if (a.charAt(3) == "y") {
						r[6] = ["7", "5", "k", "j", "n", "v", "k"];
						r[0] = ["l", "j", "k", "j"];
						if (a.charAt(1) == "4") {
							r[3] = ["l", "j", "4", "j"];
							r[1] = ["l", "j", "k", "j"];
							if (a.charAt(2) == "s") {
								r[5] = ["l", "j", "k", "j", "h", "o", "p"];
								if (a.charAt(6) == "3") {
									r[4] = ["l", "j", "k", "j", "2", "8", "h"];
									for (var j = 0; j < r[7].length; j++) {
										x = x + r[j][j]
									}
									if (x.replace("e", "3") == r[7][0] + r[2][3] + a.charAt(6) + r[5][3] + "2" + r[8][4] + r[1][2] + r[7][7]) {
										document.getElementById('password').value = a.charAt(0) + a.charAt(1) + a.charAt(2) + a.charAt(3) + a.charAt(4) + a.charAt(5) + a.charAt(6);
										Login()
									}
								}
							}
						}
					}
				}
			}
		}
	}
}

Siguiendo las comprobaciones de las ramas if, llegamos a:

     0 1 2 3 4 5 6 7
     3 4 s y 0 n e .

Donde la longitud ha de ser de 8 caracteres, siendo el último de ellos uno cualquiera. Y con esto, llegamos al level3 donde estuvimos un buen rato atascados… a ver qué tal se os da a vosotros 😉

Froyo, G.O.T., Milestone y Motorola

Llevaba un buen tiempo documentando el proceso a seguir para migrar mi Motorola Milestone a la versión 2.2.1 (Froyo) de Android y hoy lo he conseguido. ¿Por qué cuesta tanto si Froyo está ya anticuado? (Gingerbread 2.3 y Honeycomb 3.0 ya han sucedido a Froyo) Bien, primero porque a Motorola Europa se le ocurrió meter una protección para evitar la instalación de ROMs no oficiales. Segundo, porque la propia Motorola lleva un retraso enorme: primero dijo que en Noviembre de 2010 saldría una versión, pero luego retrasó la noticia al comienzo del primer trimestre de 2011 (obviamente ha vuelto a incumplir su promesa). De hecho no estoy seguro de que vaya a ver alguna vez la luz este upgrade oficial.
En fin, un desastre del que como consumidor tomo nota para el futuro.

Mientras Motorola sigue trabajando en busca de un Froyo estable para el Milestone, la comunidad (G.O.T. en concreto) ha conseguido saltarse protecciones, compilar dicha versión y distribuírla para distintos continentes (Canada, UK, Francia, resto de Europa…)

El proceso no es sencillo, para qué nos vamos a engañar. De hecho mi intención era documentarlo en DiarioLinux una vez ejecutado, pero la gente de desentropia.com me ha ahorrado el trabajo con un EXCELENTE tutorial paso a paso en castellano. La única diferencia entre el tutorial de Desentropia y los pasos que yo he seguido son que he instalado la versión «Retail Europe» del firmware de G.O.T. y que el APN he tenido que reconfigurarlo a mano (por defecto detectaba mi proveedor móvil – Telefónica – pero el APN que metía – telefonica.es – no funcionaba, y en su lugar he metido los datos relativos a – movistar.es – tal y como podéis ver aquí. Misma compañía pero dos configuraciones distintas de APN.. curioso)

SalesForce compra DimDim

Hemos hablado antes de DimDim en DiarioLinux, una aplicación para web meetings (videoconferencia, pizarra compartida, gestión de usuarios, …) que en su día puso el código bajo una licencia libre . Digo en su día porque llevaba desde 2008 sin actualizar el código de su versión libre, llegado un punto en el que la versión privativa poco o nada tenía que ver con la libre. El caso es que hoy se ha publicado una nota de prensa en la que se indica que SalesForce ha comprado DimDim por 31 millones de dólares en cash. Ahí es nada. SalesForce es una compañía especializada en ofrecer servicios y aplicaciones de cloud computing para empresas. ¿Qué pasará con la versión opensource de DimDim? Nada, seguirá como hasta ahora, es decir, sin recibir aportaciones desde hace años.

Recordemos que hay alternativas libres a DimDim, igual de potentes (aunque gráficamente no tan trabajadas): OpenMeetings y Big Blue Button (ésta última especialmente recomendada para Universidades). Elija la que más le guste 🙂

Tip: montar carpetas Samba for dummies

En el trabajo disponemos de un servidor NAS que comparte carpetas a través de Samba. El acceso a las mismas a través de Nautilus es trivial, basta con poner en la barra de direcciones (Ctrl+L) :

smb://direccion.ip.del.servidor

y ya podremos ver todas las carpetas compartidas por ese server. Ahora, pulsando sobre cualquiera de esas carpetas, un cuadro de diálogo nos pedirá login/password y nombre del grupo. A partir de ahí, funcionaremos como si las carpetas fueran locales, sin más preocupaciones.

Ahora bien, a veces no interesa acceder a esas carpetas compartidas desde la línea de comandos. Y héte aquí que al lanzar el comando mount vemos que aparentemente esas carpetas Samba con las que podemos trabajar perfectamente en Nautilus, resulta que no están montadas. Digo aparentemente porque sí que lo están. Están disponibles en el directorio .gvfs de tu home (por ejemplo, en /home/juanan/.gvfs). Lo bonito de ésto es que no tienes que andar recordando cuál era la sintaxis correcta de smbmount para montar recursos compartidos vía Samba protegidos por password.

Tip: cosas que no sabías del comando top

El comando top sirve para (entre otras cosas) pode ver, de forma ordenada, un listado de los procesos actualmente en ejecución, en función de distintos criterios: consumo de CPU, consumo de memoria RAM, tiempo que llevan ejecutándose, PID…

Lo que tal vez no sabías era que puedes cambiar el criterio de ordenación pulsando las teclas «<" y/o ">» para moverte en los criterios/columnas hacia la izquierda o derecha. Para ver qué columna es la que ha fijado el criterio lo mejor es que pulses la tecla Z que permite ver en color la pantalla del top (las columnas aparecerán en rojo salvo la columna/criterio actual, que aparecerá en blanco). Para ordenar de forma creciente o decreciente, pulsa «R».