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
Leave a Reply