Intro
As a frequently player on cybergames and ctf’s this year wanted play on prequal of Cybercamp CTF 2018 organized by INCIBE. This allows me to take a snapshot of the maturity and quality of both platforms and challenges, apart from having a good time solving some problems (not always played as tunelko :))
Challenge
This task was tagged as reverse task. Download pyc (Python compiled) file and, if decompile is success, start analyzing code. Once we decompyle with last version of uncompyle6 we see:
# uncompyle6 version 3.2.3 # Python bytecode 2.7 (62211) # Decompiled from: Python 2.7.15 (default, Jul 28 2018, 11:29:29) # [GCC 8.1.0] # Embedded file name: reversing.py # Compiled at: 2018-07-24 07:36:05 print '$$$$$ ^-^ \xe2\x95\xa6 \xe2\x95\xa6\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x90\xe2\x94\xac \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x90\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x90\xe2\x94\x8c\xe2\x94\xac\xe2\x94\x90\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x90 \xe2\x94\x8c\xe2\x94\xac\xe2\x94\x90\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x90 \xe2\x94\x8c\xe2\x94\xac\xe2\x94\x90\xe2\x94\xac \xe2\x94\xac\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x90 \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x90\xe2\x94\xac \xe2\x94\xac\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x90\xe2\x94\xac \xe2\x94\xac \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x90\xe2\x94\x8c\xe2\x94\x90\xe2\x94\x8c\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x90\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x90' print ' \xe2\x95\x91\xe2\x95\x91\xe2\x95\x91\xe2\x94\x9c\xe2\x94\xa4 \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x9c\xe2\x94\xa4 \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\xa4\xe2\x94\x9c\xe2\x94\xa4 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\xa4\xe2\x94\x9c\xe2\x94\x80\xe2\x94\xa4\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\xa4 \xe2\x94\x82\xe2\x94\x82\xe2\x94\x82\xe2\x94\x82 \xe2\x94\xac\xe2\x94\x9c\xe2\x94\xa4 ' print ' \xe2\x95\x9a\xe2\x95\xa9\xe2\x95\x9d\xe2\x94\x94\xe2\x94\x80\xe2\x94\x98\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x98\xe2\x94\x94\xe2\x94\x80\xe2\x94\x98\xe2\x94\x94\xe2\x94\x80\xe2\x94\x98\xe2\x94\xb4 \xe2\x94\xb4\xe2\x94\x94\xe2\x94\x80\xe2\x94\x98 \xe2\x94\xb4 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x98 \xe2\x94\xb4 \xe2\x94\xb4 \xe2\x94\xb4\xe2\x94\x94\xe2\x94\x80\xe2\x94\x98 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x98\xe2\x94\xb4 \xe2\x94\xb4\xe2\x94\xb4 \xe2\x94\xb4\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x98\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x98\xe2\x94\x94\xe2\x94\x80\xe2\x94\x98\xe2\x94\x98\xe2\x94\x94\xe2\x94\x98\xe2\x94\x94\xe2\x94\x80\xe2\x94\x98\xe2\x94\x94\xe2\x94\x80\xe2\x94\x98' print ' ^-^ $$$$$' 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() # okay decompiling medium_8.pyc
Code is self explanatory. It takes an array 5 long decimal values (called SHA1) and make some checks with that. It seems not SHA1 but decimal values of MD5 hashes. First, convert back to hash form 32 bit alphanum word.
In [5]: SHA1 = [15474416150235697017043280589699178375, ...: 291181071307803139498438131966588955205, ...: 109873136872180403981887852593133114079, ...: 115202235886395046817983293445716821568, ...: 242056712403709180973346710358452011247] ...: ...: for hashes in SHA1: ...: print("{:032x}".format(hashes)) ...: 0ba4439ee9a46d9d9f14c60f88f45f87 db0f6f37ebeb6ea09489124345af2a45 52a8cbe3663cd6772338701016afd2df 56ab24c15b72a457069c5ea42fcfc640 b61a6d542f9036550ba9c401c80f00ef
Let’s see if can be found:
0ba4439ee9a46d9d9f14c60f88f45f87 MD5 : check db0f6f37ebeb6ea09489124345af2a45 MD5 : group 52a8cbe3663cd6772338701016afd2df MD5 : zezex 56ab24c15b72a457069c5ea42fcfc640 MD5 : happy b61a6d542f9036550ba9c401c80f00ef MD5 : tests
Ok, 5 hashes of 5 words of 5 letter per each word. Concatenate it and get flag.