«Bitcode. Esta vez te toca investigar lo profundo de Python.» Para ello, nos pasan un fichero tar.gz que contiene un archivo main.py (texto plano) y otro routines.pyc (binario).
# main.py from routines import chk_serial _in = raw_input("Do you feel lucky?: ") print chk_serial(_in) |
Así que lo que queda por hacer es entender la función chk_serial… que está en el binario. Hay que descompilar el routines.pyc y analizar… Vamos allá. Lo primero es bajarse e instalar la aplicación uncompyle:
git clone https://github.com/gstarnberger/uncompyle.git cd uncompyle/ sudo ./setup.py install |
descompilar:
uncompyler.py routines.pyc > routines.py |
y analizar:
import base64 import re F = 'TWVB2Xut3bfdmQ0l2Qk91Mo9HNwggc==' def a(b): _tmp = b[:-2] return base64.b64decode(''.join([ e[::-1] for e in re.findall('..', _tmp) ]) + b[-2:]) def b(c): try: c = int(c) if c < 9999999999: return False else: if c <= 3: if c <= 1: return False return True if not c % 2 or not c % 3: return False for i in xrange(5, int(c ** 0.5) + 1, 6): if not c % i or not c % (i + 2): return False return True except: return False def chk_serial(s): if b(s): return a(F) return 'Fail' def main(): a(F) print 'Nothing to do' if __name__ == '__main__': main() |
Bueno, no parece difícil 🙂
/tmp/uncompyle$ python >>> F = 'TWVB2Xut3bfdmQ0l2Qk91Mo9HNwggc==' >>> _tmp = F[:-2] >>> _tmp 'TWVB2Xut3bfdmQ0l2Qk91Mo9HNwggc' >>> F[-2:] '==' >>> b = F >>> import base64 >>> import re >>> base64.b64decode(''.join([ e[::-1] for e in re.findall('..', _tmp) ]) + b[-2:]) 'Y0U_know_BitCod3_h4x0r' >>> |
Done!
Aunque obviamente no es necesario, el chequeo del serial simplemente comprueba que sea un número primo mayor que 9999999999, así que por ejemplo con 119218851371 nos daría el flag.