Ulang tahun Jonathan ke-9

Hari ini Jonathan masuk usia 9 tahun. Seperti tahun lalu, ulang tahunnya tidak dirayakan, tapi cukup dikasih hadiah dan makan bersama. Setelah lama berhomeschool dan jarang melihat perayaan ulang tahun anak lain, Jonathan tidak berharap perayaan ulang tahun.

Tahun ini hadiah yang saya berikan adalah buku Pokemon dan Minecraft. Buku Pokemon nya cukup tebal tapi sudah selesai dibaca dalam beberapa jam saja. Buku Minecraft nya baru satu box yang dibuka. Sebenarnya Jonathan juga meminta sebuah game untuk Nintendo Switch, tapi karena baru akan dirilis Minggu depan, jadi kami belum bisa belikan sekarang.

Meskipun tidak ada kegiatan homeschool hari ini, tapi tetap ada kegiatan kumon. Untungnya hari ini dia bisa cepat sekali menyelesaikannya. Setelah selesai, dia langsung menelpon saya dengan Video Call Facebook Kids dengan WIFI dari tempat kumon.

Setelah itu kami menunggu Risna yang sedang ikut pelatihan di Gereja, dan kemudian diteruskan dengan makan di Bear Hug Caffe.

Makanan dan minuman di tempat ini cocok untuk anak-anak, dihias cantik dan rasanya juga enak.

Sudah banyak perkembangan Jonathan di usia 8 tahun, dan semalam saya ngobrol banyak tentang targetnya di usia 9 tahun. Saya tidak perlu tuliskan di sini, tapi saya berharap keinginan dan target Jonathan bisa tercapai.

HITB PRO CTF 2019

Ini cerita khusus mengenai HITB CTF di Abu Dhabi, sedangkan cerita jalan-jalan saya tuliskan di posting lain. Dari websitenya acaranya, rencananya ada 20 tim tingkat dunia yang diundang, pemenang dari berbagai CTF lain di dunia tapi akhirnya hanya 19 team yang berkompetisi. Di akhir kami akhirnya peringkat 9 dari 19.

Tim PDKT yang lolos di HITB tercantum di CTF Time. Saya tidak akan bercerita detail tentang tim ini, silakan kunjungi website/sosmed/github masing-masing anggota teamnya: farisv, visat, wearemarching, zeroload. Sengaja saya link tidak ke linkedin langsung, supaya kalau di masa depan informasi profilenya ingin dianonimkan akan lebih mudah. Ada yang baru tingkat 3, dan sisanya belum lama lulus (tidak seperti saya yang sudah lebih 20 tahun lulus S1).

Ranking akhir pemenang bisa dilihat di: https://ctftime.org/event/918 . Di posting ini saya ingin bercerita mengenai teknis CTF ini, dari format lombanya sampai teknis beberapa soalnya.

Format lomba adalah attack defense murni, tidak ada soal jeopardy. Semua tim diberikan berbagai service yang sama, dan kita perlu menyerang service team lain sambil mempertahankan tim kita. Supaya lebih jelasnya, saya akan memberikan contoh sederhana (bukan soal sesungguhnya).

Misalnya kita diberi layanan image gallery. Ternyata di programnya ada bugnya: bisa mengupload selain image, jadi kita bisa menjalankan kode kita sendiri atau mungkin ada bug lain: bisa melihat image orang lain. Nah panitia akan menaruh flag (berupa string kode) ke dalam image, dan akan mengupload ke semua peserta (flagnya beda untuk tiap service dan tim tiap peserta).

Tugas kita adalah mencuri flag dari peserta lain, dan memastikan orang tidak bisa mengambil flag kita. Bagian sulitnya adalah: fungsionalitas harus tetap jalan, jadi kita tidak bisa membela diri dengan mematikan servicenya atau memblok semua iamge, atau memblok peserta. Jadi ada program dari panitia yang akan menguji bahwa fungsionalitas masih jalan. Di contoh ini galery harus bisa tetap menerima image dan tetap bisa didownload imagenya. Jadi patchnya harus cukup eksak, kalau membuat layanannya tidak berjalan, poin kita akan dikurangi.

Panitia sudah membuat repositori semua soal dengan writeup dari panitia (dengan solusi yang diharapkan panitia). Ini bisa diakses umum di:

https://github.com/HackerDom/proctf-2019

Terlihat bahwa team PDKT berhasil pertama menyelesaikan salah satu soal drone_racing (first blood untuk soal itu).

Kita bisa menjalankan tcpdump untuk memonitor layanan kita agar bisa mempelajari eksploit yang dikirimkan team lain. Tapi tcpdump ini tidak selalu ampuh karena beberapa hal:

  • Team lain mengirimkan eksploit yang obfuscated
  • Kadang data yang dikirimkan sangat besar (misalnya image), padahal disk space virtual machine yang diberikan sangat terbatas
  • Kadang layanan memakai SSL (encrypted), jadi harus diintercept dengan cara khusus (tidak bisa sekedar tcpdump)
  • Kadang layanan memakai enkripsi custom

Jika ada beberapa team yang mendapatkan skor terlalu banyak dari satu soal, soal itu akan dipensiunkan dan diganti dengan soal yang lain. Soal-soal hari pertama baik yang bisa maupun yang tidak bisa diselesaikan juga dipensiunkan di hari ketiga.

Menurut saya beberapa soal dirancang tidak bisa diselesaikan dalam waktu sehari, dan memang diharapkan peserta meneruskan pengerjaan soal di hotel. Jadi jika ada lomba semacam ini, sebaiknya persiapkan stamina dengan baik.

Ada beberapa soal yang saya benar-benar tidak kepikiran karena tidak tahu bahwa suatu hal itu mungkin. Misalnya saya tidak memperhatikan di soal rubik bahwa bisa saja terjadi use after free karena menggunakan alokasi stack manual di F#. Saya tidak tahu bahwa ini bisa dilakukan di F# dan bahwa tidak ada pengecekan yang dilakukan oleh runtime .NET.

Satu soal yang membuat menyesal adalah SepToN. Saya tahu persis harus bagaimana: melakukan attack terhadap Substitution–permutation network. Dulu saya sempat mempelajari ini khusus AES untuk melakukan fault injection attack di hardware, tapi saya tidak pernah benar-benar mempraktikkan variasi SPN yang tidak wajar (di kasus ini round-nya hanya 4).

Saya merasa soal-soal enkripsi blok ini cukup mengada-ada. Saya tidak pernah menemukan di dunia nyata orang yang membuat block cipher custom sendiri. Sedangkan untuk berbagai kasus kelemahan kriptografi yang lain, memang saya temukan. Saya merasa stuck karena saya pikir attack hanya bisa dilakukan terhadap BMP header (4 byte) saja. Setelah membaca writeupnya, ternyata komponen Alpha bisa digunakan.

Ada satu team yang berhasil menyelesaikan soal SepToN ini, dan dari satu soal ini saja, mereka mendapatkan nilai yang sangat banyak. Tidak ada defense khusus yang bisa dilakukan untuk menangkal ini, jadi semua tim lain juga pasrah.

Soal yang diberikan sangat bervariasi, dan bahkan ada soal IOT juga. Saya sendiri awalnya diundang karena akan ada materi khusus IOT, tapi ternyata bagian ini dibatalkan. Ternyata dalam lomba ini tetap ada satu soal IOT. Saya agak menyesal tidak memperhatikan bahwa diberikan kabel mini USB untuk ST-LINK, dan baru di hari kedua saya sadari kabel ini ada dan bisa dipakai mengekstrak firmwarenya. Sayangnya waktunya tidak cukup, dan soal tidak diteruskan untuk hari ketiga. Saya jarang melakukan reversing kode ARM thumb (terakhir adalah ketika melakukan RE Pokemon Go Plus), dan prosesnya agak lama.

Ada juga satu soal berhubungan dengan AI (adversarial attack). Saya merasa sedikit kesal dengan diri sendiri karena tidak pernah benar-benar mencoba attack terhadap AI meskipun tahu teorinya. Saya tahu dengan tepat bagaimana neural networknya bekerja, dan saya mencoba-coba mengimplementasikan neural network sederhana dengan layer deconvolutional tapi akurasinya masih terlalu rendah.

Kesulitan utama dalam mengerjakan CTF seperti ini adalah: memilih soal untuk dikerjakan. Ada beberapa soal yang dari awal sepertinya sudah terlihat sangat sulit, tapi ternyata mudah (misalnya soal ca), dan karena sudah merasa akan ribet, kami jadinya tidak menyelesaikannya. Beberapa soal lain terlihat sulit dan memang sangat sulit (misalnya convolutional) dan saya merasa ini hampir mustahil selesai sehari (dan memang semua tim gagal menyelesaikan ini).

Di sisi lain: kadang soal sulit bisa memiliki solusi sederhana yang tidak diharapkan pembuat soal. Team PDKT berhasil menyelesaikan soal Drone Racing yang mestinya sangat rumit (overflow file .class) dengan hanya menggunakan trik database.

Saya kagum dengan dedikasi team PDKT yang selagi lomba juga sambil mengurus final Cyber Jawara, jadi waktunya agak tersita karena sambil lomba juga mengurusi lomba di Indonesia. Semoga berikutnya akan ada lebih banya lagi yang kemampuannya setara, supaya minimal bisa membantu penyelenggaraan lomba di Indonesia.

Penutup

CTF offline seperti ini memang cocok untuk anak muda, sedangkan saya merasa agak lelah karena masalah perjalanan dan perbedaan time zone dan stamina tidak seperti waktu saya masih muda. Selain itu sudah lama juga saya tidak ikut CTF yang umum seperti ini, dua tahun terakhir saya hanya ikutan CTF Flare On saja. Mungkin kalau pekerjaan utama saya sehari-hari berhubungan dengan security, akan lebih mudah untuk update ilmu security/CTF setiap hari.

CTF seperti ini butuh tetap mengerjakan soal di hotel. Ini juga alasan saya tidak membawa Risna dan anak-anak, karena tidak akan bisa bersenang-senang di hari lomba. Sepertinya sekarang ini saya lebih cocok dengan CTF jangka panjang seperti Flare On supaya santai.

Pemain CTF juga harus belajar banyak hal baru, termasuk juga topik sulit seperti AI. Topik dasar enkripsi secara menyeluruh juga perlu dikuasai Saya sendiri jadi terinspirasi untuk akan lebih banyak menuangkan hal-hal seperti ini dalam bentuk tulisan (sudah lama tidak menulis teknis dasar).

Semoga di tahun-tahun berikutnya team Indonesia bisa lebih baik lagi.

CTF dan jalan-jalan di Abu Dhabi dan Dubai

Tim PDKT yang terdiri dari 3 orang berhasil menang di CTF HITB (Capture the Flag Hack In The Box) di Singapore (peringkat pertama), dan mereka mendapatkan undangan untuk berpartisipasi di HITB Pro di Abu Dhabi. Karena satu team di Abu Dhabi boleh 5 orang, maka mereka mengundang saya dan satu orang lagi. Tiket dan hotel kami ke Abu Dhabi dibayari oleh panitia.

Pada final ini kami hanya meraih peringkat 9 dari 19 team. Menurut saya tidak terlalu jelek mengingat lawan kami adalah tim tingkat dunia, dan anggota tim PDKT masih harus sambil mengurusi event Final CTF Cyber Jawara selagi berlomba. Posting ini hanya cerita singkat mengenai perjalanannya, dan di posting lain akan saya ceritakan lebih detail mengenai teknis CTF-nya.

Di Thailand kebetulan tanggal 14 adalah hari libur nasional, jadi saya bisa ikut event ini dengan mengambil hari cuti yang minimal. Acara selesai Kamis Sore, tapi karena tidak mungkin juga saya kembali dan langsung bekerja di Jumat pagi, saya putuskan untuk memperpanjang sampai Sabtu malam (pesawat jam 23.30).

Di Uni Emirat Arab (berikutnya saya singkat UAE saja), Jumat dan Sabtu adalah hari Libur. Teman saya Okta (yang pernah muncul namanya di posting yang ini), berbaik hati menawarkan untuk menginap di apartemennya. Hari Jumat walaupun libur, tapi umat Islam wajib melakukan Sholat Jumat, jadi saya meminta dijemput Okta jam 3 sore.

Museum Louvre Abu Dhabi

Saya menghabiskan pagi sampai Jumat sore di Museum Louvre Abu Dhabi. Saya belum pernah ke Louvre di Perancis, jadi tidak bisa membandingkan dengan di sana. Dari dulu saya merasa saya bukan orang yang bisa mengapresiasi seni, tapi lama-lama saya tertarik juga. Beberapa hal yang membuat saya tertarik pada seni dan arkeologi adalah Episode Dr Who mengenai Vincent Van Gough dan juga isi berbagai game Professor Layton.

Saya membawa koper dan tas saya ke museum karena saya sudah membaca bahwa mereka memiliki ruang penitipan (cloakroom). Waktu masuk, tas dan koper discan seperti di bandara, dan saya harus menunjukkan bahwa segala macam kabel yang terlihat di scanner memang hanya kabel biasa.

Untuk lebih menghargai kunjugan saya ke museum, saya membayar ekstra 21 AED untuk dapat memakai Multimedia guide. Ini berupa sebuah iPad mini dengan aplikasi Guide yang sudah terinstall di dalamnya. Setelah memakai aplikasi ini saya jadi tahu bahwa ternyata aplikasinya sama persis dengan yang ada di Google Play Store dan Apple App Store. Jadi kalau mau berhemat, pakai saja HP sendiri dengan menginstall dulu aplikasinya sebelumnya karena ukuran downloadnya cukup besar.

Berbagai item yang terpajang di museum memiliki nomor, dengan mengetikkan nomor itu, kita bisa mendengarkan penjelasan singkat mengenai objek itu. Dengan ini saya merasa bisa lebih menghargai apa yang bisa saya lihat. Misalnya: apa istimewanya bejana ini? Oh ternyata benda ini diciptakan sebelum Roda Tembikar (Potter’s Wheel) ditemukan, jadi teknik yang dipakai berbeda.

Item nomor 106 di aplikasi LAD

Sayangnya tidak semua objek memiliki penjelasan, padahal banyak juga benda-benda yang membuat penasaran. Sebenarnya tanpa datang ke museum itu, kita bisa mempelajari dengan cukup memakai aplikasinya. Hal yang tidak bisa dirasakan adalah kemegahan benda-benda, misalnya patung atau lukisan yang besar.

Saya berharap berbagai museum di Indonesia bisa membuat aplikasi sejenis itu. Aplikasinya konsepnya sangat sederhana: kita memasukkan angka secara manual. Tidak perlu menambahkan NFC, RFID, atau bahkan QR Code, cukup menambahkan angka ke display di museum. Tidak perlu juga penyewaan device khusus, cukup sediakan saja aplikasinya di play store/app store.

Saya sempat makan di kafetaria di Louvre. Walau harga makanan cukup mahal, makanannya cukup enak, dan pemandangan bagus (ke arah laut). Setelah selesai melihat semuanya, saya juga mengecek bagian museum untuk anak-anak, tapi menurut saya tempatnya terlalu kecil.

Sheikh Zayed Grand Mosque 

Saya dijemput oleh Okta bersama keluarga dan diantar ke Sheikh Zayed Grand Mosque . Ini merupakan salah satu tujuan wisata yang disarankan di Abu Dhabi. Masjidnya sangat besar dan ada jalan masuk khusus untuk pengunjung.

Dari jalan masuk khusus kita akan masuk parkir bawah tanah yang besar, seperti di Mall. Saya cukup kagum karena yang pertama saya lihat ketika masuk adalah: Starbucks.

Setelah itu kami perlu mengisi data diri pengunjung yang sepertinya hanya sekedar keperluan Survey karena kita tidak diminta nama atau pun nomor identitas. Entri data menggunakan iPad yang dipasang. Setelah itu kita akan mendapatkan print berupa QR Code

Perjalanan dari tempat parkir sampai Masjid cukup jauh, tapi banyak travelator dan juga eskalator yang tinggal diikuti. Di berbagai tempat wisata rohani di dunia ini (misalnya di berbagai pura di Bali atau temple di Chiang Mai), kita diminta untuk berpakaian sopan, demikian juga halnya di Masjid ini. Untuk yang memakai pakaian kurang sopan, akan dipinjami baju yang lebih sopan.

Kesan saya: Masjid ini sangat megah dan indah baik luar maupun dalamnya. Saya hanya memilih foto yang agak kosong untuk diupload di sini, dalam kenyataannya jumlah pengunjung masjid sangat banyak.

Makan malam

Saya ditraktir oleh Okta dan keluarga untuk makan di Najd Palace. Berbagai menu dan harganya bisa dilihat di situs restorannya. Di sinilah kali pertama saya merasakan daging Onta, yang menurut saya rasanya lezat.

Setelah sedikit melihat kota Abu Dhabi, saya menginap di Apartemen Okta. Di pagi hari, Nita, istrinya Okta memasakkan kami makanan Indonesia. Menu sarapannya cocok sekali untuk lidah saya.

Perjalanan ke Dubai

Di hari Sabtu pagi, Okta sekeluarga pergi ke Dubai untuk mengantarkan anaknya les piano, jadi saya numpang sekalian untuk ketemu Mas Ady, Rinda dan anak-anaknya. Mas Ady ini dulu kakak kelas dan sekaligus kakak Admin jaringan, sementara Rinda ini teman sekelas dulu di ITB.

Pemandangan sepanjang perjalanan kebanyakan adalah gurun, tapi ada banyak juga pepohonan di tepi jalan. Rupanya ada banyak selang air yang membuat tanaman itu bisa tetap hidup di gurun yang panas. Perjalanan ke Dubai memakan waktu sekitar 1 jam.

Sebelum bertemu dengan Mas Ady dan keluarga, saya sempat melihat-lihat toko buku, dan mendapati ada 2 buku programming yang saya belikan untuk Jonathan.

Sedangkan Joshua yang suka belajar alfabet apa saja (Inggris, Rusia, Spanyol, Thai, Yunani, dan sekarang Arab) saya belikan wipe and clean numeral Arab.

Setelah ketemu, acaranya adalah makan sambil ngobrol-ngobrol. Tapi fotonya tidak akan saya upload di sini, cukup di FB saja dan tidak dibuat publik. Sebelum makan, Rinda memberi saya susu Unta. Ini juga kali pertama saya minum susu Unta. Menurut saya rasanya enak.

Waktu saya untuk jalan-jalan tidak banyak: pukul 18.45 saya harus naik bus ke Abu Dhabi (busnya gratis oleh Etihad, Airline yang saya pakai). Jadi supaya maksimal yang dilakukan hanya mampir dan foto-foto di beberapa tempat.

Mas Ady berbaik hati memfotokan saya di berbagai tempat yang khas Dubai, seperti misalnya dengan latar belakang Burj Khalifa dan juga suasana gurun. Dulu saya berpikir bahwa gurun itu tempat yang “menyeramkan” tapi ternyata bisa terlihat sangat indah.

Sebagai orang yang suka ngoprek mobil, mas Ady sempat menunjukkan menu diagnostik mobilnya. Penasaran pengen pencet-pencet menunya, tapi takut karena mobilnya sambil jalan.

Saya diantarkan ke stasiun bus dan busnya tidak lama kemudian berangkat. Di dalam busnya ada WiFi-nya. Ketika sampai, masih ada waktu untuk makan, jadi saya membeli makanan sambil memakai buah Ara yang dibawakan oleh Rinda. Sempat kaget juga karena ada yang tiba-tiba datang dan bertanya: beli buah itu di mana? ketika saya bilang saya belinya di Dubai dia tampak kecewa.

Pulang

Semua proses checkin berjalan lancar, dan saya sampai di Bangkok Jam 9 pagi di hari Minggu. Kemudian perjalanan diteruskan ke Chiang Mai. Perjalanan bisa lancar, dan semuanya senang menerima oleh-oleh yang dibawakan oleh keluarga Mas Ady/Rinda dan juga Okta/Nita.

Saya sangat menikmati perjalanan kali ini. Meskipun tidak menang di lomba, saya merasa belajar cukup banyak. Saya juga senang bisa bertemu generasi muda hacker Indonesia yang bisa membanggakan nama Indonesia di dunia Internasional. Saya juga senang bisa bertemu teman-teman yang sudah lama sekali tidak bertemu (terakhir bertemu lebih dari 10 tahun yang lalu). Saya juga senang melihat kelakuan anak-anak yang di mana-mana sama aja, mirip dengan anak-anak saya.

Selamat ulang tahun kekasihku

Dulu waktu jaman pacaran dengan Risna, saya pernah harus menunggu pesawat lama sekali di bandara di Hanoi. Waktu itu di situ tidak banyak yang bisa dilakukan (mungkin sekarang sudah jauh berbeda). Dulu saya sudah memakai smartphone tapi baterenya sudah hampir habis. Jadi akhirnya saya mengisi waktu dengan menuliskan surat cinta dengan kertas dan pulpen untuk Risna yang saya berikan ketika sampai di Indonesia.

Sekarang saya sedang menunggu di bandara Bangkok menuju ke Abu Dhabi untuk mengikuti event CTF ini dan pesawatnya baru akan berangkat beberapa jam lagi. Cerita mengenai event CTF ini akan menyusul nanti (intinya saya diundang bergabung oleh tim PDKT).

Besok adalah ulang tahun Risna, dan nanti malam ketika pergantian hari di Thailand, saya akan sedang berada di jalan. Jadi sekarang saya tuliskan dulu ucapan selamatnya supaya nanti bisa dijadwalkan terbit nanti malam.

Selamat ulang tahun istriku sayang. Saya bahagia dan bangga bisa bersamamu sampai sekarang ini, dan semoga sampai usia kita berdua sampai lanjut. Rasa cinta saya masih bertambah sejak dulu pertama kali jatuh cinta padamu. Sudah banyak harapan dan impian yang kita capai bersama. Kita sudah dikaruniai dua anak yang lucu, pintar dan sehat dan meskipun kita belum kaya raya, hidup kita tidak berkekurangan.

Saya bangga punya istri yang pintar dan bisa mendidik kedua anak kita. Meskipun Jonathan sering bermalasan dalam homeschool dan Joshua perlu diperhatikan khusus, tapi kamu masih bisa sabar. Selain sudah mahir berbahasa Thai, yang sangat membantu dalam kehidupan sehari-hari, kamu juga masih mau belajar banyak bahasa lain. Saya juga bangga punya istri yang cekatan, bisa mengurus rumah dengan baik, menyetir dan mengantar anak ke berbagai tempat les.

Sekali lagi: selamat ulang tahun, semoga kita berdua selalu dikarunia kesehatan dan kebahagian bersama anak-anak kita.

Flare-On 2019 dan pembahasan soal no 6

Flare On ke-6 sudah selesai dan solusi dari panitia juga sudah diberikan. Ini tahun ke-5 saya menyelesaikan seluruh soal Flare On.Tidak seperti tahun-tahun sebelumnya di mana saya ingin buru-buru selesai, tahun ini saya sangat santai dan selesai di peringkat 148. Tahun ini ada 308 orang yang selesai semua dari total 5790 yang mendaftar. Kalau tidak sibuk, tahun depan saya rencana tetap ikut dalam mode santai seperti ini.

Menurut saya Flare On ini sangat berguna untuk mengasah ilmu reverse engineering dan mengenal berbagai teknik baru yang tidak/belum saya ketahui. Soal tahun ini sejak nomor satu sudah lebih sulit dari tahun-tahun sebelumnya, tapi ada 3228 yang berhasil menyelesaikan soal pertama. Menurut saya soal-soal nomor tinggi justru lebih mudah dari tahun-tahun sebelumnya tapi butuh banyak kesabaran. Sama seperti tahun-tahun sebelumnya, di akhir kita akan ditanya apakah ingin mengirimkan CV ke Fire Eye.

Tahun ini ada dua orang yang saya kenal dari Indonesia yang berhasil menyelesaikan Flare On: 0xf4c0 dan Visat (dari team PDKT), seperti biasa karena alamat pengiriman hadiah di Thailand saya dihitung dari Thailand.

Dulu saya cukup rajin untuk menuliskan solusi semuanya, sekarang karena solusi dari panitia sudah datang cepat, saya malas menuliskannya, kecuali jika ada pendekatan saya yang berbeda. Tahun lalu saya hanya menuliskan dasar ilmu apa yang dibutuhkan untuk menyelesaikan tiap soal.

BMPHIDE

Hari ini ada yang bertanya apakah saya bisa menuliskan cara saya menyelesaikan soal No 6 (BMPHIDE), karena saya punya waktu, jadi saya tuliskan saja sekarang (kebetulan juga sekarang Flare On ke-6, jadi saya bahas soal No 6 saja). Di soal ini kita diberi sebuah program dan file bitmap (BMP). Soalnya bernama bmphide, dari namanya saja sudah terpikir bahwa ini adalah soal steganografi, tapi tentunya bukan soal steganografi biasa.

Sebelum membaca solusi saya, sebaiknya baca dulu solusi resmi dari Flare On (PDF), lalu kembali ke sini. Ada beberapa hal yang tidak akan saya bahas detail, misalnya: ada anti debug sehingga program tidak bisa didebug. Dari pengalaman di Flare On tahun-tahun sebelumnya: jika ada anti debug, maka saya akan berusaha tidak memakai debugger karena biasanya anti debugnya sangat kompleks dan memakan waktu lama. Bahkan di beberapa soal di tahun sebelumnya: jika dijalankan di debugger malah tidak bisa ketemu flagnya.

Tidak ada instruksi untuk menjalankan program yang diberikan, tapi karena programnya ditulis dalam .NET kita bisa membongkarnya dengan dnspy untuk melihat kodenya. Bagian main-nya seperti ini:

Dari membaca kodenya, Program BMPHIDE.EXE dipakai untuk menyembunyikan data di dalam file bitmap. Jika dibaca sekilas bagian enkripsi (Program.h()) dan menyembunyikan data dalam bitmap (Program.i()) cukup jelas. Ini steganografi standar dengan menggunakan LSB.

Pendekatan saya tidak memakai debugger adalah dengan membuat ulang programnya di project Visual Studio. Ternyata jika kode hasil dekompilasi ini kita copy paste ke project baru di Visual Studio, hasilnya tidak seperti yang diharapkan. Jadi pasti ada sesuatu yang ajaib yang dilakukan oleh program.

Jadi akhirnya saya mulai membaca lagi lebih teliti programnya. Ada method aneh bernama VerifySignature. Dari melihat sekilas saja, sepertinya ini akan membuat agar pointer method1 jadi pointer method2. Setelah membaca-baca beberapa artikel (contohnya ini), memang itu yang dilakukan.

Mungkin ada yang heran: dari mana tahu bahwa ini kode penting? Saya tahu dasar .NET, jadi terbayang kira-kira apa yang bisa dan tidak bisa dilakukan di .NET, jadi dari dasar ilmu itu bisa mencari di Internet mengenai MethodHandle di .NET dan apa yang bisa dilakukan.

Sekarang hal pertama sudah diketahui: ada method yang ditukar implementasinya, jadi andaikan kita memanggil method X, yang dipanggil sebenarnya Y. Tapi method mana yang ditukar? tidak dengan mudahnya mereka menuliskan tukar method bernama X dengan Y, tapi mereka membuat kode seperti ini:

Intinya seluruh method dibuat checksum kodenya, lalu method yang checksumnya sekian akan ditukar dengan yang checksumnya sekian. Di project visual studio saya, saya perlu meload bmphide.exe ini agar bisa dilihat semua methodnya dan dibuat checksumnya. Ini bisa dilakukan dengan kode semacam ini (kuncinya di sini adalah Assembly.LoadFrom):

Dari sini saya bisa mengetahui method mana yang ditukar. Tapi ternyata tidak cukup di sini triknya. Ada method yang bernama IncrementMaxStack (namanya menyesatkan, tidak ada hubunganya sama sekali dengan stack), yang berisi kode untuk mem-patch alamat memori dengan isi tertentu (lihat “writeByte” dan “writeInt32”). Dari nama fieldnya (ILCode) sudah jelas bahwa yang dipatch adalah IL (Intermediate Language) code, tapi kode yang mana yang dipatch?

Kali ini method tidak dicari berdasarkan isi checksumnya tapi berdasarkan metadata tokennya. Jadi sekali lagi saya meloop semua method dan mencetak MetadataToken-nya untuk mendapatkan dua method yang dipatch. Saya bahas saja salah satu method yang dipatch yaitu program.g, hasil dekompilasi asli seperti ini:

Tapi kode ini dipatch di offset 6 dengan angka baru dan offset 18 (atau 12 hexa) dengan angka baru.

Jika kita lihat IL code-nya, akan terlihat apa artinya offset 6 dan 12 hexa ini (lihat kolom kedua, dengan header “offset”). Di sini tidak ada offset 6, tapi ada offset 5. Di offset 5 ada instruksi ldc (load constant), yang meload bilangan -0x12477CE0. Bilangan ini yang dipatch menjadi 309030853. Hal yang sama juga dilakukan untuk offset 12 heksa.

Jadi setelah diperbaiki, fungsi g menjadi seperti ini:

Setelah mendapatkan versi benar dari semua methodnya, saya bisa mengcompile bmphide saya sendiri, dan bisa mendebugnya dan memahami algoritmanya dengan mudah. Sisanya hanya membuat dekriptor dan ekstraktornya.

Pendekatan saya sebenarnya antara pendekatan 1 dan 2: saya membrute force per byte dengan memanggil fungsi enkrip. Loopnya seperti ini:

Tidak seperti solusi di flare-on di mana hasil brute force (solusi 1) tidak jelas, hasil brute force ini akan jadi image yang bersih.

Penutup

Soal ini sebenarnya hanya “pemanasan” dalam hal enkripsi, tepatnya bagaimana sebuah enkripsi yang relatif sederhana bisa disembunyikan dengan trik sehingga sulit dibaca meskipun menggunakan decompiler. Soal berikutnya yang lebih serius ada di no 10. Di soal 10 kita diberi “ransomware” (bernama mugatu) yang memiliki kelemahan di bagian enkripsinya.

Bagi yang ingin merasakan betapa lamanya memahami enkripsi dan membuat dekriptor sebuah ransomware, silakan mencoba menyelesaikan soal no 6 dan 10. Ini soalnya masih sangat sederhana dan malware yang sebenarnya akan butuh waktu yang lebih lama lagi.

Merakit dan Mengupgrade PC

Kebanyakan teman seangkatan saya sudah jarang yang merakit PC. Bahkan kalau dipikir-pikir yang memakai PC (di rumah, bukan di kantor) juga semakin sedikit, kebanyakan hanya punya laptop saja. Saya sendiri sampai saat ini merasa lebih nyaman bekerja di PC yang cepat dengan layar besar dan keyboard mekanis.

Sekarang saya memesan berbagai komponen PC dari jib.co.th atau kadang beli offline jika kebetulan barang yang hendak dibeli tersedia di toko JIB di Airport Plaza. Jika membeli online prosesnya sangat mudah dan cepat. Setelah selesai membayar, barang akan segera dipack, dan saya akan dikirimi URL video pengepakannya. Sayangnya karena jauh dari Bangkok, jadi tetap butuh 2 hari sampai barangnya diterima di Chiang Mai.

Sebenarnya saya mulai malas membongkar PC, memasang komponen baru, mengetes, setting BIOS, memindahkan sistem operasi dsb, tapi saya lebih malas lagi dengan berbagai alternatifnya. Beberapa alternatifnya adalah:

  • membawa semua ke toko, memberi instruksi dan menunggu sampai semua selesai, pulang ke rumah (capek, tetap harus memasang ulang kabel), perlu memberi tahu password ke teknisi (atau membantu mengisi password setiap kali dibutuhkan)
  • membeli komputer baru yang lebih baik (tetap harus memindahkan data/program ke komputer baru)
  • mendatangkan teknisi: saya nggak akan sabar memberi tahu apa yang harus dilakukan, memberi tahu password, dsb

Jadi meskipun saya kurang suka, merakit dan mengupgrade PC tetap saya lakukan sendiri. Contoh beberapa hal yang menyebalkan ketika merakit PC:

  • memasang CPU cooler
  • memasang kabel untuk power/reset/LED HDD/Power, ribet karena kecil
  • mengatur kabel. padahal saya sudah memakai PSU dengan kabel modular
  • memasang backplate. Tapi sekarang tidak lagi, karena sebel sering menyakiti tangan, saya putuskan untuk tidak memasang benda ini. Memang berisiko menambah debu yang masuk, tapi saya lebih memilih membersihkan debu daripada memasang benda ini
Backplate, nggak pernah saya pasang lagi

Sekarang mau cerita konfigurasi desktop saat ini:

  • Casing Chaser MK I (saya beli tahun 2013)
  • Storage M2.NVME 1 TB untuk Windows
  • CPU Intel Core i5 9400F 2.9 GHz (terpikir membeli Core i9, tapi perbedaan performancenya kurang signifikan untuk use case saya)
  • Banyak harddisk
  • Ram DDR4 32 GB

Alasannya cukup panjang, tapi sekarang saya memakai Desktop Windows dan sebuah server Linux. Keduanya saya pakai bekerja. Meskipun rasanya agak ekstrim bekerja dengan dua komputer, tapi menurut saya ini workflow paling enak. Desktop dipakai untuk pekerjaan interaktif, dan Linux dipakai untuk berbagai server (samba, mongo, mysql, http, dsb) dan untuk kompilasi yang memakan waktu lama (compile kernel, compile ROM Android).

Spesifikasi server sekarang:

  • Casing nggak jelas beli second hand
  • SSD 1 TB untuk Linux
  • CPU: AMD Ryzen 5 2600X Six-Core Processor
  • RAM DDR4 16 GB
  • Banyak harddisk

Pemilihan berbagai komponen saya dasarkan pada pengukuran: dengan melihat task manager (windows) dan top (Linux). Dengan memperhatikan tool, umumnya kita bisa melihat apakah kita butuh lebih banyak memori (free memori selalu rendah atau pemakaian swap tinggi), butuh CPU yang lebih baik (CPU usage selalu tinggi), atau butuh SSD/NVME (nilai “wa” di top tinggi, atau akses disk tinggi di task manager).

Untuk CPU saya mendasarkan pemilihan pada benchmark dari http://cpubenchmark.net/ . Pertimbangan lain adalah harga, saya tidak mau menghabiskan uang 2X lipat jika performance yang didapatkan hanya bertambah sedikit (lebih baik menunggu sampai harga turun).

Perlu diperhatikan juga program spesifik yang kita pakai, contohnya IDA Pro butuh waktu lama untuk mendecompile fungi kompleks, tapi proses dekompilasi ini tidak multi thread, dan juga tidak memakai 100% CPU. Jadi memakai CPU yang 2x lebih cepat sama sekali tidak membantu mempercepat proses dekompilasi.

Sekedar tips, jika ingin merakit PC dan ingin melakukannya jangka panjang, maka:

  • belilah casing yang bagus, akan tahan lama
  • belilah PSU yang bagus dan modular, walau kabel tetap berantakan tapi sedikit lebih baik
  • belilah keyboard yang bagus (kalau suka mekanis, beli yang mekanis) karena akan tahan lama

Demikian cerita singkat ngalor-ngidul mengenai merakit dan mengupdate PC. Berikutnya saya perlu menambah storage di Thinkpad X230 saya.

Insiden Google Play: CC Niaga dicharge 100x lipat

Cerita ini tentang kejadian yang saya alami dua hari lalu: membeli koin game seharga 5 ribu rupiah di Google Play tapi tercharge 500 ribu rupiah di CC Niaga (5 transaksi, jadi 2.5 juta rupiah). Masalahnya bisa diselesaikan setelah menelpon dan juga membatalkan transaksi dari Google Play. Nah sekarang cerita lengkapnya.

Saya cukup jarang membeli koin game dari Google Play. Pernah membeli agak banyak karena pernah dapet voucher Google Play, tapi dalam kasus tersebut tidak ada masalah, karena tidak terhubung ke kartu kredit. Koin yang saya beli adalah untuk game Pokemon Go dari perusahaan Niantic.

Niantic memiliki sistem pricing yang aneh: akan lebih murah membeli 100 koin berkali-kali dibandingkan langsung mengeluarkan uang banyak. Perhatikan gambar ini:

  • 100 Pokecoin 5 ribu rupiah
  • 550 Pokecoin 75 ribu rupiah

Sedangkan jika saya membeli 100 pokecoin x 6 = 600 pokecoin, dengan hanya 5 rb x 6 = 30 ribu rupiah. Ini saya jelaskan supaya bisa dimengerti alasan kenapa saya perlu membeli berkali-kali. Saya memilih menggunakan account indonesia, karena dengan account Thailand, harga koin menjadi hampir 2x lipat (harga 100 pokeoin 5000 rupiah menjadi 20 baht atau 9200 rupiah).

Perhatikan juga: tidak ada item yang harganya tepat 500 ribu rupiah, ada yang lebih dan ada yang kurang, tapi tidak ada yang tepat 500 ribu rupiah. Yang paling dekat adalah 589 ribu, dan di bawahnya 299 ribu. Jadi tidak mungkin saya salah beli/salah tekan yang hasilnya 500 ribu rupiah.

Saya berencana membeli 14 kali (1400 koin), totalnya seharusnya 70 ribu rupiah. Pembelian pertama sampai kelima berhasil, tapi ketika yang keenam saya dapat pesan: kartu ditolak. Saya pikir: hmm mungkin ada fraud detection. Mungkin karena ada banyak pembelian berulang dalam waktu singkat, jadi kartunya ditolak.

Saya teringat lagi bahwa saya masih punya pulsa XL karena dulu pernah dapat dari menemukan bug di situs isi pulsa (bug sudah dilaporkan dan dapat reward). Dan ternyata dengan account Google Indonesia saya bisa membeli memakai pulsa XL. Dan saya teruskan pembeliannya dengan XL, 9 pembelian berikutnya berhasil.

Saya mendapat notifikasi (14 email) dari Google via email. Semua sesuai yang diharapkan. Perhatikan: 100 koin dengan harga 5000 rupiah. Total 5000 rupiah.

Tapi beberapa jam kemudian saya dapat SMS Horror. Saya bukan dicharge 5 ribu rupiah, tapi 500 ribu rupiah, per transaksi. Meski hanya ada 3 SMS, tapi CS niaga memastikan bahwa jumlah transaksinya 5, bukan 3.

Sejujurnya, walau sering dapat SMS notifikasi tapi sering kali tidak saya perhatikan seksama karena biasanya bank selalu benar. Asalkan saya merasa memang melakukan transaksi, ya notifikasinya pasti benar. Tapi untungnya kali ini saya perhatikan dengan seksama jumlah nolnya.

Pikiran pertama saya adalah: mungkin sistem notifikasinya salah. Saya cek saldo kartu kredit online: benar, semua limit kartu kredit saya habis. Untungnya limit kartu saya ini sangat rendah (< 3 juta rupiah), kartu ini lebih sering saya pakai untuk pentesting.

Berikutnya: saya telepon ke Niaga. Tips: lihat SMS dengan seksama, ada nomornya di situ. Saya sempat mencoba +622114041 (yang tercantum di web niaga) tapi selalu gagal. Konyolnya, saya sempat salah tekan bukan 14041, tapi 14045 dan nyasar ke McD.

  • Memakai 006/001, dia langsung +622114041 tidak bisa dari Thailand
  • Memakai Skype bisa, tapi ketika mulai berbicara dengan CS, tiba-tiba audionya beralih ke call orang lain (sepertinya bug Skype, saya coba 2x hasilnya sama)

Saya menghubungi CS karena ingin benar-benar yakin bahwa transaksinya 500 ribu rupiah, dan bukan kesalahan di sistem notifikasi dan web CIMB Niaga. Jawaban CS adalah: benar transaksinya sebesar itu, coba kirim bukti-bukti ke [email protected]

Sebelum mengirimkan bukti, saya segera terpikir untuk segera membatalkan transaksi di Google Play. Sayangnya di Google Play opsi alasan yang ada hanya sangat sedikit. Sebenarnya tidak ada alasan yang cocok dengan masalah saya. Tidak ada cara mudah menghubungi Google, jadi saya pilih alasan apa saja. Empat transaksi pertama berhasil dibatalkan, tapi yang kelima gagal.

Akhirnya saya kirim bukti-bukti ke Niaga dan segera dibalas dengan meminta nomor kartu saya. Sebenarnya saya merasa kurang nyaman dan aman mengirimkan nomor CC via email (karena pada dasarnya email itu tidak aman), tapi karena limitnya sangat rendah, ya sudah lah.

Hari ini saya belum mendapat kabar resmi dari Niaga (katanya memang akan dihubungi dalam 3 hari, jadi masih wajar). Tadi saya cek online semua saldo kartu kredit sudah kembali normal, jadi saya putuskan untuk menuliskan ceritanya. Sampai saat ini saya tidak tahu salah siapa ini, dan apakah banyak yang terpengaruh. Kalau Anda belum lama ini berbelanja di Google Play dengan kartu kredit, coba cek tagihannya.

Penutup

Siapa saja bisa menjadi korban “sial” sistem komputer. Setiap sistem bisa bermasalah, atau dalam kasus saya dua sistem yang berhubungan bisa memiliki bug. Sekarang saya selalu berusaha memiliki backup untuk berbagai hal yang sifatnya terkomputerisasi, misalnya:

  • memiliki dua rekening bank, masing-masing memiliki kartu ATM
  • memiliki dua nomor telepon (dan tetap memelihara nomor Indonesia andaikan ada masalah)
  • memiliki backup di cloud provider terpisah

Saya bersyukur karena banyak hal:

  • Masalahnya bisa diselesaikan dengan cepat
  • Kartu yang saya pakai memiliki limit yang rendah sehingga gagal di transaksi ke-5. Andaikan limitnya tinggi, saya akan tercharge 7 juta rupiah.
  • Tidak sedang butuh memakai kartunya segera

Bisa dibayangkan betapa sedihnya kalau gara-gara game, kartu terblokir, lalu butuh itu untuk membayar tagihan penting.

Tulisan ini sekaligus juga sebagai pengingat: periksalah berbagai SMS dan Email notifikasi yang masuk dari Bank.