Ikasten.IO
Learning, Aprendiendo

HackIt! 2013 . Level 6. Expresiones regulares y sed (y II) 11 agosto, 2013

Éste es el script comentado del nivel, línea a línea:

En resumidas cuentas, le pasamos una entrada al script sed (de 2 líneas, la primera puede ser cualquier cosa, porque la va a sustituir por “Password:”), ciclamos 181 veces (una por cada guión y una inicial antes de llegar a la condición de salto) por una serie concreta de sustituciones y al finalizar, comprobamos que la cadena que nos queda después de tanta sustitución es, exactamente ésta: “017c43a81ddb8b638fb3a32c51f4”. Si así fuera, escribimos (comando ‘p’ de sed) “Win” y salimos (comando ‘q’). Si no fuera así, saltamos a la etiqueta “f” (comando Tf, es decir, un salto condicionado a que la última sustitución no tuviera éxito). En la etiqueta f sustituimos todo por “You Fail It!”, lo escribimos y terminamos.

Me han gustado dos cosas: el uso de etiquetas y saltos condicionales por un lado (desconocía este aspecto), y la forma de controlar la condición del bucle. En concreto, desconocía el uso del comando “x”, que viene a decir: coge lo que tenemos en el buffer y pónlo en el cursor del patrón que estamos analizando (lo sustituye, es decir, la línea que estábamos analizando pasa al buffer):

Inicialmente en el buffer sólo hay un fin de línea, así que tras hacer x y “s/$/—-/g”, nos quedamos con una línea de 5 guiones. Como necesitamos 180, usamos este truco:

Lo dicho, me gustó el planteamiento del problema. Pero claro, ¿cómo encontrar la cadena inicial que se usó para, tras todas las sustituciones indicadas, obtener “017c43a81ddb8b638fb3a32c51f4”? Bueno, invirtiendo el proceso de sustituciones. Se puede hacer con el propio sed, pero mis compañeros se curraron un script en VBA que resolvía al 95% (son magos del Excel…).

Con ese script conseguimos saber cómo debía estar formado el string de entrada correcto justo después de la instrucción “s/_/50/g;” . Si justo después de esa instrucción introducimos ésta otra:

s/(.*)/22 43 41 03 10 1c 23 04 12 24 1b 00 24 42 /;

y ejecutamos el script (recordad dadle permisos de ejecución al crackme):

Ya sólo queda darle un poco a la pelota para saber cómo interpretar las primeras líneas del script sed para que nos salga ese string mágico. Es cuestión de pensar unos minutos y hacer un script rápido para probar algunas combinaciones (un 2 en el string “mágico” puede ser porque inicialmente tenías una ‘c’ o una ‘s’ en la entrada:
y/abcdefghijklmnopqrstuvwxyz/0123456789abcdef0123456789/; Cuando tengas más de una opción, prueba a escribirlas todas – con un script – y verás que una de ellas se lee fácil 😉

Al pasar esta prueba llegarás al level 7, donde tendrás que desempolvar tus conocimientos de la era Spectrum!

  • cymo dice:

    Se os ha olvidado decir que Anton is great

  • marcan dice:

    No me cuadra la parte final de tu solución. El script, a no ser que yo haya metido la pata hasta el fondo, sólo acepta una posible cadena de entrada. No hay que probar combinaciones. Es más, lo que hace el script al principio es la parte más sencilla de todo el script 🙂

  • ramandi dice:

    Nuevo intento:

    from string import maketrans

    password=”

    a=’017c43a81ddb8b638fb3a32c51f4′
    for i in range(0,181):
    a=a[-3:]+a[:-3]
    if a[0]==’e’:
    a=a[0]+a[-16:]+a[1:-16]
    if a[0]==’c’:
    a=a[0]+a[-5:]+a[1:-5]
    if a[0]==’a’:
    a=a[0]+a[-11:]+a[1:-11]
    if a[0]==’8′:
    a=a[0]+a[-9:]+a[1:-9]
    if a[0]==’6′:
    a=a[0]+a[-10:]+a[1:-10]
    if a[0]==’4′:
    a=a[0]+a[-2:]+a[1:-2]
    if a[0]==’2′:
    a=a[0]+a[-7:]+a[1:-7]
    if a[0]==’1′:
    a=a[0]+a[-8:]+a[1:-8]
    if a[0]==’0′:
    a=a[0]+a[-3:]+a[1:-3]
    d=0
    while d=c2:
    #a[d]=hex(c1-c2)[2:]
    a=a[:d]+hex(c1-c2)[2:]+a[d+1:]
    else:
    #a[d]=hex(c1+0x10-c2)[2:]
    a=a[:d]+hex(c1+0x10-c2)[2:]+a[d+1:]
    d+=2
    trantab = maketrans(‘143c527e9ab0d6f8’, ‘072b346d18a9f5ce’)
    a=a.translate(trantab);
    d=0
    while d<len(a):
    discr=a[d+1]
    if discr=='0':
    password+=a[d]
    if discr=='1':
    trantab = maketrans('0123456789abcdef', 'abcdefghijklmnop')
    password+=a[d].translate(trantab);
    if discr=='2':
    trantab = maketrans('0123456789', 'qrstuvwxyz')
    password+=a[d].translate(trantab);
    if discr=='3':
    trantab = maketrans('0123456789abcdef', 'ABCDEFGHIJKLMNOP')
    password+=a[d].translate(trantab);
    if discr=='4':
    trantab = maketrans('0123456789', 'QRSTUVWXYZ')
    password+=a[d].translate(trantab);
    if discr=='5':
    password+='_'
    d+=2

    print password

  • ramandi dice:

    Está bien, claudico. Habrá que usar “la nube”:

    http://codepad.org/q5pLZNo2

  • kotxerra dice:

    Sí tienes razón marcan, pero se refiere a que la primera parte la decodificamos manualmente, más bien dicho que probando alternativas. Ya llevábamos mucho script interpretado para pensar como programarlo al revés en el vbasic 🙂 Se veía ya que salía y como no había que iterar ni na lo hicimos a manoplilla para ver si tenía sentido y una vez probado con un par de letras ya seguimos del tirón 🙂 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *