Está en la página 1de 5

SOLUCIONARIO RETO JAVASCRIPT TrackMaze Hacking Group @_D14M4NT3

Como primera medida para afrontar el reto, se nos pide que enviemos nuestra respuesta a travs del formulario que se encuentra en la pagina web resuelveme.tk, aparentemente dicha pagina no contiene ms informacin que la visible, pero dado el nombre del reto ( RETO JAVASCRIPT) era evidente que el reto se encontraba en el cdigo fuente de la pagina.

Aun sin muchos conocimientos en el lenguaje Javascript, nos podemos dar cuenta de que el cdigo es simple y fcil de entender, aunque quizs la parte ms extraa sea la cuestin del condicional if, pues en este caso no hay un if sino una manera alterna de escribirlo:

Llegados a este punto, nos podemos dar cuenta de varias curiosidades al respecto del reto. Una de ellas es que el cdigo Javascript de la pagina no es quien en verdad verifica la respuesta, y simplemente esta ah como pista para pasar el reto, esto se puede ver dado que en el cdigo en ningn momento se ve una redireccin o una flag que nos permita entrar al saln de la fama; teniendo esto claro, tambin se puede intentar editar el cdigo desde la consola Javacript de Google Chrome y darse cuenta de que no dar efecto. La segunda curiosidad que nos deja ver el cdigo, es que la respuesta debe ser exactamente de 5 caracteres, lo cual nos deja en un rango accesible para hacer un ataque a fuerza bruta. Nuestra tercera curiosidad y la ms decisiva es que el cdigo compara con un AND (&&) dos cosas, tanto la longitud de la respuesta, como el resultado de dos sumas; pero una de estas sumas ( suma1) esta definida por la respuesta que ingresemos, y la otra suma (suma2) esta siempre definida por una palabra semilla (CASH9), lo cual nos da un indicio de que el valor de dicha variable ( suma2) siempre va a ser constante y de que el verdadero reto consiste en encontrar una respuesta que genera en ( suma1) el mismo valor que siempre habr en (suma2).

--Entrando en detalles:

Si estudiamos esta parte del cdigo veremos dos ciclos for que van desde 0 hasta 5, pues la longitud de la variable listado es 5, y como ya dijimos antes, con el if tenamos que la variable respuesta tambin debera ser de 5 caracteres. Siguiendo con el anlisis logramos observar que con el for, se recorren cada uno de los caracteres de ambas variables (listado y respuesta), pero no solo recorremos dichos caracteres sino que los convertimos a su valor decimal correspondiente a la tabla ASCII, mediante el atributo .charCodeAt(i). Para tener una idea ms clara de esto, podemos tomar como ejemplo la variable listado: Luego de tener esos valores, hacemos una operacin que es la que le asigna el valor a la variable (suma2), esta operacin consiste en recorrer cada carcter de la variable (listado), convertirlo en su valor DECIMAL y luego multiplicarlo por la variable (conteo2), aqu esta el truco de esto, pues la (conteo2) esta iniciada en 5 y como esta dentro del for, se le dice que en cada iteracin esta variable de aumente en uno ( conteo2++). Por lo tanto si miramos esto de una manera un poco grfica tenemos que el ASCII de la letra C ser multiplicada por 5, luego, el ASCII de la letra A ser multiplicada por 6, luego, el ASCII de la letra S ser multiplicado por 7 y as sucesivamente hasta culminar con todas las letras. [No olvidar que la variable (suma2) se acumula a si misma, osea guarda la suma del valor nuevo con el que ya tenia almacenado] Si seguimos los valores que adquiere la variable (suma2), el ultimo de ellos es el 2395, y ese ser su valor final. Para la variable (respuesta) el proceso es el mismo, exceptuando que ahora no ser multiplicado por la variable (conteo2) sino por la variable (conteo1) que esta iniciada en 3 y su valor ser guardado en la variable (suma1). [Para mayor comprensin de lo aqu escrito, es recomendable tener a la vista el cdigo que estamos examinando] Si generalizamos un poco, tenemos que nuestra respuesta debe tener una longitud de 5 caracteres, y tambin que al hacerle el proceso anterior, pero esta vez no empezando en 5 sino en 3, el resultado debe ser igual a 2395. As que tomando una posicin matemtica, si nombramos a cada valor decimal del ASCII de las letras como X con subndices, al final tendremos una representacin matemtica:
3X 1 + 4X 2+ 5X 3 + 6X 4 + 7X 5 =2395

En pocas palabras nosotros tenemos que resolver esa ecuacin y obtendremos nuestra solucin, pues los valores de X 1 , X 2 , X 3 , X 4 y X 5 que cumplan eso al pasarlos de nuevo a su representacin de decimal a caracteres, nos darn una solucin que ser validada correctamente.

Podemos probar varios posibles mtodos de solucin de esa ecuacin, intentemos descubrir si existe una respuesta en que los 5 caracteres son iguales, por ejemplo AAAAA, XXXXX, vvvvv, lllll, etc... si volvemos a plantear la primera ecuacin tendremos que: 3X1 + 4X 1+ 5X 1+ 6X 1+ 7X1=2395 Como podemos observar todas son X1, as que si factorizamos un poco, tendremos lo siguiente:

X 1 ( 3 + 4 + 5 + 6 + 7)=2395
X 1 ( 25)=2395 Ahora hacemos lo mismo que en el caso anterior, pasamos a dividir y as obtendremos el valor de X1 que necesitaremos para que la primera ecuacin se cumpla: X 1= 2395 = 95.8 25

Bueno :( aqu hemos obtenido un valor decimal, lo cual quiere decir que entre las posibles soluciones de este reto, no existe ninguna en la cual la respuesta sea un nico carcter repetido 5 veces :( Si quieres intentarlo con el carcter que representa el decimal 95, en este caso _ podrn darse cuenta de que el valor de (suma1), ser de 2375, lo cual es muy cercano a nuestra meta, osea que sea igual a 2395; esto quiere decir que no vamos tan perdidos en cuanto al mtodo de solucin. Los valores ASCII son nmeros enteros, por ende no es posible encontrar valores ASCII menores a cero o con punto decimal. [Fuerza Bruta] Como lo dije al principio, lo ms fcil e inmediato sera realizar un ataque a fuerza bruta, pero existe un tema de recursos y optimizacin respecto a esta tcnica, en nuestro caso, podemos hacer un ataque por fuerza bruta que pruebe todos los posible X 1 , X 2 , X 3 , X 4 y X 5 , que cumplan con nuestra primera ecuacin, pero esto implica un gran uso de recursos. Si queremos probar todas la posibles soluciones, utilizando solamente el abecedario en minscula tendremos 26^5= 11881376 posibles respuestas, lo mismo para el abecedario en mayscula, pero qu sucedera si la respuesta esta formada por maysculas y minsculas; nuestro rango de ataque crece enormemente, quedando de 52^5= 380204032 posibles respuestas, y si la respuesta esta formada por caracteres alfanumricos mezclados con maysculas y minsculas, pues nuestro rango de ataque crece aun ms, siendo as 62^5= 916132832 las posibles respuestas. Como lo pueden ver, hacer un ataque de fuerza bruta nos implicara una cantidad excesiva pero posible de gastos en recursos, as que trataremos de optimizar esto un poco. La manera en que podemos optimizar nuestro ataque por fuerza bruta, es disminuyendo la cantidad de combinaciones, por ejemplo el reto en si, nos planea realizar todas las posibles combinaciones de 5 caracteres, pero, una manera eficaz de disminuir todas esas combinaciones, es tener algunos caracteres fijos, y combinar los dems hasta obtener un resultado positivo.

Nosotros podemos escoger cualquier par de caracteres y dejarlos fijos durante toda la combinatoria, as ya no tendramos que realizar 26^5, 52^5 62^5 combinaciones, sino solamente 26^3, 52^3 62^3. Si volvemos a nuestra primera ecuacin, tenemos que si reemplazamos dos X por valores conocidos, aun conservaremos la respuesta original. W =87 K =75

3X1 + 4X 2 + 5X3 + 6W + 7K =2395 Hemos elegido la W y la K, con sus respectivos valores en decimal ASCII, como pueden ver en la ecuacin, al multiplicarlos por 6 y por 7 respectivamente, estamos afirmando que la solucin ser de esta manera ???WK, con ambos caracteres al final, a menos que los queramos en el centro o en el inicio, en ese caso habra que multiplicarlos por la constante que acompaa la X de esa posicin. 3X1 + 4X 2 + 5X3= 23956W 7K

3X1 + 4X 2 + 5X3= 23956 ( 87 ) 7 ( 75 ) 3X1 + 4X 2 + 5X3=1348


Ahora tenemos que encontrar una tripleta de cumpla esa ecuacin, que multiplicados por 3, por 4 y por 5 y luego sumados entre s, sea igual 1348. Nuestro Script solamente nos devolver la primera solucin que encuentre, en caso de que las quieras ver todas, simplemente es cuestin de quitar el return de la funcin, y en caso de que este interesado en buscar soluciones alfanumricas o solo minsculas o solo maysculas, tienes que editar la variable abecedario. Puedes personalizar tu respuesta, haciendo que lleve los caracteres que quieres, y en las posiciones que quieres, ya solo es cuestin de que acomodes de nuevo la formula y pases a restar; as por ejemplo t podras hacer un anlisis de todas las soluciones que terminan en X, o las que al inicio tienen la letra A y al final, la letra z, o quizs quieras que ahora la respuesta tenga caracteres alfanumricos , en ese caso tendrs que agregarle al abecedario, los valores del 0 al 9.

S que quizs este no sea un anlisis muy profundo en cuanto ha matemticas, pero ya les explicar un poco en donde podemos ver esta aplicacin. El numero 2395 solo tenia dos divisores el 5 y el 479, esto quiere decir que solo al dividirlo por ellos nos devuelve una respuesta que pertenece a los nmeros enteros; siguiendo con esto, nos damos cuenta de que tanto el 5 como el 479 son nmeros primos, entonces no los podemos seguir descomponiendo, por ende nos tocara probar todas las posibles combinaciones que cumplan con la igualdad (fuerza bruta), y segn el abecedario que utilicemos este numero de combinaciones crece en gran medida. Longitud 2 Letras 3 Letras 4 Letras 5 Letras 26 Caracteres 676 17576 456976 11881376 52 Caracteres 2704 140608 7311616 380204032 62 Caracteres 3844 238328 14776336 916132832

Ahora imagnense si tuvisemos el mismo reto, pero ahora no con una longitud definida de 5 sino de 17 y que adems se presentase el caso en que la igualdad este dada por un numero primo o un numero con solo dos divisores como en el caso anterior. Sin hacer este anlisis y haciendo un ataque por fuerza bruta, tendramos que para una solucin en minscula (26 caracteres) nuestro computador realizara 26^17=1133827315385150725554176 combinaciones, obviamente este numero es casi impensable de realizar, entonces si analizamos esto, podramos reducir la respuesta en el mejor de los casos a 5 caracteres variables y 12 caracteres fijos. [Despedida] Disculparn lo extenso de esta solucin, pero pues quera aclarar un poco, cmo a partir del anlisis de un problema se pueden obtener soluciones ptimas y eficaces, para problemas del mismo tipo de un grado mayor de procesamiento. Cualquier duda, sugerencia o comentario sera bienvenido, y prontamente respondido; tanto por mi blog personal, como el del grupo Trackmaze.blogspot.com

@_D14M4NT3

También podría gustarte