Не важно, как медленно ты продвигаешься, главное, что ты не останавливаешься.


Saturday, 10 October 2015

Cyber Jawara 2015 Day 2 : CJ2015

Gambar 1 : CJ2015.exe
Kembali dengan soal reversing, tetapi kali ini program dibuat dengan bahasa python yang dikemas menjadi .exe. Berbeda dengan soal sebelumnya, solusi untuk soal kali ini adalah decompiling exe yang kita dapat menjadi .py sehingga mudah untuk dibaca.

Step pertama, decompile .exe menjadi executable python .pyc, untuk yang satu ini saya menggunakan unpy2exe (https://github.com/matiasb/unpy2exe).

C:\Users\..\jawara\cj2015\unpy2exe-master>python unpy2exe.py ..\cj2015.exe
Magic value: 78563412
Code bytes length: 3839
Archive name: library.zip
Extracting boot_common.py.pyc
Extracting a.py.pyc

unpy2exe menghasilkan file a.py.pyc yang belum bisa dibaca source dengan kasat mata, sehingga step selanjutnya adalah decompile a.py.pyc menjadi source python. proses ini dapat menggunakan uncomplye (https://github.com/gstarnberger/uncompyle)

C:\Users\..\Desktop\jawara\cj2015\uncompyle-master\scripts>python uncompyler.py ..\..\a.py.pyc >> a.py

Hasil dari uncompyle disimpan kedalam file a.py yang berisi code python dibawah ini:

# 2015.10.10 19:56:14 SE Asia Standard Time
print 'Cyber Jawara Online'
print '==================='

def scramble(x):
    return [ chr(i) for i in x ]

def flippity(x):
    return ''.join([ ''.join(i) for i in zip(x[1::2], x[0::2]) ])

def go():
    password = raw_input('Password: ')
    if len(password) != 22:
        return False
    if ord(password[11]) != 89 or ord(password[5]) != 69 or ord(password[16]) != 112 or ord(password[12]) != 111 or ord(password[18]) != 64 or ord(password[21]) != 33 or ord(password[13]) != 117 or ord(password[9]) != 121 or ord(password[14]) != 114 or ord(password[17]) != 64 or ord(password[7]) != 106 or ord(password[1]) != 36 or ord(password[15]) != 95 or ord(password[19]) != 115 or ord(password[20]) != 115 or ord(password[3]) != 121 or ord(password[10]) != 95 or ord(password[8]) != 48 or ord(password[6]) != 110 or ord(password[2]) != 97 or ord(password[4]) != 95 or ord(password[0]) != 101:
        return False
    return flippity(scramble([74,
     67,
     48,
     50,
     53,
     49,
     103,
     123,
     48,
     48,
     66,
     100,
     101,
     121,
     97,
     74,
     75,
     99,
     125,
     33]))

print go()

+++ okay decompyling ..\..\a.py.pyc 
# decompiled 1 files: 1 okay, 0 failed, 0 verify failed
# 2015.10.10 19:56:14 SE Asia Standard Time

Dalam bentuk seperti ini, semakin mudah dibaca tentunya. Ternyata ada 2 kondisi password yang akan diterima, kondisi pertama panjang password adalah 22, kondisi yang kedua ada beberapa deretan huruf yang masih berupa bilangan dec, jika disusun kemungkinan membentuk password yang benar. Maka saya melakukan mapping array dengan kondisi yang benar, seperti dibawah ini.

array : kondisi yang benar (dec)

0 : 101
1 : 36
2 : 97
3 : 121
4 : 95
5 : 69
6 : 110
7 : 106
8 : 48
9 : 121
10 : 95
11 : 89
12 : 111
13 : 117
14 : 114
15 : 95
16 : 112
17 : 64
18 : 64
19 : 115
20 : 115
21 : 33

Dari deretan angka decimal tersebut jika diterjemahkan (http://www.asciitohex.com/) kedalam ascii akan menjadi seperti: e$ay_Enj0y_Your_p@@ss!

Gambar 2 : The Flag
Password yang didapat saya coba masukkan kedalam program, dan muncul flag :
CJ2015{g00dByeJacK!}

Sekian write up - write up-an kali ini, semoga bermanfaat..
5 λ .: Cyber Jawara 2015 Day 2 : CJ2015 Gambar 1 : CJ2015.exe Kembali dengan soal reversing, tetapi kali ini program dibuat dengan bahasa python yang dikemas menjadi .exe. Berb...

No comments:

Post a Comment

< >