Hack-It EE28 : Nivel 1 “Takeoff!”

hackit_01

Vamos con el hackit sencillo de esta euskal. (Aunque igual algo extenso de explicar pero bueno… xD)

A éste le dediqué algo de tiempo para desintoxicarme del solveit 3, que nos tenía bastante cansados ya … pero no lo llegué a terminar por un fallo tonto que tuve… tonto pero suficiente para que me mandase el resultado a pique xD.

El enunciado, deja bastante claro, para el que conozca el evento de hackit, que algo habrá en el código fuente de la web que habrá que reversear.

Editando el código fuente nos encontramos con una línea que modifica el css del box de la contaseña y que tiene esta pinta:

(document).ready(function(){$(“#password”).keyup(function(o){for(var r = $(“#password”).val(), s = [],n = r.length,a = [35, 420, 53, 108, 275, 139, 690, 2417, 74, 888, 1002],f = a.length, t = 0; t < n; t++)s.push(r.charCodeAt(t));for (t = 0; t < 4242; t++) s[t % n] = 255 & ( a[t % f] % 10 == 0 ? s[t % n] + a[t % f] / 10 | 0 : a[t % f] % 10 == 1 ? s[t % n] – a[t % f] / 10 | 0 : a[t % f] % 10 == 2 ? s[t % n] ^ a[t % f] / 10 | 0 : a[t % f] % 10 == 3 ? s[t % n] + s[(t + a[t % f] / 10 | 0) % n] : a[t % f] % 10 == 4 ? s[t % n] ^ s[(t + a[t % f] / 10 | 0) % n] : a[t % f] % 10 == 5 ? -s[t % n] : a[t % f] % 10 == 6 ? s[t % n] + (s[(t + 3) % n] ^ a[t % f] / 10) : a[t % f] % 10 == 7 ? s[t % n] – (s[(t – 4) % n] | a[t % f] / 10) : a[t % f] % 10 == 8 ? s[t % n] ^ s[(t + 5) % n] & a[t % f] / 10 : s[t % n] ^ s[(t + 6) % n] * a[t % f] / 10); $(“#password”).css({ “background-color”: JSON.stringify(s) == JSON.stringify([32, 231, 18, 96, 116, 170, 21, 121, 83, 39, 25, 13, 64, 42, 127, 240, 39, 25, 173, 119, 201, 175, 205, 247]) ? “#8f8” : “#f88”})})});

Parecen un mogollón de operaciones con arrays, vamos a pasarle un beautifier para que quede algo más legible … como siempre también …

hackit_01_02

A ver, siendo sinceros, no es que deje muy limpio el formato que nos tiene puesto marcan pero bueno, vamos a dividir a mano lo que parece una cadena de ‘if’ infinitos …

hackit_01_03

Bueno, podría ser peor …

Si empezamos a analizar el código, como vemos, lo que hace es:

hackit_01_04

Linea 2: Cada vez que se hace “keyup” en el campo de password ejecuta la funcion ‘o’, que como vemos consiste en:

Linea 3: coger el valor de la password, es decir, la password que nos interesa, la del nivel, y asociarla a una variable ‘r’;

Linea 4: crea además un array ‘s’ vacío.

Linea 5: crea otra variable llamada ‘n’ en el cual metemos el valor de la longitud del array ‘r’, es decir, la longitud de la password del nivel (‘r’ lo hemos igualado antes a la password, recordemos)

Linea 6: crea un array llamado ‘a’ con los valores que se ven en la captura: 35, 420, 53, 108, 275, etc…

Linea 7: crea una variable llamada ‘f’ donde metemos el valor de la longitud del array ‘a’; que en este caso será 11, así que f = 11. Por otro lado, en esta misma línea inicia una variable t=0, que es la que va a usar para el bucle ‘for’, puesto que luego vemos que la condicion para seguir ejecutando el bucle for es que t < n y que cada iteración sume 1 a t (es lo que significa el t++).

Linea 8: Este es el contenido del bucle for en sí. Lo que vemos que hace cada iteración es añadir al array ‘s’ (el método push() en JavaScript añade un elemento al final del array) el valor en ascii (un valor de 0 a 255) del carácter en la posición t del array r, que es la contraseña. Es decir, lo que hace es calcular todos los valores en ascii de la password del nivel y meterlos en el array s como valores numéricos.

La conclusión de esto es que en este punto, nada más acabar el bucle ‘for’ tenemos en el array s nuestra contraseña codificada en ascii.

Lo que no sabemos es cuántos valores son (es decir, no sabemos el tamaño del array ‘s’) ni por supuesto qué valores son.

Si seguimos mirando el código nos encontramos con otro bucle for … este un poco más ‘potente’ ya … :

hackit_01_05

Linea 10: En el que vemos que hace 4242 iteraciones…

… con varios if concatenados.

Si nos fijamos bien, dentro de este for en realidad, solamente hay UNA operación que es la de la linea  11:

s[t % n] = 255 & ( los_if_que_siguen_que_son_un_churro_de_la_muerte );

Empecemos por el principio… tal y como vemos esto, lo que tenemos aquí es que el caracter que está en la posición ‘t % n’ de nuestro array, que contiene la password ‘s’, lo igualamos a ‘255 & ( algo )’; esto significa que hacemos un and lógico/bit a bit (&) de los valores de ‘algo’ con 255.

¿Y por qué?

Como sabréis 255 en binario es igual a ‘1111 1111’ así que marcan hace esto porque no quiere que, tras hacer las operaciones que hay dentro del paréntesis (es decir, las operaciones tochas que he definido antes como ‘algo’), NINGÚN valor de los que resulten sobrepase 255 en decimal; a esto se le suele llamar hacer una máscara de bits. Por ejemplo, supongamos que la operación ‘algo’ que tiene que hacer es la que hay en la de la linea 22 del programa (‘-s[t % n]’). Esta operación en concreto, lo que hace es calcular el valor en negativo de lo que hubiera en la posición del array s[t % n]; hasta ahí sencillo … Ahora bien, hacer el valor negativo de un número en informática recordemos que consiste en hacer el complemento a 2 (en binario) de ese número. Eso supone que si por ejemplo tenemos un valor en decimal de 120, en binario este valor se representaría como ‘0111 1000’, su valor negativo ‘-s[t % n]’ sería en decimal = -120, pero este valor negativo representado en binario sería ‘1111 1111 1111 1111 1111 1111 1000 1000’ (este valor es su complemento a 2 operando en 64 bits, que es como *creo* que javascript funciona por defecto). Si ahora este valor binario lo representase como entero sin signo (podéis probar usando la calculadora de windows mismamente) su valor sería de: 4294967176. Es por eso por lo que si a este valor tan tocho le hacemos una máscara ‘& 255’ nos estaremos quedando con los últimos 8 bits (bits de la derecha/menos peso) que serían ‘1000 1000’ es decir, el equivalente a 136 en formato decimal.

Y no hemos acabado, por supuesto …

¿Qué es ‘t % n’? (o mejor dicho, el operando ‘%’)

Tanto en C, como en C++ como en JavaScript como en otros muchos lenguajes, el operando % representa el módulo de una división. ¿Y qué es el módulo de una división? pues tan sencillo como el resto de esa división. Por ejemplo, ahora veremos que la primera iteración que vamos a hacer en ese for va a ser para t=4241 y veremos tambíen que el valor de n=24 (y que 24 es la longitud de la password). Hacer t % n consiste en hacer la división t/n y quedarnos, no con el resultado, sino con el resto de la división, es decir:

4241 / 24 = 176.70833333.. => 176.708333 – 176 = 0.708333 => 0.708333 * 24 = 17

Con lo que la operación: 4241 % 24 = 17

Hay otra serie de operaciones dentro de esos if en las que entraremos luego.

Y por cierto no lo he dicho, pero en C++, C#, JavaScript las líneas:

a > b ? a = 0 : b = 1;

Son exactamente lo mismo que:

if (a>b)
   a = 0;
else
   b = 1;

marcan se aprovecha de esto para poner un chorreo guapo en una sola línea concatenando ifs a lo salvaje…

Antes de entrar con esos if (que son lo más complejo del hackit) vamos a continuar fuera del mismo, con lo que viene tras el bucle for:

hackit_01_06

Aquí vemos lo que comentaba al principio del color del box de la contraseña en .css.

Cambia el color del css en base a si la password (el array ‘s’) resultante tras el bucle ‘for’  es igual a [32, 231, 18, 96, …., 247]. En concreto pone verde (#8f8) el fondo si es igual y lo pone rojo (#f88) si es diferente:

hackit_01_07

Llegados a este punto sabemos que justo antes de hacer esa comprobación, el valor de s ha de ser exactamente el siguiente:

s = [32, 231, 18, 96, 116, 170, 21, 121, 83, 39, 25, 13, 64, 42, 127, 240, 39, 25, 173, 119, 201, 175, 205, 247];

(Los JSON.stringify que se ven en el código, en este caso son triviales: se aplican en ambos lados de la igualdad así que podemos ‘pasar’ de ellos).

Llegados a este punto ya sabemos que lo que tenemos que hacer es “ejecutar el código al revés”, es decir, partiendo de que ‘s’ sea igual a: s = [32, 231, 18, 96, 116, 170, 21, 121, 83, 39, 25, 13, 64, 42, 127, 240, 39, 25, 173, 119, 201, 175, 205, 247]; Tenemos que conseguir saber qué valores tiene ‘s’ justo antes de que el bucle for tocho nos lo modifique; es decir, que podemos empezar programando lo siguiente:

hackit_01_08

Nos quitamos de en medio ese bucle for inicial que genera ‘s’ a partir de la password del nivel, y creamos el array ‘s’ con los valores que tiene que tener al final del bucle for tocho. Además sabremos que la password ha tener la longitud de esa misma ‘s’ generada ya que el bucle for tocho, no le añade elementos al array (no existe ningún .push() dentro del for tocho).

Vale, ahora lo que hay que pensar es cómo se ha de deshacer todo el cristo del bucle for.

Para empezar, el bucle ‘for’ original se recorre desde t=0 hasta t=4241 así que esta parte es fácil, consiste en darle la vuelta al bucle => tendrá que ir desde t=4241 hasta t=0:

hackit_01_09

Hasta aquí la parte fácil. Vamos ahora dentro del bucle ‘for’:

hackit_01_05

Linea 11: Esta ya la hemos visto antes. Hemos dicho que hace una máscara de 255 (1111 1111) con lo que hay detrás, que es el resto de ifs. Vamos con el ‘resto de ifs’.

Linea 12: Supongamos que se cumple la condición que indica de que ‘a[t % f] % 10 == 0’. Por ejemplo, para t=12; f = 11 (siempre, porque f = longitud de a, que no varía y vale 11). Así que a[12 % 11] = a[1] = 420, y ahora 420 % 10 = 0 así que al cumplirse tenemos que se ejecuta la linea 13.

Linea 13: lo que tenemos aquí es ‘s[t % n] + a[t % f] / 10 | 0’. Es decir, que la ejecución de la iteración para t=12 sería: s[t % n] = 255 & ( s[t%n] + a[t % f] /10 | 0 );

Si vamos sustituyendo tenemos: s[12%24] = 255  & ( s[12%24] + a[12%11] / 10 | 0 );

Es decir: s[12] = 255 & ( s[12] + a[1] / 10 | 0);

Y sustituyendo por valores numericos: s[12]new = 255 & ( s[12]old + 420 / 10 | 0 );

He puesto s[12]new y s[12]old porque realmente, los valores de ‘s’ van a ir oscilando según la iteración en la que estemos y no sé exactamente el valor numérico que tendrá cuando estemos en esta iteración que he puesto a bulto: iteración t=12 … Lo que sí sé es que lo que hay dentro del igual es un valor que es el anterior (old) al que va a haber (new), porque se sobreescribe; por eso les he puesto la etiqueta de ‘old’ y ‘new’.

Por otro lado entran en juego aquí

Ahora hay que tener en cuenta que lo que me interesa saber no es el valor ‘new’ (ya que este valor ‘new’ sería el que vale para cuando ejecutamos el programa como está originalmente) sino que lo que necesitamos es el valor ‘old’ porque recordemos, que estamos reverseando el bucle ‘for’! Con lo que hay que despejar de esa ecuación el valor que nos interesa, es decir: s[12]old

Puede que se nos plantee un problema ahora y es el operando ‘|’ que vemos.

Este operando es un ‘or lógico’ (or a nivel de bit). Y claro, aquí tenemos el planteamiento de… qué tiene prioridad? Sabemos de sobra que las divisiones/multiplicaciones tienen prioridad sobre sumas/restas, pero ¿y las operaciones booleanas a nivel de bit ??

Para saber qué tiene preferencia a la hora de operar .. pues recurrí a google, como era de esperar … y según esta tabla:

hackit_01_10

lo más prioritario serían las multiplicaciones y divisiones, luego vendrían las sumas y finalmente las operaciones a nivel de bit. Con lo que para despejar s[12]old de esta ecuación:

s[12]new = (  ( s[12]old – (420 / 10) ) | 0  );

‘| 0’ es exactamente igual que hacer nada … así que directamente lo vamos a quitar porque no hace más que molestar:

s[12]new = (  ( s[12]old – (420 / 10) )  );

s[12]new + 420 / 10 = s[12]old;

s[12]old = s[12]new + 420 / 10;

O lo que es lo mismo en plan genérico para esta linea 13:

s[t % n] – a[t % f] / 10

(le hemos cambiado el signo únicamente. Si hacemos con las siguientes líneas que hacen alguna operación la misma jugada …:

Linea 15 : s[t % n] – a[t % f] / 10 | 0 :  —>   s[t % n] + a[t % f] / 10 :

En la linea 17 no es una resta lo que tenemos, sino una operación tipo ‘^’. Esto es un XOR a nivel de bit. La inversa de una operación XOR es exactamente la misma operación XOR, con lo que:

Linea 17 : s[t % n] ^ a[t % f] / 10 | 0 : —>   s[t % n] ^ a[t % f] / 10 :

La línea 19 puede ser un poco confusa porque hay operaciones de sumas DENTRO del índice s, sobre el que estamos trabajando. Aquí NO hay que hacer ninguna modificación. El índice al que se refiera dentro de s tiene que ser el mismo según la variable t, n y f. Con lo que:

Linea 19 : s[t % n] + s[(t + a[t % f] / 10 | 0) % n] :  —>  s[t % n] – s[(t + a[t % f] / 10 | 0) % n] :

Linea 21: s[t % n] ^ s[(t + a[t % f] / 10 | 0) % n] :  —> s[t % n] ^ s[(t + a[t % f] / 10 | 0) % n] :

Y ahora vino mi cagada… que tarde o temprano habría descubierto … si no hubiera dedicado media party al Solve-It 3 ….. :/

Linea 22 : a[t % f] % 10 == 5 ? -s[t % n] :

-s[t % n] tiene que permanecer tal cual; NO ha de cambiarse porque si se cambia tenemos que:

s[t % n] = s[t % n];

Es decir, no vamos a hacer absolutamente ninguna operacion sobre el valor, y lo que hay que hacer es, como he explicado antes, el complemento a 2 del valor s[t % n] y luego se sustituye por sí mismo…

Típico de examen de matemáticas: “me han suspendido por un signo!” … xD

En cuanto al resto, seguimos con la misma tónica:

s[t % n] + (s[(t + 3) % n] ^ a[t % f] / 10) : –> s[t % n] – (s[(t + 3) % n] ^ a[t % f] / 10) : 

s[t % n] – (s[(t – 4) % n] | a[t % f] / 10) : –> s[t % n] + (s[(t – 4) % n] | a[t % f] / 10) :

s[t % n] ^ s[(t + 5) % n] & a[t % f] / 10 : –> s[t % n] ^ s[(t + 5) % n] & a[t % f] / 10 :

s[t % n] ^ s[(t + 6) % n] * a[t % f] / 10); –> s[t % n] ^ s[(t + 6) % n] * a[t % f] / 10);

De esta forma el programa que nos queda modificado (reverseado) es:

hackit_01_11

Si mostramos el valor del array ‘s’ con un console.log(s), tenemos que es el siguiente:

hackit_01_12

Y si esto lo pasamos a un string de la siguiente forma:

hackit_01_13

Tenemos finalmente la solución del level:

hackit_01_14

Mung1nG4rRay54fUn&Pr0f1t

 

Solve-It EE28 : Nivel 5 “Minutos musicales”

Y finalmente:

SolveIt_05

Este es el que, para mí, fue de los más sencillos del solve it (e igual por eso también fue el que más me gustó xD).

Se trata de un archivo de audio en el que suena Nyancat y cuya forma de onda tiene esta pinta:

Captura de pantalla 2020-07-28 a las 13.14.17

Nada más darle al play no suena nada excesivamente extraño pero sin embargo, como se puede ver en la captura anterior, en la forma de onda se pueden apreciar cosas raras …

Por un lado parece que tenemos a partir del centro de la pista de sonido, una ondas senoidales casi perfectas con mucho ruido alrededor. Sin ir mas lejos, la parte final de la pista de audio tiene una onda senoidal casi impoluta:

Captura de pantalla 2020-07-28 a las 13.18.56

Viendo esto, lo que parece es que han sumado una señal senoidal de muy baja frecuencia y bastante potente a la pista de audio.

De hecho, si vamos al inicio de la pista de sonido, vemos algo parecido pero bastante más claramente; hay una onda senoidal prácticamente perfecta:

Captura de pantalla 2020-07-28 a las 13.21.52

Se puede pensar que igual se nos quiere ocultar algo en la pista original de audio enmascarándolo con estas ondas de baja frecuencia (puede que morse subiendo y bajando el volumen de la pista original o asi…?)

Vamos a intentar quitar las bajas frecuencias de en medio. Para ello, vamos a buscar la frecuencia aproximada de las mismas:

Captura de pantalla 2020-07-28 a las 13.24.48

Un ciclo de esa onda dura 0.05 segundos => la frecuencia es la inversa: 1 / 0.05 = 20 Hz

Pasemos un filtro paso alto, es decir, eliminamos así todas las ondas por debajo de las frecuencias de 30 Hz (damos un poquito de margen, por eso 30Hz y no 20)

Captura de pantalla 2020-07-28 a las 13.27.55

Bueno, esto tiene más pinta de pista de audio “normal” aunque el problema que se ve es que… principalmente no hay nada que llame en especial la atención. No parece que haya datos  adicionales… la anchura (volumen) es más o menos constante … al escucharla suena normal …

Vamos a deshacer el filtro y ahora vamos a hacer lo contrario pasando un filtro paso bajo en lugar de paso alto a ver qué vemos en las bajas frecuencias… (el filtro tambien de 30Hz)

Captura de pantalla 2020-07-28 a las 13.30.48.png

Bueno, aquí sí que canta mucho más que hay algo de información … Parece que la anchura de las ondas divide perfectamente en varios tramos a la pista, en concreto en 18 tramos. => 18 letras?

Visto esto, lo único que parece que puede diferenciar a cada una de los tramos es su frecuencia de la onda de dicho tramo, así que vamos a ver qué frecuencia tiene cada tramo:

Captura de pantalla 2020-07-28 a las 14.43.47

Para medir la frecuencia hacemos parecido a como hemos hecho antes: tomamos desde un punto de la onda hasta el siguiente mismo punto y miramos el tiempo que hay entre ambos:

El primer tramo es el que he puesto al principio, que era de 0.05 s => 20 Hz

Captura de pantalla 2020-07-28 a las 14.47.25

Siguiente es de 0.055s => 18.2 Hz que vamos a redondear por defecto a 18 Hz

Siguiente es de 0.067s => 14,9 Hz redondeado a 15 Hz

Y así vamos haciendo todos los tramos (pongo captura de alguno más de ellos:

20 Hz

18 Hz
15 Hz
12 Hz
15 Hz
12 Hz
15 Hz
19 Hz
21 Hz
2 Hz
6 Hz
18 Hz
5 Hz
17 Hz
6 Hz
12 Hz
1 Hz
7 Hz

Si asociamos a cada uno de estos valores, una letra del abecedario (o sea, como en el solveit 3, pero sin hacer cabriolas raras) obtenemos la solución directamente:

Captura de pantalla 2020-07-28 a las 15.03.16

 

trololosubfreqflag

 

 

 

 

 

Solve-It EE28 : Nivel 4 “Grand piano”

Vamos llegando a los últimos solveit del año; este tiene poquito desarrollo:

SolveIt_04

VIDEO

Bueno, este nivel, más que difícil fue un poco tedioso.

En el vídeo que nos muestra marcan para este solve it se ve un piano tocando una pieza pero no suena nada. La solución salta a la vista que tendría que venir por intentar ver qué pieza es la que está tocando …

El problema de este solveit como digo, es que reproducir todas y cada una de las pulsaciones de las teclas con los tiempos adecuados iba a ser un auténtico coñazo y más para alguien como la mayoría de nosotros que no sabe de música…

…bueno, y digo la mayoría porque por suerte, uno del grupo sí que sabe, así que fue él el que se encagó de transcribir las notas en un editor midi.

No lo había terminado y cuando iba unos 20 segundos, nos pasó el archivo de sonido de lo que había generando hasta el momento.

Pese a no estar completa la pieza, otro del grupo distinguió rápidamente de qué música se trataba. El siguiente enlace es del archivo de sonido que generamos nosotros en midi:

https://bit.ly/3f1CxJi

 

 

Se trata de un tema de:

super mario world

Solve-It EE28 : Nivel 3 “Un nivel diferente”

Y aquí llega el muro con el que nos topamos muchos de los asistentes xD

SolveIt_03

Con diferencia este ha sido el nivel al que más tiempo dedicamos… creo que no fuimos el unico grupo de hecho …

Analizándo la serie de números rápidamente se ve que son 28 números que van de 1 a 26 así que enseguida se te viene a la mente que pueda ser una sustitución simple del alfabeto, con lo que al asociar números a letras debería de salir algo:

cggimatgmsvwkdaidpozhrxpdwil

Evidentemente no podía ser tan fácil …

Hacemos después las 25 combinaciones de código césar a ver si sale algo más legible:

bffhlzsflruvjczhconygqwocvhk
aeegkyrekqtuibygbnmxfpvnbugj
zddfjxqdjpsthaxfamlweoumatfi
ycceiwpciorsgzwezlkvdntlzseh
xbbdhvobhnqrfyvdykjucmskyrdg
waacgunagmpqexucxjitblrjxqcf
vzzbftmzflopdwtbwihsakqiwpbe
uyyaeslyeknocvsavhgrzjphvoad
txxzdrkxdjmnburzugfqyiogunzc
swwycqjwcilmatqytfepxhnftmyb
rvvxbpivbhklzspxsedowgmeslxa
quuwaohuagjkyrowrdcnvfldrkwz
pttvzngtzfijxqnvqcbmuekcqjvy
ossuymfsyehiwpmupbaltdjbpiux
nrrtxlerxdghvoltoazksciaohtw
mqqswkdqwcfgunksnzyjrbhzngsv
lpprvjcpvbeftmjrmyxiqagymfru
kooquibouadesliqlxwhpzfxleqt
jnnpthantzcdrkhpkwvgoyewkdps
immosgzmsybcqjgojvufnxdvjcor
hllnrfylrxabpifniutemwcuibnq
gkkmqexkqwzaohemhtsdlvbthamp
fjjlpdwjpvyzngdlgsrckuasgzlo
eiikocviouxymfckfrqbjtzrfykn
dhhjnbuhntwxlebjeqpaisyqexjm

Como se puede ver … no hay absolutamente nada con un mínimo de sentido…

A partir de aquí anduvimos mirando prácticamente todos los códigos de cifrado simple que pudimos encontrar por internet intentándolos asociar a números del 1 al 26.

De todos los que vimos, tras bastantes horas, hubo un par en concreto que nos llamó especialmente la atención porque podían tener algo de sentido para lo que teníamos. Se trataba de:

Numbered Key y Rag Baby

https://www.cryptogram.org/downloads/aca.info/ciphers/NumberedKey.pdf

https://www.cryptogram.org/downloads/aca.info/ciphers/Ragbaby.pdf

La primera, básicamente, lo que propone es asociar números a letras individuales, pero no tal y como hemos hecho al principio (A=1, B=2, … Z=26) sino añadiendo una clave al inicio y luego completando el abecedario (extendiendo la clave) con las letras que no estuvieran en esta clave; por ejemplo:

Clave: euskalencounter

Clave extendida: euskalencounterbdfghijmpqvwxyz

Ahora asociamos cada letra a un numero:

EUSKALENCO  U  N  T  E  R  B  D  F  G  H  I  J  M  P  Q  V  W  X  Y  Z
12345678910 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Aunque haya números asociados a letras que ya estaban previamente asociadas a un número, es irrelevante para este cifrado (p.ej. el 1 y el 7 representarían ambos una E).

Este cifrado tiene un problema para nuestro caso en cuestión … y es que requiere de una clave de la cual no sabemos nada porque no se nos dice nada de claves en ningún sitio.

Probamos no obstante varias opciones de claves a ver si había suerte:

Captura de pantalla 2020-07-28 a las 11.21.21.png

Pero no, no la hubo…

Si os fijáis, llegamos hasta a utilizar la password de “un nivel diferente” (o sea, la password del solve it 2).

Por aquí no parecía haber salida …

Aun así, la noche del sábado antes de irme a dormir dejé la siguiente iteración funcionando mientras dormíamos … por ver si sonaba la flauta:

Captura de pantalla 2020-07-28 a las 11.36.16

Lo que hace ahí es una permutación random de la variable abc (la variable ‘abc’ si habéis visto arriba es un string con el abecedario en orden ‘abcd….xyz’),

[NOTA: y aquí os preguntaréis …”¿por qué una permutación random y no todas una a una?” aunque todas son (26!, es decir  4.032914611266057e+26) y os diré… “pues porque intenté hacer las permutaciones de todo el abecedario y el pc me sacó el dedo” así de simple, así que era la solución más rápida xD],

luego lo que hace es usar la clave que nos dan en el enunciado del solveit (que es la tira de números del level (3, 1, 7, 9 …, 4, 12) para formar la frase en base a esa key creada y finalmente …. (ojo que aquí se viene la inventadita …) si por algún casual en la cadena que nos sale como resultado está la palabra “coded” o “troll”, que me la muestre por pantalla. ¿Y por qué “coded” o “troll”? A ver, que nos conocemos ya … imo … xDDD

Bueno, que sea un método de mierda, no lo voy a discutir, y más presuponiendo que en la contraseña va a haber una palabra que sea ‘troll’ y/o una que sea ‘coded’, pero bueno, lo dicho, por si sonaba la flauta …

A la mañana siguiente … habiamos obtenido un mogollonazo de frases … y ninguna con ningún sentido completo (pongo extracto de algunas de ellas):

Captura de pantalla 2020-07-28 a las 11.42.41

A ver, sinceramente, esto no tenía ninguna pinta de que fuera a funcionar pero bueno, era gratis probarlo, asi que … 😛

La otra opción de cifrado que nos detuvimos a mirar un poco fue Rag Baby. Pero aquí tuvimos un problema parecido al inicial (o eso pensamos) y es que no teníamos ninguna key sobre la que partir; y por eso nos centramos mucho más en la Numbered Key.

El cifrado Rag Baby, consiste en tener una clave, como en numbered key, pero en esta ocasión no se puede repetir ninguna letra:

Clave: abcdefghijklmnopqrstuvwxyz

Y para cifrar el mensaje, se parte de la letra que te interesa y se va corriendo a la derecha en orden numérico simple. Para entendernos, por ejemplo:

Mensaje a Cifrar: menudo lio montamos

menudo lio montamos
123456 234 345678910

La primera letra es una 'm', vas a la clave, buscas la 'm' y 
seleccionas la letra que este '1' posición a la derecha => n
La segunda es una 'e', buscas y es una g
etc..

Cuando saltas a la palabra siguiente, la asociación numérica 
no vuelve a empezar de 1, sino que empieza con 2 y así 
sucesivamente ..

Este cifrado lo acabamos desechandoal final porque el resultado cifrado que obtenemos son letras y lo que nosotros tenemos en el enunciado son números…

Fue un error por nuestra parte no dedicar más de 10 minutos a este sistema de cifrado ya que habríamos encontrado la forma de adaptarlo a lo que teníamos para obtener la solución, ya que como veréis, el fundamento del cifrado que usó imobilis es el mismo que el de este Rag Baby.

Como digo, este último cifrado puede que fuera lo más cerca que estuvimos de solucionar el problema. El cifrado que se usa es la codificación Delta.

Este consiste en tener un listado de letras, como la clave del cifrado anterior (solo que aquí además introdujo la ‘ñ’ para trolear un poco…), en un determinado orden (en este caso en orden alfabético), y en base a una lista de números (que es lo que nos da imobilis en el enunciado), ir seleccionando las letras de izquierda a derecha, pero, lógicamente, sin partir de la ‘a’ cada vez que vayas a escoger la siguiente letra; es decir, sería:

Tenemos lo siguiente:
a b c d e f g h i j k l m n ñ o p q r s t u v w x y z
3 1 7 9 7 4 9 16 13 15 1 26 20 8 7 18 13 24 19 16 22 4 23 23 11 9 4 12

Empezamos a descodificar:
Partimos desde la 'a':

Primero vemos un 3, lo que significa: 3 a la derecha desde la 'a' => d
Luego tenemos un 1 => 1 posición a la derecha desde la 'd' => e
7 => 7 posiciones a la derecha desde la 'e' => l
9 => 9 a la derecha desde la 'l' => t
7 => 7 a la derecha desde la 't' => a (después de la 'z' vuelve la 'a')
4 => 4 a la derecha desde la 'a' => e
9 => 9 a la der... => n
16 => c
13 => o
etc 
.... 


Y así, tenemos finalmente la flag del nivel:

deltaencodedwelcometosolveit

 

 

Solve-It EE28 : Nivel 2 “Handle with care”

Vamos con el segundo nivel, que realmente fue el que primero resolvimos.

SolveIt_02

Una imagen acompañaba a este enunciado:

level_2

Imobilis comentó al final de la competi que fue el nivel más “físico” que se le pudo ocurrir para esta edición tan raruna de la Euskal. Estuvo chulo.

Bueno, para empezar, nosotros estábamos sin tinta de impresora así que utilizamos un software de edición de imagen para recortar e ir montando el puzzle:

image_2020-07-27_21-30-08

Por otro lado, otro compi en casa se lo imprimió y se puso a montarlo:

photo_2020-07-27 20.55.48

Con estas 2 vertientes en marcha y haciendo uso de una comunicación y sincronización épica vía telegram a base de fotografías y capturas de la evolución de cada uno de las 2 versiones, solucionamos el puzzle:

image_2020-07-27_21-04-01

La contraseña está en la parte superior. El texto inferior de “Fulfilled and delivered by Systroll” fue lo que primero vimos y probamos como password pero no, fue troleadita de imo.

Captura de pantalla 2020-07-27 a las 21.35.42

Ahí se puede apreciar el mensaje más o menos… Echando mano un poco de imaginación y probando un par de passwords dabamos con la solución:

mult1p4rt m3ssage 1n phys1c4l f0rm4t

 

 

PD: Gracias por ese “Case_sensitive = False” imobilis xDDD

 

Solve-It EE28 : Nivel 1 “無人島へようこそ!”

Pues aquí estamos otro año más con los SolveIt de esta edición (un tanto especial) de la Euskal Encounter.

SolveIt_01

Bueno, un nivel 1, no puede ser muy difícil …

Siete animales de animal crossing y el título del solveit en Japonés -> esto tienen que ser los nombres de los personajes en Japo o algo así (fue lo que pensamos … y era lo correcto efectivamente, pero tuvimos un par de patinazos que nos retrasaron casi un día en la resolución xD)

El primero de los patinazos fue que la web donde un compi miró los nombres de los personajes, era la página fandom española y tenía un gazapo, que a día de hoy 27 de Julio, ya han corregido:

Captura de pantalla 2020-07-27 a las 20.06.53

… Inicialmente (o sea hasta ayer, 26 de Julio) le faltaba la última letra al nombre ( しず ). Aqui podéis ver el fallo cuando me lo pasó el compi via telegram:

Anotación 2020-07-29 144828

La verdad es que con este tipo de cosas solemos hacer un par de pruebas antes de darnos por vencidos (y má siendo nombres japoneses), así que volví yo a probar desde mi ordenador… y por supuesto hice otra liada…

Copiando los nombres de la web (yo usé la inglesa que sí que tenía correctos los nombres) metí uno repetido sin darme cuenta, cómo no… Aquí el documento de texto de pruebas que uso, de la liada en cuestión … :

Captura de pantalla 2020-07-27 a las 20.28.04.png

(Como se ve, el 2º y 4º nombre son iguales)

El tema es que después de estas 2 intentonas fallidas, que presuntamente tenían que haber sido las correctas, nos desviamos por la tangente y empezamos a pensar cosas de las más variopintas para la solución de este primer nivel: que si número de razas de la isla desierta, cantidad de animales de la misma raza, frases iniciales de cada personaje, ropas, música preferida de los personajes, …

Llegado un punto en el que no veíamos salida alguna para este nivel … optamos por empezar a hacer caso al nivel 2. De hecho, sacamos el nivel 2 antes que éste … xD

Al día siguiente a primera hora y recién levantado dije… “bueno, voy a probar otra vez con kalman a poner los nombres de estos bichos en orden, que no estoy para pensar mucho a estas horas …”

Efectivamente…. a la tercera va la vencida que se suele decir … ¬¬

キャビア  ジョッキー  イッテツ  たぬきち  エテキチ  しずえ  グレオ

 

 

Hack-It 2015 : Nivel 1 “Expresionismo”

Vamos con un hackit de los sencillitos que tenía por ahí en el tintero. Se trata del siguiente:

Hackit_01.PNG

Expresionismo… regularidad … tiene toda la pinta de que algo va a tener que ver con expresiones regulares este tema …

Vamos a editar el código fuente a ver que hay, que en los hackits, sobre todo los iniciales, casi siempre hay que hacerlo.

Hackit_02.PNG

Bueno, pues ahí tiene toda la pinta de que hay algo con lo que tendremos que pelearnos… Vamos a pasarle el beutifier para ver un poco más bonita ese trozo de código:

Hackit_03.PNG

Podemos ver que se define un parámetro de color de background en base a lo que parece una expresión regular … (estaba claro, dado el título del hackit…).

De hecho, hay varias expresiones regulares en la misma línea, con lo que se han de cumplir todas para que ese color de background que se programa en el css se vuelva verde:

Hackit_04.PNG

#8f8 = verde

#f88 = rojo

Total, separamos las expresiones regulares para ver qué pinta tienen:

/(.)(.)(.)(.).[h4x0r].[G1rlZ]\4[xyzzy]\3\1\2.$/
/^[bEc].[hACKs]*.[sTUPiD][u53rs].{2}[t4bl3ts].{5}$/
/^.[t4x].{2}[fr33].{3}[b4nG].[bUx]/
/^[^c0mPUtEr].[v1rUs3s][4TT4cK].[F4C3TR0LL].(.).\1.{2}[(-:].\1$/

Bueno, antes de continuar … vamos a decir un poco de qué va esto de las expresiones regulares… que recuerdo que cuando vi en la Euskal este hackit no sabía ni de qué se trataban las expresiones regulares ni mucho menos de que existiesen xD.

Un compi muy amablemente me explicó de qué iba el asunto, para qué servían y por supuesto resolvimos el problema, que a modo ejemplo me vino bastante bien para entenderlas … 😉

Una expresión regular son una serie de caracteres que definen un patron que se utiliza para buscar las coincidencias en un texto. Un ejemplo sencillo sería: para localizar la palabra “hola” dentro de un texto la expresión regular sería /hola/. Este ejemplo sería muy básico ya que luego hay operadores y caracteres especiales que ponen condiciones para la búsqueda, que hacen de que la herramienta sea realmente potente…

Hay mucha documentación al respecto de esto en internet así que tampoco voy a explicar nada en detalle sobre cómo funcionan las expresiones regulares (… de las cuales realmente no soy un experto ni mucho menos tampoco…). Aquí dejo una URL con un minicurso sobre el tema:

https://regexone.com/lesson/introduction_abcs

Así que vamos al grano.

La contraseña correcta, supuestamente, ha de cumplir las 4 expresiones regulares que nos da marcan así que vamos a empezar… pero no con la primera ya que ésta no nos define el inicio de la cadena de texto, sino con la segunda:

/^[bEc].[hACKs]*.[sTUPiD][u53rs].{2}[t4bl3ts].{5}$/

Una expresión regular que empieza con “/^” nos indica precisamente esto que he dicho: el comienzo de la cadena de caracteres, por eso he elegido esta como la primera a analizar, ya que la que está originalmente la primera, es esta:

/(.)(.)(.)(.).[h4x0r].[G1rlZ]\4[xyzzy]\3\1\2.$/

no comienza con el símbolo “/^”, con lo que nos está dando la expresión regular con sus restricciones… pero no nos asegura realmente que empieza con ese ‘(.)’.

Así pues, si desmenuzamos la expresión regular poco a poco tenemos:

/^ : comienzo de la palabra clave/contraseña del nivel

[bEc] : esto indica que el siguiente será el carácter ‘b’, ‘E’ o ‘c’ (uno y sólo uno: en las expresiones regulares lo que haya entre corchetes ‘[‘, ‘]’ indica 1 único carácter de los que hay en su interior. Además ojo, mayúsculas y minúsculas aquí se tienen en cuenta: una ‘E’ es diferente de una ‘e’).

. : un punto en una expresión regular significa cualquier caracter o número

[hACKs]* : esto indica que despues habra una ‘h’, ‘A’, ‘C’, ‘K’ o ‘s’ … Pero luego hay un ‘*’, el cual significa que puede haber después tantas ‘h’, ‘A’, ‘C’, ‘K’ o ‘s’ como sean (incluso 0!!), no únicamente 1 como el caso anterior. Esto nos va a indeterminar el tamaño completo de la clave del nivel … Pero bueno, lo acotaremos más tarde con el resto de expresiones regulares…

[sTUPiD] : Lo mismo que antes entre esas 6 letras.

[u53rs] : Lo mismo de nuevo entre esos caracteres…

.{2} : cuando tenemos un numero entre llaves ‘{‘, ‘}’ significa que lo que hay antes se repite ese numero de veces; es decir, un ‘.{2}’ es igual que ‘..’, así que tenemos luego 2 caracteres cualesquiera

[t4bl3ts] : Lo mismo … uno de esos 7 caracteres …

.{5} : esto seria lo mismo que ‘…..’ como he dicho hace un momento …

$/ : Finalmente esto, significa que acaba la expresion regular y por tanto nuestra contraseña. El dolar ($) es el que indica el final.

Así pues, después de esta primera expresión regular, si asignamos a una fila cada uno de los caracteres posibles de la password tendriamos:

Hackit_13.PNG

Donde he puesto los ?? pueden ser que haya mas letras o incluso ninguna, incluyendo el “hACKs” ! (el * significa que puede que haya 0 caracteres de los especificados como he dicho anteriormente…)

Vamos con la siguiente expresíon regular:

/^.[t4x].{2}[fr33].{3}[b4nG].[bUx]/

Como podemos ver, esta nos define también el incio… pero sin embargo no el final (no hay un ‘$/’ al final de la misma). Aun así, vamos a analizarla igualmente:

/^ : Comienzo de la expresión regular y contraseña del nivel

. : Un caracter cualquiera

[t4x] : uno de estos caracteres

.{2} : 2 caracteres cualquiera

[fr33] : uno de estos caracteres

.{3} : 3 caracteres cualquiera

[b4nG] : uno de estos caracteres …

. : Un caracter cualquiera

[bUx] : y finalmente uno de esos caracteres entre corchetes

después ya no hay más pero no significa que la contraseña no acabe. Lo añadimos a lo que ya teniamos:

Hackit_05.PNG

Hay que tener en cuenta que no tienen por qué coincidir las letras de cada columna más allá de la 4 fila…

Vamos con la siguiente, que esa si, por fin, nos define el tamaño total de la contraseña:

/^[^c0mPUtEr].[v1rUs3s][4TT4cK].[F4C3TR0LL].(.).\1.{2}[(-:].\1$/

/^ : Comienzo

[^c0mPUtEr] : esto nos indica que hay un caracter, pero a diferencia del que no tiene un ‘^’ (cualquiera de las anteriores que hemso visto hasta ahora) nos dice que es un caracter que NO es ninguno de los listados; es decir, no es una ‘c’, ni un ‘0’, ni una ‘m’, etc…

. : cualquier caracter…

[v1rUs3s] : cualquier caracter de los que hay entre corchetes…

[4TT4cK] : idem …

. : cualquier caracter…

[F4C3TR0LL] : cualquier caracter de esos…

. : cualquier caracter…

(.) : ojo que vienen curvas … esto significa al igual que el ‘.’, que se trata de cualquier caracter, pero al indicarlo entre paréntesis indica que ese carácter lo queremos “capturar”. Ahora veremos para que.

. : cualquier caracter…

\1 : Y aquí viene el complemento de usar los paréntesis para capturar. Este ‘\1’ significa que este carácter se trata del mismo que estuviera entre ‘(‘, ‘)’. Es decir, en este caso, este carácter y el de “hace 2” han de ser el MISMO.

.{2} : 2 caracteres cualquiera…

[(-:] : 1 de esos elementos entre corchetes… como siempre…

. : 1 carácter cualquiera…

\1 :  Y de nuevo, este será el mismo caracter que habrá entre los paréntesis anteriores.

$/ : Y se acabó. Y con esto ya podemos definir el tamaño de la password!

Colocamos primero lo que hemos sacado de esta expresion regular:

Hackit_06.PNG

Ahora podemos ajustar las lineas de la primera columna a la última, ya que sabemos que tanto la primera como la ultima columna acaban y además han de hacerlo en la misma posición (la password tiene que ser la misma => misma longitud…):

Hackit_07.PNG

Y bueno, finalmente vamos con la ultima expresión regular a ver qué nos dice:

/(.)(.)(.)(.).[h4x0r].[G1rlZ]\4[xyzzy]\3\1\2.$/

Como vemos no empieza por el principio de la password en sí, pero sí que termina justo al final de la misma (lo vemos porque acaba en ‘$/’). Vamos a ello:

(.) : Un caracter cualquiera que además capturaremos (luego nos podremos referir a él con ‘\1’ como hemos visto antes.

(.) : Lo mismo, otro caracter cualquiera que capturaremos y luego nos podremos referir a él con ‘\2’ (ya que es la “segunda captura”).

(.) : Y lo mismo con el tercero …

(.) : … y cuarto carácter

. : Luego tenemos un caracter (esta vez sin capturar).

[h4x0r] : Luego ha de ser uno de estos 5

. : Luego tenemos otro carácter.

[G1rlZ] : Luego otro de estos 5 …

\4 : esto indica que el 4º caracter capturado ‘(.)’ anteriormente es el mismo que habrá aquí.

[xyzzy] : Despues habrá una de estas 5 letras, que sí, están repetidas algunas; es trivial.

\3 : el 3er carácter capturado con los paréntesis será el mismo que ocupe esta posición …

\1 : Lo mismo con este, pero siendo el primer carácter capturado

\2 : Y lo mismo con este pero el 2º…

. : Luego tenemos a otro carácter cualquiera …

$/ : Y finaliza la expresión regular …

Así que con estas restricciones a ver si se puede formar la contraseña del nivel… Recordemos que tenemos que ajustar esta expresión regular comenzando por el final (ya que tenemos el ‘$/’ pero NO nos indica el ‘/^’) y nos quedaría asi:

Hackit_08.PNG

Pues empecemos por la primera letra (primera linea): tenemos que tiene que ser una de estas tres letras: “bEc” y que NO puede ser ninguna de “c0mPUtEr” => la ‘c’ y la ‘E’ no pueden ser, pero sí que lo será la ‘b’. Ya tenemos la primera letra entonces: ‘b

Siguiente: Pues de la siguiente línea solamente disponemos de esta información: es una de estos 3 caracteres: “t4x”. Y ahora viene lo que parece un troleito de marcan … Si nos fijamos, de la 4ª expresión regular vemos que lo sea este carácter, ha de ser lo mismo que haya en la 3ª posición empezando por la última letra Y además tiene que ser un carácter de entre ‘(‘, ‘-‘ ó ‘:’ como nos indica la 3ª expresión regular:

Hackit_09.PNG

Es evidente que aquí algo no cuadra… no puede ser un caracter de entre estos tres: “t4x” y a su vez de entre estos otros tres: “(-:” … Lo dejaremos para luego porque parece lo dicho, un trolleo de marcan …

Sigamos pues con el tercer carácter, que tendrá que ser uno de los que esté en “hACKs” y también ha de estar en “v1rUs3s”; es decir, únicamente puede ser la ‘s‘. Y además, podemos sacar que la ‘s’ también será el penúltimo carácter (debido a la última expresión regular.

El cuarto tendrá que estar en “hACKs” y “4TT4cK” => ‘K‘. Que, de forma similar al anterior, estará en la 4ª posición empezando por el final.

El quinto tiene que ser un caracter de “fr33” y además nos pone la última expresión que es la captura numero 4 utilizada unas posiciones más adelante con lo que realmente nos está indicando también que ha de ser uno de entre “t4bl3ts”: es decir, tenemos un ‘3‘:

Hackit_10.PNG

(Luego de aquí sacaremos que tres posiciones más adelante tendremos también un 3 debido a ese (=1) ).

El sexto carácter es simplemente el solape de “sTUPiD” y “F4C3TR0LL”, es decir, una ‘ T ‘.

Lo mismo con el séptimo: “u53rs” y “h4x0r” => ‘r‘.

En la siguiente en la que tenemos el (=1), como he dicho hace un par de párrafos, tendrá que ser un ‘3‘.

El noveno “b4nG” y “G1rlZ” => ‘G

El décimo carácter ha de ser el mismo que hemos sacado antes de “t4bl3ts” y “fr33” así que aquí irá un ‘3‘.

Undécimo: “bUx” y “xyzzy” => ‘x‘.

Duodécimo carácter: aquí solamente tenemos la información de que es (=3) de la última expresión regular así que será el mismo que el cuarto carácter: ‘K

Hackit_11.PNG

El decimotercer carácter, como he dicho anteriormente, creo que es un troleito de marcan … lo vamos a dejar para lo último…

El decimocuarto será el mismo que el tercero (debido a la última expresión regular) => ‘s

Y por fin, el decimoquinto y último carácter, podemos deducir de la tercera expresión regular que es igual al generado de “t4bl3ts” y “fr33”, es decir, el ‘3‘:

Hackit_12.PNG

Si ponemos todo junto tenemos:

b ? sK3Tr3G3xK ? s3

Donde he puesto los ‘?’ es donde está la confusión (aka: troleada de marcan), pero bueno, vistas las opciones que hay creo que está bastante claro que el carácter que faltaría es un ‘4’; de ‘t4x’ es lo que más cuadra ya que sale:

b4sK3Tr3G3xK4s3

(basket regex case)

 

 

 

 

 

Solve-It EE27 : Nivel 3 “Uphold The Rules”

Este solveit la verdad es que era considerablemente más fácil que el 2 …

No tengo ninguna captura del enunciado; me lo pasaron directamente en fichero de texto … (era muy largo …..)

Solve It 3: Uphold The Rules
by marcan • Resuelto por 8 usuarios

NORMAS GENERALES DE PARTICIPACIÓN

Es importante leer estas normas y ser conscientes de ellas durante el transcurso de la party. El hecho de acceder al recinto implica vuestro conocimiento y aceptaciòn de las mismas.

LA ORGANIZACIÒN

La party un evento que, a pesar de estar patrocinado por diferentes entidades, se lleva a cabo de la mano de voluntarios que componen la Organización. Dichos voluntarios, como organizadores, velan por el correcto funcionamiento de todos los aspectos del evento. Como tal, han de supervisar las actividades, los servicios prestados, y cualquier aspecto que pueda afectar a los usuarios. Entre sus labores está, no sólo las orientadas a garantizar los derechos de los participantes, sino también las que tienen como objeto el hacer que se cumplan las normas que a continuaciòn se detallan. Todos y cada uno de los organizadores cuentan con autoridad y respaldo de la Organización para llevar a cabo las acciones que consideren oportunas para garantizar el cumplimiento de las normas o la aplicaciòn de las sanciones correspondientes. No obstante, existe la figura de responsable de seguridad que estará debidamente identificado y que velarà por el cumplimiento de estas normas y asistirà al usuario ante cualquier eventualidad que pudiera producirse.

Se prohìbe el uso de identificativos de la Organizaciòn a aquellas personas que no pertenezcan a la misma. Todo aquel que se haga pasar por miembro de la Organizaciòn (portando la camiseta característica o de cualquier otra manera) podrà ser sancionado.

Está igualmente prohibido portar camisetas de la organizaciòn de años anteriores sea cual fuere la forma de la que se ha obtenido la misma.

EL RECINTO

El lugar de celebración del evento es alquilado a terceros debido a la idoneidad de sus instalaciones, su ubicaciòn, su tamaño, y sus facilidades de acceso. Si bien la Organizaciòn intentará en todo momento atender las demandas de los usuarios, existen ciertos servicios que quedan fuera de su alcance, y bajo la responsabilidad del propio arrendador. El trato de la Organización con el arrendador es fluido y constante, y estas demandas son, normalmente trasladadas y atendidas con celeridad.

Por otro lado, todo el material necesario para montar la party también nos ha sido alquilado. Esperamos que cada uno sepa la importancia que tiene el dejar todo el material del mismo modo en que lo encontrò.

HORARIOS y ACCESOS

El recinto permanecerà abierto 24 horas al día ...
.........

Y bueno, el texto continúa pero no voy a copiarlo todo porque como digo es excesivamente largo.

Como vemos se trata del texto de las normas de la party. Al texto orignal (porque este estará modificado) se puede acceder en estar URL:

https://ee27.euskalencounter.org/normas-generales-de-participacion.html

Sin pensarlo mucho, se puede deducir que lo que hay que hacer es comparar el texto del enunciado con el texto original (de la url anterior) ya que seguro que tiene que haber alguna diferencia…

solveit_3_01.PNG

solveit_3_02.PNG

Y efectivamente, no sé si se aprecia mucho en la imagen anterior, pero parece que las diferencias están, básicamente, en la forma de los acentos de las palabras acentuadas: unos acentos son normales ‘´’ (las del texto original) y las del texto modificado de marcan son tildes invertidas ‘`’.

Además a partir de cierto punto (en torno a la linea 130), deja de haber estas diferencias:

solveit_3_04.png

Después de ver esto, lo primero que se podría hacer es coger cada palabra con el acento invertido y quizá, utilizando la primera letra de cada una, puede salir alguna frase que sea la clave; pero enseguida se ve que esto no es así…

Aceptación; Organización; Continuación; Aplicación; Velará; Asistirá; Prohíbe; Organización, Organización, Podrá …..

AOCAVAPOOP……….

… no tiene pinta de que vayan por ahi los tiros …

Ahora bien, si nos fijamos en las palabras acentuadas, vemos que no todas las palabras que están acentuadas en el texto tienen el acento invertido:

solveit_3_03.png

Por ahí tiene que ir la cosa …

Así pues, con esto, la segunda teoría podría ser … ¿y si asociamos 1’s y 0’s a todas las palabras acentuadas, dándoles un 0 a las acentuadas normales (por ejemplo) y un 1 a las que tienen acento invertido?

Como hay muchas y soy un poco vago, voy a hacer en un momento un script en Octave que lo haga por mí.

De primeras, vemos que éste no se lleva muy bien con las letras acentuadas (tanto los  acentos normales como los invertidos) a la hora de leer el texto desde un fichero:

solveit_3_05.png

Visto esto, vamos a optar por un camino intermedio rápido y sencillo:

ya que existen dos tipos de acentos, vamos a sustituir las vocales con acentos invertidos por el valor del 1 y las vocales con acentos normales por el valor 0, todo ello directamente en el fichero de texto y con un simple (o mejor dicho, varios) “Reemplazar” de toda la vida…

Hay que tener en cuenta que hay que hacerlo con las letras mayúsculas y minúsculas… y que además puede haber 0’s y 1’s antes de hacer las sustituciones, así que hay que reemplazar primero también todos los 1’s por cualquier letra o carácter y lo mismo con los 0’s…

 

Hecho esto, y con el siguiente script concatenamos los 1s y 0s según van apareciendo:

solveit_3_08.png

Y obtenemos la siguiente tirada de 1s y 0s:

‘01100001010111110101011000110011011100100111100101011111010001110011001101101110011010010101010101110011010111110111001101110100001100110110011100110100011011100011000001000111010100100011010001110000011010000101100101011111010100110110001101001000001100110110110100110011001000010010000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000’

De la cual …. evidentemente sobran los últimos 0s ya que a partir de la linea 130 o así del texto, como dije al principio, desaparecen los acentos invertidos.

Y ahora, si introducimos este valor binario (hasta el último 1) en cualquier conversor de binario a ascii obtenemos:

solveit_3_09.png

a_V3ry_G3niUs_st3g4n0GR4phY_ScH3m3!!

 

 

 

 

 

Solve-It EE27 : Nivel 2 “Complex Input”

A este nivel le dediqué bastante tiempo porque realmente, siendo un nivel 2 y pareciendo tan sumamente fácil, asumí que no me llevaría demasiado tiempo:

Solveit_2_2019

“Complex Input”… Números del 0 al 9 (curioso que no haya 5’s), junto con asteriscos (*) y almohadillas (#) … Canta bastante a un teclado de teléfono ……. sin embargo, el problema es … ¿¿qué coj**** son esas flechas??

Lo primero que pensé fue en los tonos DTMF (Dual-Tone Multi-Frequency) que podrían generar las pulsaciones de esas teclas … pero seguía existiendo la incertidumbre de … ¿y las flechas?

Si miramos un poco la wikipedia al respecto, los tonos DTMF tienen 4 botones adicionales: A, B, C y D, que podrían asociarse con las flechas … ¿y por qué no?

Si buscamos por internet encontramos una pequeña web donde, introduciendo en un campo de texto las teclas que queremos pulsar, nos saca la música que genera. Concretamente esta web:

https://www.audiocheck.net/audiocheck_dtmf.php

Si introducimos todos los caracteres que nos da marcan (como digo, asociando las flechas, un poco a huevo, a los tonos de los botones A, B, C y D) lo que sale … mayormente no tiene NINGÚN sentido ni parecido con nada … así que … camino equivocado …

Posteriormente se me ocurrió que el tema de las flechas podría ser que al presionar la tecla correspondiente, se podría mantener pulsada y la flecha te indicaría hacia dónde desplazarte para sacar algún carácter especial (cosa bastante típica en los móviles modernos y tal …) pero es que … si estamos hablando de móviles DTMF … no tiene ningún sentido …

A partir de aquí dejé un poco abandonado este solveit porque no sabía muy bien qué más caminos tomar con el tema de las flechas … así que decidí seguir con el solveit 3.

Más adelante, concretamente ayer, consultando con una compañera de la competición (que sí que estuvo en la party) me comentó que efectivamente se trataba de un teclado de teléfono, pero un poco especial …. muy en la línea de marcan: teclado japonés.

Con esta información empecé a buscar (esta misma mañana) teclados japoneses en móviles nokia… y los hay… pero… estamos con el mismo problema con el tema de las flechas !! ¿qué hago con ellas?

Luego se me ocurrió coger mi teléfono y añadirle el teclado japonés… y qué sorpresa cuando me topo con esto:

TecladoJapones_01

… y más aún cuando al presionar y mantener una de las teclas me aparecen 4 posibilidades adicionales:

TecladoJapones_02.PNG

Así que ya tengo una posible solución para el tema “flechas” …

Ahora, y asumiendo que del 1 al 9 las teclas van de arriba hacia abajo y de izquierda a derecha:

TecladoJapones_03.PNG

Podemos generar el texto que nos dice marcan… y sale lo siguiente:

ぱぺぴぷぺぽぱぽろまんちっく
ぱぺぴぷぺぽぱぽこすもちっく
そうぞうりょくからはじまる
いま!いま!いま!

Que esencialmente no sé qué significa pero para eso está el traductor de google …

Traduccion.PNG

… dramático … no hay por dónde pillarlo …

Iba a darme por vencido pero he pensado … “voy a poner la primera linea del texto en google a ver que sale” …

Me han salido varios enlaces a vídeos japoneses:

Captura_Google.PNG

Sinceramente, no tenía ninguna esperanza en ellos pero aún así, me he puesto a verlos, empezando por el primero.

He comenzado a verlo SIN sonido (porque ya digo que pensaba que estaba perdiendo el tiempo…). Sin embargo, los vídeos tienen subtítulos y curiosamente (y por suerte he de decir…) me he fijado justamente en un fotograma que contenía lo siguiente:

subsJapones.jpg

Me he dado cuenta de que esos caracteres eran los mismos que los de la última frase del mensaje en japonés:

いま!いま!いま!

Mucha casualidad para ser coincidencia (como otras muchas veces).

Es entonces cuando me he puesto los cascos y he oído que la canción decía exactamente lo mismo que el texto traducido:

Traduccion_02.PNG

y dado que en el solveit pone al final de la ultima frase un ” ….?” podría ser la password la palabra que dicen después? :

imagination

Y digo “podría ser” … porque no sé realmente si es la correcta!!!! (como digo, no asistí a la Euskal este año) Que me lo confirme marcan o algún asistente que lo haya resuelto 😛

editado: marcan ha comentado que la respuesta es correcta. Y que además, se aceptaba la palabra también en japonés:

イマジネーション

 

 

Solve-It EE27 : Nivel 1 “Got Space?”

Pues aquí estamos de nuevo … y pese a que este año no he pisado la party 😥 …. sí que me han ido pasado algunos de los solve-it… 🙂

Así que vamos con el primero que es el más sencillo, y además en este caso, muy corto y casi no necesita explicación:

SolveIt_1_2019.jpeg

Como vemos son unas cuantas imágenes del espacio … => google imagenes …

Así pues, si nos ponemos a buscarlas nos vamos encontrando con que son, en su mayoría, de galaxias, nebulosas y demás con nombres como M63, Canes Venatici, NGC 1566, etc …

Hay quien podría pernsar (como hice yo) que lo que hay que hacer es coger la inicial de cada uno de los nombres de las mismas y de ahí formar lo que sería la password, pero no … es bastante más simple … Y me di cuenta según iba buscando cada una de las imagenes para en google.

Cada una de las imágenes originales tienen en común que sido tomadas por el mismo telescopio …

Hubble