HackIt 2024 / EE32 / Level 2

El level 2 sigue estando entre los clasificados como muy fáciles.

https://ikasten.io/ee32/hackit/level2/level2.html

Igual que en el level anterior, analizamos qué operaciones se llevan a cabo para comprobar que el password introducido es correcto (al final se compara con un string concreto: umcjqhmdohdzchm)

$(document).ready(function(){$("#password").keyup(function(o){
r=$("#password").val();function num(s){x=s+'';y=x.charCodeAt(0);if(0xD800<=y&&y<=0xDBFF){q = y;if(x.length === 1){return y;}z=x.charCodeAt(1);return ((q - 0xD800)*0x400)+(z - 0xDC00)+0x10000;}if(0xDC00<=y&&y<=0xDFFF){return y;}return y;}
d="txhupnqbgvzyjvfbadnzkmytwdauwpeeojiowkzrmrnxlxcsskbjtrifhlomldsivceyqggphcfqua";c=0;o="";for(var i=0;i<r.length;i++){c=(num(r.charAt(i))+c)%78;o+=d.charAt(c);}
$("#password").css({"background-color":o == "umcjqhmdohdzchm"?"#8f8":"#f88"});
});});

y revertimos el proceso:

def num(s):
    x = s + ''
    y = ord(x[0])
    if 0xD800 <= y <= 0xDBFF:
        q = y
        if len(x) == 1:
            return y
        z = ord(x[1])
        return ((q - 0xD800) * 0x400) + (z - 0xDC00) + 0x10000
    if 0xDC00 <= y <= 0xDFFF:
        return y
    return y

d = "txhupnqbgvzyjvfbadnzkmytwdauwpeeojiowkzrmrnxlxcsskbjtrifhlomldsivceyqggphcfqua"
target = "umcjqhmdohdzchm"
c = 0

password = []

for char in target:
    target_index = d.index(char)
    for potential_char in range(32, 127):  # ASCII printable range
        temp_c = (num(chr(potential_char)) + c) % 78
        if temp_c == target_index:
            password.append(chr(potential_char))
            c = temp_c
            break

password = ''.join(password)
print("The password is:", password)

Curiosamente, aquí pedimos que se revisara la prueba, porque obteníamos claves válidas (esta prueba mostraba el input text de la página en verde cuando introducías una clave que pasaba las validaciones correctamente) que el servidor no aceptaba al enviarla. Desde la org nos atendieron enseguida y modificaron el level para que diera por buena cualquier clave que pasara correctamente las validaciones.

HackIt 2024 / EE32 / Level 1

Briefing del HackIt/SolveIt 2024

Un año más (y van unos cuantos, desde la Euskal VII) hemos vuelto a participar en el HackIt. Este año venía con novedades importantes: Marcan cedía el testigo a OntzA (Xabier Eizmendi, a la izquierda de la foto) de NavarParty, que junto a Imobilis (Juan Traverso, derecha), han organizado una excelente edición.

Había más retos y más diversidad en las pruebas, desde los muy fáciles a alguno muy complicado (sólo superado por w0pr, as usual 🙂

Al lío. Esta vez me encargué de hacer una copia de los retos, tanto del hackit como del solveit. Están publicados en Ikasten.io, siguiendo este esquema de URL:

HackIt:

https://ikasten.io/ee32/hackit/level1/level1.html

SolveIt:

https://ikasten.io/ee32/solveit/level1/level1.html

El primer level del HackIt, como suele ser habitual ha sido muy sencillo. No siempre es así, por ejemplo, creo que fue el año pasado, en una prueba de WebGL, fue una excepción.

En el código fuente vemos una simple operación de XOR

$(document).ready(function(){$("#password").
keyup(function(o){
r=$("#password").val();t="youknowit";c=[0x3c,0xe,0x6,0x12,0x1e,0x5c,0x16,0x1a,0xd];

e="";for(i=0;i<r.length;i++){
e+=String.fromCharCode(r.charCodeAt(i)^c[i%9]);}
$("#password").css({"background-color":e==t?

"#8f8":"#f88"});
});});

Reversible muy fácilmente:

def reverse_algorithm(encrypted_str, c):
password = ""
for i in range(len(encrypted_str)):
char = chr(ord(encrypted_str[i]) ^ c[i % len(c)])
password += char
return password

encrypted_str = "youknowit"
c = [0x3c, 0x0e, 0x06, 0x12, 0x1e, 0x5c, 0x16, 0x1a, 0x0d]

password = reverse_algorithm(encrypted_str, c)
print("The password is:", password)

Easy peasy!