Writeup Cyber Jawara 2015 Day 2 : CJ2015 [library]

Writeup Cyber Jawara 2015 Hari Ke 2 - CJ2015 [library]



Gambar 1 : Soal cj2015.exe

Kembali dengan soal reversing, tetapi kali ini program dibuat dengan bahasa python yang dikemas menjadi .exe. analisa file tersebut di buat dari bahasa python yaitu anaslisa string yang ada pada file executable tersebut menggunakan command strings, seperti gambar dibawah :

Gambar 2 : Static Analisys [String]
Ternyata file executable tersebut dibuat menggunakan bahasa python, 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).

Gambar 3 : Decompile file cj2015.exe with unpy2exe
unpy2exe menghasilkan file a.py.pyc yang belum bisa dibaca source dengan kasat mata, baca hasil output file tersebut a.py.pyc, ternyata file a.py tersebut sudah di compile menjadi .pyc.


Gambar 4 : cat a.py.pyc
sehingga step selanjutnya adalah decompile a.py.pyc menjadi source python. proses ini dapat menggunakan uncomplye2 (https://github.com/wibiti/uncompyle2)

Gambar 5 : decompile a.py.pyc

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()

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 6 : Flag

Solusi lainnya :
hilangkan baris-baris yang melakukan pengecekan password
(if len password, if ord password dan sebagainya). Jadi, fungsi “go” hanya berisi:

Gambar 7 : Solusi lainnya
Gambar 8 : Flag solusi lainnya
Password yang didapat saya coba masukkan kedalam program, dan muncul flag :

Flag : CJ2015{g00dByeJacK!} 

Source :
[1] crackatoa Blog
Writeup Cyber Jawara 2015 Day 2 : CJ2015 [library] Writeup Cyber Jawara 2015 Day 2 : CJ2015 [library] Reviewed by Sitakom Blog on 9:17 AM Rating: 5

No comments: