Sunday, March 1, 2015

Boston Key Party 2015: Wood Island


Soal ini nilainya 150 dalam kategori Crypto, soalnya seperti ini:
wood-island
Kita diberikan source code dalam Python. Intinya adalan: program ini menerima signature dan message, dan akan membalas dengan flag jika signature dan message sudah benar. Kita juga diberi contoh signature dan message yang sudah pernah dikirimkan ke server ini. Server ini tidak akan menerima jika message/signature adalah duplikat dari yang di file sigs.txt.

Bagian terpenting adalah baris-baris berikut:

        sig = json.loads(sig)

Kemudian berikut ini pengecekan yang dilakukan:

if "r" not in sig or "s" not in sig or "m" not in sig:
    self.request.close()
    return
r = sig["r"]
s = sig["s"]
m = sig["m"]
if not elgamal_verify(r, s, m):
    self.request.close()
elif is_duplicate(sig):
    self.request.close()
elif m != "There is no need to be upset":
    self.request.close()
else:
    self.request.sendall(FLAG)
    self.request.close()

Dan caranya mengecek duplikat adalah dengan:

def is_duplicate(s):
    return s in DUPLICATES

Perhatikan bahwa karena formatnya JSON kita bisa menambahkan field lain, dan dengan menambahkan field lain maka apa yang kita kirimkan tidak akan dianggap duplikat. Untuk mencegah orang melakukan brute force, maka server meminta "proof of work" yang meminta kita mencari string 20 karakter (X) dengan prefix 12 karakter yang diberikan, sedemikian sehingga sha1(X) berakhiran dengan 3 heksadesimal ff. Saya memakai cara sederhana brute force dengan menambahkan angka (kadang ini tidak berhasil, jadi perlu diulangi, kadang berhasil dalam sedetik, karena hanya butuh masuk sekali, maka tidak saya optimasi). Berikut ini solusinya.


Ketika dijalankan:


No comments:

Post a Comment