Sorry, this entry is only available in European Spanish. For the sake of viewer convenience, the content is shown below in the alternative language. You may click the link to switch the active language.

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?