Bisa bahasa pemrograman apa?

Sering ada yang bertanya ke saya: pak, bisa bahasa pemrograman apa aja sih? Biasanya hanya saya jawab: banyak (karena memang banyak). Tapi di posting ini saya ingin cerita lebih lengkap tentang bahasa-bahasa yang pernah saya pakai. Karena sudah lebih dari 25 tahun sejak saya belajar bahasa pemrograman pertama sudah banyak yang saya coba.

Sumber: TIOBE Index

Saya pertama kali belajar sendiri bahasa BASIC di IBM PC dan juga di Apple II/e ketika masih SMP. Karena belajar sendiri jadinya kurang terstruktur, tapi BASIC sangat berkesan buat saya. Saya sekarang tetap ingat bagaimana memprogram dalam BASIC (dan sempat mengajari juga dasar-dasarnya ke Jonathan). Saya bahkan sempat membeli AppGameKit, sebuah tool untuk membuat game dengan bahasa BASIC modern

Program iseng dalam BASIC/App Game Kit yang hampir seribu baris

Ketika SMU, saya belajar Pascal juga ototidak (contoh berbagai program hasil otodidak bisa dilihat di posting ini). Waktu kuliah di ITB, bahasa Pascal juga diajarkan jadi saya lebih paham lagi, termasuk juga untuk membuat berbagai struktur data. Saya sempat belajar Visual Basic, dan sempat membuat beberapa aplikasi tapi ketika kenal Delphi, ini jadi bahasa favorit saya karena bahasanya memang sangat dekat dengan Pascal tapi visual.

Bahasa yang masih saya pakai sehari-hari sampai saat ini adalah C dan juga C++. Beberapa contoh aplikasi yang saya buat: Alkitab untuk OS Symbian dan Blackberry 10. Beberapa karya saya dalam C bisa dilihat di Github. Saya merasa cukup paham C, karena bisa membayangkan translasinya ke assembly. Walaupun sudah memakai C++, saya sering merasa ada hal-hal mengejutkan yang saya temui.

Pengetahuan saya mengenai bahasa R sangat terbatas. Saya mengenal bahasa ini hanya karena pernah membimbing anak buah di kantor untuk integrasi C++ dengan R. Jadi saya sekedar bisa membaca dan membuat skrip kecil sekedar testing integrasi, tapi tidak pernah menulis skrip besar dalam R.

Di kampus dulu kami juga diajari Lisp, ini masih saya pakai untuk konfigurasi editor Emacs. Di kampus juga diperkenalkan bahasa Prolog dan Fortran, tapi keduanyatidak pernah saya pakai lagi sejak lulus. Walau tidak memprogram dalam Fortran, ada beberapa library Fortran yang dipakai di kode C++, jadi secara tidak langsung pengetahuan Fortran masih berguna.

Bahasa pemrograman untuk web yang pertama kali saya pelajari adalah Perl. Tentunya Perl ini tidak hanya untuk memprogram web, tapi bisa dipakai untuk membuat berbagai aplikasi command line. Saya pernah menulis seri artikel belajar Perl dulu di majalah Master Web.

Sekarang saya tidak pernah lagi memprogram dalam Perl dan lebih sering memakai Python untuk berbagai skrip yang saya tulis. Berbagai aplikasi web kecil untuk keperluan internal kantor juga saya buat dalam Python. Ketika belajar Machine Learning, ada lebih banyak library dalam Python.

Dalam pelajaran Machine Learning dari Coursera, MATLAB juga dipakai (tepatnya saya memakai Octave, software open source yang cukup kompatibel dengan MATLAB). Dari dulu saya sering membantu berbagai program kecil MATLAB teman-teman di ITB, tapi tidak pernah benar-benar mendalami bahasanya.

Di kampus dulu saya sempat bekerja di ITB untuk mengolah data ITB. Untuk konektivitas hardware (Scanner dan Printer) bahasa yang dipakai adalah Java. Java merupakan bahasa dinamik yang saya pahami sampai internalnya (level byte codenya). Saya juga cukup hapal semua API dasarnya (maklum dulu belum ada Stack Overflow jadi baca dokumentasi JDK hampir tiap hari sampai hapal). Sampai sekarang saya masih cukup fasih memakai Java karena masih sering berhadapan dengan ini. Di jaman Blackberry saya juga membuat berbagai aplikasi dalam Java.

Meskipun sudah belajar dasar-dasar Kotlin, tapi saya belum merasa mahir memakai ini. Di kepala saya, saya bisa membayangkan tiap kode Java akan seperti apa bytecodenya, tapi untuk Kotlin saya tidak selalu bisa memetakan hal tersebut. Padahal Kotlin ini seharusnya kompatibel dengan Java, tapi karena belum paham internalnya, saya merasa kurang nyaman.

Groovy adalah bahasa lain yang masih berhubungan dengan Java. Saya hanya mengenal ini karena ini dipakai oleh Gradle. Sejauh ini saya merasa kurang nyaman dengan Syntax ekstranya dan lebih memilih Java saja jika memang menargetkan JVM.

Di tahun 2000an PHP mulai sangat populer dan beberapa aplikasi mulai dibuatkan versi webnya. Ketika saya bekerja di kampus, PHP juga dipakai untuk menampilkan berbagai data ke publik. Saya mulai memakai PHP sejak versi 3. Pengetahuan PHP ini juga sangat berguna untuk pentesting.

Saya belajar Javascript sejak jaman awal memakai web dulu. Dulu saya hanya membuat skrip-skrip kecil untuk menambah interaktivitas web. Saya sempat meninggalkan bahasa ini, tapi sejak ES6 mulai mengikuti lagi. Saya sempat mendalami JS ketika membuatkan sebuah aplikasi berbasis AngularJS untuk organisasi teman yang butuh aplikasi mendadak. Sampai saat ini saya tidak pernah membuat aplikasi serius di sisi server dengan nodejs (menurut saya PHP atau Python lebih praktis untuk kebanyakan aplikasi sisi server). Saat ini yang Javascript saya pakai untuk membuat browser extension untuk dipakai sendiri.

Saya kenal bahasa Ruby dan bisa memakainya. Saya bahkan pernah menyelesaikan CTF yang memakai bytecode Ruby. Tapi saya tidak pernah mahir dalam Ruby karena sejujurnya: saya tidak pernah menemukan kasus di mana saya memilih Ruby. Untuk website saya lebih suka memakai Python (Django atau Flask tergantung sebesar apa webnya), sedangkan untuk berbagai scripting ada lebih banyak library Python yang tersedia. Secara umum Python juga lebih cepat.

Saya belajar bahasa Lua ketika memprogram dengan game framework Marmalade. Dulu saya bisa dapat gratis gamepad dari Blackberry jika mengirimkan game dengan framework tersebut. Ketika memakai ESP8266 saya juga kadang memilih Lua untuk berbagai aplikasi sederhana.

Selagi membuat game untuk Jonathan dulu saya sangat tertarik dengan bahasa Haxe. Saya suka dengan bahasa ini karena cukup dekat dengan ActionScript 3 (saya hanya tahu AS3 ini, tapi tidak bisa Action Script 2). Haxe bisa dikompilasi menjadi kode C++, ActionScript 3, Javascript dsb.

Saat ini saya memahami beberapa bahasa assembly untuk beberapa platform: x86 (16 bit sampai 64 bit), ARM (thumb, ARM32, dan ARM64), MIPS (MIPS32), AVR, dan 6502. Saya kenal berbagai bahasa ini dalam rentang waktu lama. Contohnya: saya belajar assembly x86 16 bit di jaman DOS. Saya belajar ARM sejak memakai Symbian (dan tahun lalu menang CTF dengan hadiah ke Hongkong karena skill ini). Saya belajar AVR sejak belajar Arduino (terpakai untuk RHME sampai dapat training ke Belanda), belajar MIPS ketika memakai router dengan prosessor MIPS dan belajar 6502 karena tertarik dengan game lama.

Saya sempat tertarik juga memprogram dalam bahasa Forth (pernah saya tuliskan di sini), tapi tidak ketemu akan diaplikasikan di mana. Sekarang berbagai board murah (misalnya ESP8266 dan ESP32) bisa diprogram dengan C/C++ dan hasilnya sudah sangat cepat sedangkan jika butuh eksplorasi Javascript, Micropython dan Lua juga tersedia.

Untuk shell scripting, saya hanya fasih menggunakan bash. Shell lain juga bisa tapi saya sering kali harus membaca dulu manual pagenya. Biasanya saya mengkombinasikan bash shell ini dengan GNU Awk. Di Windows saya bisa memakai batch file (batch versi Windows saat ini hanya berbeda sedikit dari jaman DOS dulu). Saya mengerti Powershell dan ketika mengikuti Flare on ada beberapa persoalan membongkar skrip Powershell, tapi saya kurang mahir memakai ini.

Meskipun sudah banyak membaca mengenai Go, tapi saya belum pernah membuat program serius. Jika sekedar ingin membuat skrip kecil, Python masih lebih enak (contoh: membaca file per baris di Go lebih ribet daripada di Python), sedangkan jika butuh performance lebih tinggi: C++ masih lebih bagus dan sekarang dengan C++11 ke atas, syntax C++jadi semakin mudah dibaca. Go sepertinya lebih cocok jika butuh sesuatu yang konkuren, tapi tergantung jenis konkurensi yang diinginkan, ini pun bisa dilakukan dengan mudah di C++ (threading sudah jadi standar di C++11).

Dalam Index TIOBE, SQL termasuk dalam bahasa pemrograman. Saya paham SQL standar, dan saya juga tahu dialek Mysql, SQLite dan PostgresSQL. Untuk DBMS lain seperti MS SQL dan Oracle, saya belum pernah menulis sendiri Stored Procedure (walau sering membaca topik ini karena masalah SQL Injection).

Dalam dunia .NET saya hanya paham C#. Saya juga bisa membaca Visual Basic .NET karena sangat dekat syntaxnya dengan C# tapi saya akan kesulitan jika harus menulis kode baru dengan Visual Basic .NET. Pengetahuan saya mengenai C# dan teknologi .NET secara umum tidak sedalam pengetahuan saya mengenai Java.

Meskipun belum pernah membuat aplikasi besar, saya cukup mengenal Objective C. Ini saya pelajari dulu waktu beli iBook pertama yang masih memakai Power PC. Saya sempat belajar Swift versi pertama, tapi kemudian Apple beberapa kali mengubah bahasanya, dan sampai sekarang saya belum berusaha mengikuti lagi.

Sekarang bahasa yang berusaha saya dalami adalah Rust. Dulu saya mengikuti bahasa ini, tapi kemudian ada beberapa perubahan dan kemudian saya menunggu lagi sampai bahasanya stabil. Sekarang ini sepertinya sudah cukup stabil, walau masih ada beberapa fitur yang masih akan diperkenalkan untuk mempermudah pemakaian bahasa ini.

Rust ini didengungkan sebagai bahasa yang type safe, dan ini mengingatkan saya pada Ada yang dulu diajarkan di kuliah. Saya melupakan bahasa Ada ini cukup lama sampai Bos menyebutkan bahwa ada rekannya di Jerman yang mulai memakai lagi Ada, setelah itu saya sempat melihat-lihat lagi. Andaikan ada cukup banyak library untuk Ada, sepertinya saya ingin lagi mencoba membuat program dalam Ada.

Untuk mengajari Jonathan saya jadi belajar Scratch (bahasa visual untuk anak anak). Selain itu saya jadi belajar bahasa pemrograman Logo karena Jonathan membaca seri buku Secret Coders.

Meskipun saya sudah belajar banyak bahasa dan memakai di aplikasi nyata, ada banyak bahasa lain yang saya mulai tapi tidak saya teruskan.

  • Bahasa D: keuntungannya dibandingkan C tidak terlalu banyak, IDE yang support bahasa ini juga sedikit
  • Erlang dan Elixir: sebenarnya ini menarik dan sempat tertarik karena dipakai oleh ejabberd dan RabbitMQ, tapi saya tidak menemukan kasus (untuk saya pribadi) di mana bahasa ini cocok
  • Haskell: ini menarik, tapi menurut saya kurang praktis
  • COBOL: sempat baca-baca dan coba-coba karena kenal dengan developer di bank yang sedang belajar ini. Tujuannya teman saya itu mau menggantikan seniornya, sedangkan saya hanya iseng jadi tidak diteruskan
  • Dart: tadinya tertarik, tapi pemakaiannya terbatas. Sekarang dengan adanya flutter saya jadi ingin coba lagi
  • Scala: bahasanya ribet banget

Lalu ada bahasa-bahasa yang belum pernah saya sentuh sama sekali misalnya: SAS, LabView, Ladder Logic, dsb. Ini biasanya memang hanya untuk dipakai di tempat tertentu saja dan kebetulan saya belum pernah butuh itu.

Penutup

Perlu ditekankan bahwa sejak belajar bahasa pertama (BASIC) hingga saat ini sudah lebih dari 25 tahun. Sepertinya saat ini saya tahu kurang dari 25 bahasa, dan hanya benar-benar menguasai sekitar 10 saja (dalam arti cukup percaya diri untuk membuat produk dalam bahasa tersebut).

Rata-rata saya butuh waktu beberapa tahun memakai satu bahasa sampai merasa nyaman dengan bahasa itu. Jadi jangan merasa harus belajar banyak bahasa sekaligus dalam waktu singkat. Saya dulu mempelajari tiap bahasa ini biasanya diawali oleh suatu alasan:

  • Minat sendiri: waktu belajar BASIC dan Pascal
  • Memang wajib di kuliah: Prolog, Fortran, Lisp
  • Diperlukan dalam pekerjaan: waktu belajar PHP dan Java
  • Coba-coba tren: Ruby (karena Ruby On Rails)

Biasanya jika ada tujuan khusus membuat sesuatu maka saya lebih cepat bisa menguasai bahasa itu. Jika tidak ada tujuan khusus, maka saya sekedar tahu, lalu lupa lagi.

Jika sudah memiliki dasar yang kuat di satu bahasa, beberapa bahasa lain akan mudah dipelajari. Contoh: secara konsep C# dan Visual Basic .NET tidak jauh berbeda hanya Syntaxnya yang beda. Jika sudah memiliki dasar Java, beberapa bahasa lain turunannya seperti Kotlin dan Groovy mudah dipelajari. Bahasa dengan paradigma fungsional memang sangat bebeda dengan bahasa prosedural, tapi jika sudah menguasai salah satunya, mempelajari yang lain juga tidak sulit.

Saya menuliskan ini jadi bernostalgia dengan masa-masa belajar tiap bahasa di atas. Untuk para pemula: santai saja, belajarlah setahap demi setahap dan buatlah sesuatu ketika belajar bahasa baru.

Mencari bug

Ada yang bertanya ke saya: bagaimana sih caranya mencari bug di aplikasi? Karena jawabannya tidak bisa ditulis singkat di chat, di tulisan kali ini saya akan berusaha menjawab pertanyaan itu.

Apa itu bug?

Kalau Anda disuruh mencari sebuah benda tapi tidak tahu benda itu seperti apa bentuknya maka Anda tidak akan bisa menemukannya (Contoh: tolong ambil logic analyzer di laci saya). Sama halnya dengan bug: pertama pahami dulu berbagai jenis bug yang ada, baru Anda bisa menemukannya.

Contoh-contoh bug web misalnya: SQL Injection, IDOR, XSS, dan command injection. Contoh bug aplikasi misalnya: buffer overflow. Selain tahu apa itu sebuah bug, kita juga perlu tahu bagaimana cara mengeksploitasinya.

Black box testing

Ini testing yang paling umum. Kita coba-coba berbagai input dengan harapan keluar suatu pesan error yang bisa menunjukkan kesalahan di sebuah program. Contoh kecil: jika ada input petik tunggal (‘) dan programnya menampilkan SQL error, maka kemungkinan ada bug SQL injection.

Tentunya coba-coba ini harus yang masuk akal. Ini biasanya tergantung pada: aplikasinya seperti apa, servernya memakai OS apa. Contoh: berusaha melakukan command injection dengan berbagai command Windows di server Linux maka tidak akan berhasil. Berusaha melakukan angular template injection di aplikasi yang tidak memakai Javascript juga tidak akan berhasil.

Intinya: meskipun ini adalah black box testing, yang sepertinya sekeda menebak-nebak, ada hal-hal masuk akal yang bisa kita coba. Jika kita ingin membeli suatu barang, kita bisa mencoba mengganti nilai pembelian, berusaha membypass proses pembayaran, dsb.

White box testing

Jika kita memiliki akses ke source code, maka kita bisa mencari bug dengan membaca source code aplikasinya. Source ini bisa didapat dari beberapa cara:

  • Aplikasinya memang open source (contoh: berbagai aplikasi web seperti WordPress ada source codenya)
  • Dari hasil dekompilasi (contohnya: berbagai game bisa didekompilasi)
  • Dari bug lain (contoh: jika menemukan bug web untuk membaca sebuah file, maka bisa kita manfaatkan untuk membaca source code aplikasi)

Nah di sini kemampuan membaca source code diperlukan. Dengan adanya source code, kita bisa melihat alur program dan menentukan apakah sebuah input dicek atau tidak, dan apakah inputnya bisa dipakai untuk membypass sesuatu atau mengeksekusi apa yang seharusnya tidak boleh dieksekusi.

Memahami Tool

Untuk melakukan testing, kita perlu paham berbagai tool yang sesuai. Contohnya untuk testing aplikasi web, kita sebaiknya memakai intercepting proxy (seperti Burp atau Zaproxy). Dengan memakai tool tersebut, kita bisa mengganti request dari browser atau dari aplikasi baik desktop maupun mobile yang akan berkomunikasi dengan server di internet.

Untuk testing aplikasi mobile, keahlian mengekstrak package, melakuan dekompilasi diperlukan. Berbagai tools yang spesifik juga bisa dipakai (misalnya XPosed Framework di Android, atau Frida di berbagai OS lain).

Fuzzing

Untuk bug jenis tertentu, kita bisa memakai tools untuk melakukan fuzzing. Intinya adalah mencoba-coba berbagai input secara otomatis. Ini bisa diaplikasikan ke aplikasi web, atau bahkan aplikasi desktop (contohnya ada yang namanya AFL). Penggunaan fuzzer ini relatif mudah, tapi hasilnya tetap harus dipahami oleh orang yang memiliki skill.

Otomasi

Sebagian bug bisa ditemukan dengan menggunakan tool otomatis. Saya tidak akan membahas ini secara dalam. Intinya ada beberapa scanner aplikasi web yang bisa menemukan berbagai bug yang umum. Ada juga source code analyzer yang bisa menemukan berbagai masalah di source code.

Penutup

Mencari bug kadang mudah kadang sulit, tergantung program yang kita cari bugnya. Sebagian orang yang meretas web tidak mencari bug khusus, tapi biasanya yang terjadi seperti ini:

  • ada yang menemukan bug di aplikasi tertentu (contoh: Drupal)
  • ada yang membuat exploit untuk bug tersebut
  • script kiddies menggunakan Google untuk mencari website yang memakai Drupal (dengan dorking, misalnya mencari “Powered By …”
  • script kiddies mencoba exploit drupal pada website yang ditemukan

Selamat mencari bug.

Membaca Buku Digital

Posting ini sekedar mengupdate bagaimana sekarang saya membaca buku elektronik. Tahun 2012 saya sudah mulai memakai Kindle dengan eink, dan mulai membeli konten dari Amazon. Sekarang sudah 7 tahun sejak Kindle pertama yang saya beli.

Kindle pertama sudah rusak (terinjak waktu menggendong Jonathan), lalu sudah beli lagi Kindle keyboard 3G dan Kindle paperwhite. Sekarang keduanya masih ada dan kadang masih dipakai untuk membaca jika ada cerita fiksi yang sedang saya sukai.

Kindle e-ink masih enak untuk membaca buku fiksi/non teknis yang tidak perlu dibaca acak. Untuk buku teknis yang harus bolak balik mengecek ke halaman lain, Kindle terasa sangat lambat dan layarnya kurang besar. Saya lebih suka membaca dengan kindle yang klasik, lebih terasa seperti kertas. Sayangnya yang klasik ini tidak bisa dibaca dalam gelap.

Selain masalah sifatnya yang seperti kertas, batere kindle cukup tahan lama. Asalkan kita tidak menyalakan fitur wirelessnya, baterenya masih cukup untuk beberapa minggu dengan pemakaian ringan (atau beberapa hari jika cukup berat). Dulu saya pikir kindle ini bakal jadi pegangan ketika liburan supaya tidak terlalu memikirkan batere, kenyataannya tetap saja saya lebih sering memegang HP.

Handphone memang lebih praktis karena selalu dibawa ke mana saja, sedangkan repot sekali membawa Kindle ke mana-mana jika tidak berniat secara khusus membaca sesuatu. Biasanya saya mulai dulu membeli dan membaca sebuah buku di HP, dan jika terasa menarik, saya download juga kontennya di kindle lalu saya teruskan baca di Kindle karena layar HP (yang sudah 6 inch) masih terasa terlalu kecil untuk membaca teks panjang.

Beberapa minggu terakhir ini saya memakai iPad untuk membaca dan sejauh ini cukup suka. iPad sangat cocok untuk membaca buku teknis, PDF readernya sangat cepat dan layarnya cukup besar untuk menampilkan semua informasi. Batere iPad juga cukup tahan lama dibandingkan HP.

Untuk konten, saya tetap membeli dari Amazon karena masih yang paling murah. Pernah saya menghabiskan pulsa Telkomsel hasil pentesting untuk membeli beberapa buku bahasa Indonesia dan pernah juga saya mendapatkan satu kupon dari Google Play Books dan membeli satu buku, tapi selain itu belum pernah membeli buku lain.

Sekarang saya juga sedang trial Scribd yang memiliki cukup banyak buku fiksi yang menarik (misalnya dari Stephen King, Agatha Christie dan Terry Pratchett) , tapi sayangnya belum punya cukup banyak waktu untuk membaca. Biasanya jika saya sudah mulai membaca cerita yang menarik jadi penasaran dan terus membaca, jadi kalau belum punya waktu sangat banyak, saya urungkan dulu membaca buku non teknis.

Konten teknis sekarang saya dapatkan dari Safari Books Online. Ini sangat praktis dan bisa diakses dari HP, web, dan juga dari iPad. Sesekali saya membeli juga buku dari humble bundle jika ada yang menarik (dan tidak ada di Safari Books). iPad juga memiliki fitur print to PDF, jadi berbagai blog teknis kadang saya save menjadi PDF untuk dibaca menggunakan software iBooks.

Seminggu terakhir ini saya juga mencoba menggunakan Apple Pencil untuk memberikan anotasi dan juga untuk mencatat. Sejauh ini Apple Pencil memang sangat nyaman dipakai, tapi saya belum optimal untuk tujuan utamanya: untuk membaca dan mencoret-coret berbagai paper.

Saya belum terbayang bagaimana saya akan membaca buku di masa depan. Mungkin di masa depan jika teknologi layar lipat sudah semakin murah dan bagus, sehingga tidak perlu lagi membawa-bawa tablet.

Tips Android: Print To PDF

Biasanya untuk mengabadikan posting facebook atau chat, semua orang menggunakan fitur screen capture. Untuk keperluan semacam itu, screen capture memang praktis, tapi untuk dokumen dan artikel web yang panjang menyimpan jadi PDF lebih praktis.

Kenapa print/save ke PDF, kenapa tidak mengirim link web saja? Beberapa artikel tidak bisa diakses orang lain (misalnya: blokir kominfo, atau sumbernya dari situs internal). Dalam beberapa kasus, format PDF yang diminta (tidak boleh PNG/JPG).

Format PDF memungkinkan kita mencari teks di dalamnya dan juga copy paste, sedangkan jika memakai format gambar ini tidak bisa dilakukan. Dalam keadaan terpaksa gambar bisa di berikan ke software OCR (optical character recognition) agar bisa diekstrak teksnya, tapi seringkali proses ini tidak berhasil 100%.

Android bisa dihubungkan ke berbagai jenis printer. Defaultnya printernya hanya bisa “save to pdf” tapi kita bisa mendownload berbagai driver printer untuk HP, Canon dsb jika ingin memakai printer fisik. Selain itu ada juga printer virtual (Cloud Printer) dari Google yang akan menyimpan hasil PDF langsung ke Google Drive.

Di Google Chrome, kita bisa menekan menu lalu share maka akan muncul “Print”.

Print preview akan muncul dengan daftar printer dan juga pilihan “Save as PDF”

Setelah mencoba-coba berbagai browser. Firefox memiliki menu khusus Save as PDF. Hasil Save as PDF Firefox lebih bagus dibandingkan Chrome untuk dibaca di desktop.

Demikian tips singkat dari saya. Ini saya tuliskan supaya gampang memberi tahu ke orang bagaimana proses menjadikan PDF.

Tools untuk persoalan matematika

Sebenarnya tidak terlalu banyak persoalan matematika yang saya hadapi tiap hari, tapi jika ketemu biasanya saya akan menggunakan berbagai tool yang saya tahu. Untuk penjumlahan, perkalian biasa saya biasanya memakai Python karena sudah bisa langsung menangani big number.

Untuk persoalan tertentu, Wolfram Alpha di Raspberry Pi (versi gratis) atau Mathematica (desktop, saya tidak punya ini) bisa sangat membantu. Contohnya ketika ada yang mengirimkan teka-teki ini, saya memakai wolfram.

Terjemahan soalnya ke Wolfram sangat langsung

Beberapa kali saya juga menyelesaikan soal CTF dengan Wolfram, misalnya ini (persamaan linear), ini (persamaan modular) dan ini (visualisasi point 3d).

Ketika membaca buku murderous math, Jonathan sangat tertarik dengan bilangan prima. Beberapa kali dia bertanya apakah N bilangan prima? dia bahkan membuat daftar dengan metode Sieve of Erathosthenes, tapi karena tulisannya tidak rapi, kadang salah markingnya. Di command line Linux dari paket coreutils ada tool bernama factor. Ini bisa dipakai untuk memfaktorkan bilangan kecil

Magic Square, fungsi menghasilkan Magic Square ini tidak ada secara default di Wolfram, tapi saya tahu ini ada di Octave/Matlab.

Ada berbagai metode untuk menghaslikan magic square ini secara manual (misalnya staircase method). Berbagai contoh online juga ada, tapi jika ingin sekedar menunjukkan ke Jonathan Magic Square yang ditambah dengan konstanta N, memakai octave ini lebih gampang.

Dulu waktu SMU saya memakai software MathCad untuk komputasi simbolik matematika. Saya bisa menuliskan ekspresi matematika, dan melakukan diferensiasi/integrasi secara simbolik. Ini dulu sangat berguna untuk mengecek apakah “rumus cepat” dari bimbingan belajar memang benar dan apakah berlaku untuk semua kasus. Sekarang ada Wolfram Alpha yang bisa memberikan jawaban serupa (dan versi berbayar yang menyediakan langkah-langkahnya).

Seperti yang saya sebutkan di atas, persoalan matematika yang saya hadapi tidak banyak, jadi tool-tool yang saya pakai juga tidak banyak. Saya sekedar tahu permukaan berbagai tool tersebut, cukup untuk berbagai persoalan yang saya hadapi sehari-hari. Saya juga cukup senang tool-tool ini bisa dipakai untuk mengajari homeschool Jonathan.

Meninggalkan Flickr

Sebenarnya dari sekitar 5 tahun yang lalu kami sudah tidak mengupload lagi foto ke Flickr, tapi ada banyak foto di blog ini yang melink ke Flickr. Waktu itu kami masih berlangganan Flickr Pro (25 USD/tahun). Flickr kemudian menggratiskan foto sampai 1TB, dan kemudian merugi jadi akhirnya dijual ke perusahaan lain.

Sekarang jumlah foto pengguna gratis dibatasi (1000 foto saja) dan Flickr Pro sekarang 60 USD/tahun (jika dibayar per tahun, atau 6.99 jika dibayar bulanan). Jika kami beralih ke free, maka kami hanya bisa menyisakan 1000 foto (dan otomatis foto terlama yang dihapus), tapi rasanya kurang berguna juga langganan pro. Mereka memberi kesempatan untuk mendownload semua foto, tapi mensortir lagi semua foto tersebut akan butuh waktu. Jadi sekarang saya putuskan:

  • Langganan dulu pro selama beberapa bulan
  • Semua foto yang dilink dari semua blog kami akan didownload dan diupload kembali ke blog
  • Semua album yang banyak isinya diupload ulang ke Google Photos
  • Setelah selesai, hentikan langganan Flickr Pro

Hari ini sudah beres membersihkan blog ini dari link Flickr. Ketika bersih-bersih saya menemukan juga beberapa foto link eksternal (multiply dan beberapa layanan lain) yang sudah tutup jadi tidak bisa diakses lagi. Sepertinya cara yang paling aman melink sekarang ini:

  • Upload ulang fotonya di blog ini
  • Link ke sumber original

Jadi andaikan sumber aslinya sudah hilang pun, tetap ada arsipnya. Sebenarnya ini tidak penting bagi pengguna blog, karena jarang ada yang membaca posting lama, tapi ini penting bagi kami yang ingin punya arsip digital hidup ini.

Bug Insecure Direct Object References (IDOR)

Bug Insecure Direct Object References (IDOR) ini merupakan bug yang sangat sederhana, sangat umum dan biasanya sangat berbahaya. Intinya pengguna aplikasi bisa mengubah input sedemikian hingga bisa mengakses objek/data yang bukan miliknya.

Bug paling sederhana adalah jika ada URL seperti ini:

http://example.com/edit.php?produk=1

Jika kita ganti produk menjadi 2 (atau nilai lain) dan keluar detail produk yang seharusnya bukan milik kita, itu namanya IDOR. Sering kali bug IDOR tidak bisa dieksploitasi dengan sederhana seperti itu. Biasanya untuk mengeksploitasi bug semacam ini kita akan memanfaatkan intercepting proxy seperti burp suit atau zaproxy (pernah saya bahas di sini).

Kadang kala ketika berusaha mengedit suatu data, kita tidak bisa memakai IDOR, tapi ketika kita menekan tombol “UPDATE” dan datanya di POST ke server, ternyata kita bisa mengedit id produknya. Jadi dalam kasus ini kita bisa menimpa/update produk lain walaupun tidak bisa melihat hasilnya.

Dalam aplikasi mobile, IDOR ini juga banyak ditemui, tapi secara umum lebih sulit dieksploitasi. Pertama kita perlu mensetup proxy, lalu jika aplikasinya melakukan SSL pinning maka perlu dibypass, dan kadang kala di atas itu masih ada enkripsi custom.

IDOR yang tipenya sangat berbahaya adalah dalam aplikasi yang melibatkan uang. Sering kali saya temu kasus di mana kita bisa mengganti id pengirim transaksi sehingga bisa memindahkan uang dari satu account ke yang lain. Kebanyakan kasus ini terjadi pada aplikasi mobile yang mengakses API dari web dan dienkripsi dengan sangat ribet. Proteksi di sisi client sering kali lebih dipentingkan daripada sisi server.