En este post resolveremos el reto 8 de la CyberCamp 2018, es un reto de reversing de nivel medio.

Enunciado

Se ha interceptado un código en la conversación entre dos delincuentes cuyo funcionamiento tendrás que averiguar para llegar a la FLAG.

Ficheros: medium_8.pyc

Solución

El único fichero que nos dan es un .pyc (python 2.7 byte-compiled), es decir un fichero compilado de python del que podemos obtener el código fuente fácilmente.

Para este propósito usaremos uncompyle2 que es un decompilador para python

./scripts/uncompyle2 medium_8.pyc > med_8.py

Con este simple comando obtenemos el código python:

import md5
SHA1 = [15474416150235697017043280589699178375L,
 291181071307803139498438131966588955205L,
 109873136872180403981887852593133114079L,
 115202235886395046817983293445716821568L,
 242056712403709180973346710358452011247L]
print 'If you are a good programer you know what you need to do to read the script'
Flag = raw_input('Please enter the flags: ')
if len(Flag) > 25:
    print 'The flag is to long'
    exit()
if len(Flag) % 5 != 0:
    print 'The flag is to short'
    exit()
if len(Flag) == 0:
    print 'Please enter the Flags'
    exit()
for r00t in range(0, len(Flag), 5):
    z3r0 = Flag[r00t:r00t + 5]
    if int('0x' + md5.new(z3r0).hexdigest(), 16) != SHA1[r00t / 5]:
        print 'try harder the next time'
        exit()

if len(Flag) == 25:
    print 'The Flag Is : ', Flag
    exit()
exit()
if len(Flag) / 25 != '0b1'[2:]:
    print 'try with binary'
    exit()

Este programa básicamente nos pide un flag que debe ser múltiplo de 5 y su longitud no mayor de 25, si se cumple esta condición comparará el MD5 de los 5 primeros caracteres del flag (en decimal) con el primer campo de SHA1, si estos coinciden hará lo mismo con los siguiente 5 caracteres y el siguiente campo de SHA1 y así sucesivamente hasta comprobar los 5 componentes de SHA1.

Para obtener la solución me hice un pequeño script en python (con colorines y todo jeje) que convirtiera a hexadecimal el array SHA1 y nos devolviera los hashes MD5 (os recuerdo que los MD5 son 32 caracteres luego habrá que añadir ceros a la izquierda si la longitud es menor [lineas 15 y 16]) que debemos crackear (para esto os recomiendo hashkiller), después el programa nos pide estas claves y nos crea lo que será el flag del reto:

#!/usr/bin/python
import re

SHA1 = [15474416150235697017043280589699178375L,
 291181071307803139498438131966588955205L,
 109873136872180403981887852593133114079L,
 115202235886395046817983293445716821568L,
 242056712403709180973346710358452011247L]

print 'https://hashkiller.co.uk/ - Crack these hashes:\n'
for i in SHA1:
	i = str(hex(int(i)))
	r = re.search('0x(.*)L',i)
	r = r.group(1)
	if len(r) < 32:
		r = (32-len(r)) * '0' + r
	print r

print ''
flag = ''
for i in range(0,5):
	flag += raw_input('Key ' + str(i+1) +'--> ')
	
print 'Flag: ' + flag 


Versión con colorines: GitHub – 08_Reversing.py

FLAG :

checkgroupzezexhappytests
¿Me ayudas a compatirlo?