Menghindari Mengingat dan Menghapal

Semua orang bisa mengingat banyak hal yang berkesan bagi mereka, tapi jarang yang bisa mengingat semua hal dengan baik. Karena kapasitas memori saya terbatas, saya  berusaha melakukan berbagai cara untuk berusaha tidak menghapal/mengingat sesuatu ini.

Sayangnya saat ini kita belum bisa mengupgrade otak dengan kapasitas memori lebih tinggi

Memahami

Cara pertama untuk tidak perlu mengingat adalah dengan memahami. Jika kita sudah paham sesuatu, maka biasanya kita akan ingat. Beberapa detail bisa dicek di search engine dan bisa melihat catatan. Memahami sesuatu memang tidak mudah baik itu konsep baru, bahasa baru, tools baru, tapi setelah paham akan lebih mudah untuk mengingat sesuatu.

Seperti kebanyakan orang, jika saya butuh sesuatu, saya akan cari di internet, lalu copy paste jika butuh satu perintah saja (misalnya bagaimana mengkonversi format tertentu). Tapi jika sudah dua-tiga kali copy paste perintah yang sama, saya coba baca manualnya untuk memahami perintah tersebut. Khusus untuk kode program, saya sangat khawatir kode yang saya copy paste mengandung bug, jadi saya akan baca dengan teliti dan memastikan solusinya sudah yang terbaik.

Salah satu yang yang penting yang perlu dipahami adalah: apakah sesuatu bisa diotomasi? jika tidak bisa, kata kunci apa yang perlu diingat supaya gampang jika harus mencari bantuan di search engine.

Belajar membaca dokumentasi

Sampai saat ini saya masih sering lupa berbagai perintah gdb selain yang saya pakai sehari-hari. Tapi tidak apa-apa karena mudah dicari di internet, dan juga di halaman “Info” gdb. Berbagai parameter command line juga tidak saya hapalkan, jadi saya hanya ingat yang saya pakai sehari-hari.Biasanya saya hanya mengingat apakah program ini punya fitur X, detail parameternya dicek lagi nanti di man page atau info.

Beberapa program fiturnya sangat banyak sehingga mustahil diingat.  Dalam kasus ini mau tidak mau kita perlu belajar membaca dokumentasi. Contoh program yang fiturnya sangat banyak  adalah imagemagick. Program ini bisa melakukan hampir operasi apa saja terhadap gambar. dari mulai membuat gambar kosong, meng-crop, menambah teks, merotasi gambar, mengubah ukuran gambar, dan bahkan membandingkan dua gambar.

Otomasi

Kalau sesuatu bisa diotomasi, maka saya tidak perlu mengingat sama sekali. Jadi saya sudah mensetup berbagai skrip. Skrip ini ada yang otomatis (via cron), dan ada juga yang bisa saya jalankan ketika butuh.

Jangan heran kalau ditanya seseorang, saya tidak selalu bisa menjawab bagaimana caranya melakukan sesuatu dengan command line karena saya sudah membuat skripnya. Karena skripnya sudah tertulis, saya hanya perlu membuka lagi kalau memang ingin tahu.

Segala sesuatu yang sering saya lakukan akan saya simpan konfigurasinya, misalnya jika saya sering konek ke server tertentu, maka konfigurasinya saya simpan di .ssh/config, dan saya tidak perlu lagi mengingat nama user, nama domain, port, dsb. Di editor juga sudah saya set berbagai konfigurasi misalnya, ketika menyimpan file Python, selalu hapus “trailing whitespace” (spasi yang kadang ada di akhir baris):

(defun my-python-mode-before-save-hook ()
(when (eq major-mode 'python-mode)
(delete-trailing-whitespace)))

(add-hook 'before-save-hook #'my-python-mode-before-save-hook)

Sebagai tambahan: untuk mengedit teks kode, saya juga membuat abbreviation, misalnya “cstr<spasi>” menjadi “const std::string”. Awalnya saya harus ingat shortcut ini, tapi tidak lama kemudian sudah jadi refleks.

Search Engine

Sebagian besar yang tidak saya ingat bisa dicari di search engine asalkan tahu kata kunci yang tepat. Berbagai fitur search engine juga sebaiknya diketahui, misalnya bahwa kita bisa mencari di range tanggal tertentu, atau situs tertentu, atau hanya ingin mencari berita saja.

Meski banyak hal bisa dicari, kita harus ingat  keyword penting untuk pencarian. Misalnya untuk pencarian bahasa “go”, jangan gunakan “go” tapi gunakan “golang”. Jika mencari informasi smart card, biasanya perlu tambahan “pdu” atau “apdu” untuk memfilter agar artikel teknis yang muncul.

Foto

Jika sesuatu sulit diingat, maka perlu didokumentasikan, dan cara paling mudah adalah dengan foto. Kalau saya pergi ke suatu tempat, saya akan mengeluarkan HP dan memotret beberapa kali. Bahkan ke tempat yang sering saya kunjungi juga begitu, supaya ingat: kapan terakhir kali ke tempat itu. Foto dari HP juga sudah dilengkapi dengan lokasi GPS, jadi bisa digunakan untuk tujuan Google Maps jika perlu pergi ke tempat itu lagi.

Semua foto saya upload ke Google Photos, jadi gampang di-search, baik berdasarkan lokasi, nama objek maupun waktu. Google Photos sangat cerdas sehingga kita bisa mencari “elephant” dan akan keluar semua gambar gajah, atau “Chiang Mai Zoo” dan keluar semua gambar yang lokasinya di Chiang Mai Zoo.

Membuat Catatan

Jika butuh reminder sesuatu, saya menggunakan Google di Android untuk mencatat saat itu juga dengan suara. Misalnya jika di dokter gigi dan ingin mencatat kapan lagi harus cek gigi. Sekarang ini berbagai digital assistant cukup pintar dan bisa mengenali berbagai request dengan baik.

Saya juga memakai Google Keep untuk catatan yang sifatnya cukup panjang misalnya daftar komponen elektronik untuk dibeli. Ini juga berguna untuk menulis ide yang teringat sebelum tidur.

Kalau saya nemu link yang menarik, biasanya sekarang saya simpan di Telegram supaya gampang dicari. Dulu saya sering menyimpan di aplikasi Pocket, tapi jarang saya buka lagi sedangkan saya membuka aplikasi Telegram hampir tiap hari.

Untuk catatan yang terstruktur saya memiliki wiki personal (dengan mediawiki). Isinya apa saja yang pernah saya oprek dan hal-hal lain yang sulit saya ingat. Segala macam informasi tentang hardware yang saya miliki juga saya catat di situ.

Mencatat memang kadang membosankan, tapi sering kali saya menghemat waktu dengan catatan. Contoh beberapa kali ditanya UDID iPhone. Ini gampang dilihat dengan iTunes, tapi ketika saya di luar dan ditanya UDID-nya, maka jika saya tidak punya catatan akan cukup repot mencari tahu informasi ini.

Source Code

Dari dulu saya sering bereksperimen menulis banyak kode program dan kodenya biasanya saya biarkan saja, tidak dihapus tapi juga tidak disimpan khusus. Tapi sekarang hampir semuanya saya masukkan git karena ternyata saya sering butuh hasil eksplorasi sebelumnya. Saya memakai server saya sendiri untuk proyek personal saya (dengan software gitolite).

Saat ini isinya sudah ratusan repository (waktu tulisan ini dibuat: 269 repository). Isinya kebanyakan proyek yang tidak bisa dirilis ke umum, catatan pribadi, dan berbagai proyek pribadi yang tidak diselesaikan.

Untuk testing kode yang sifatnya algoritmik dan tidak butuh hardware khusus atau lingkungan khusus, saya memakai Jupyter Notebook. Dengan ini saya bisa mencoba-coba berbagai algoritma dasar, biasanya sih untuk oprek masalah enkripsi ketika melakukan CTF dan pentest.

Penutup

Tentunya ada juga hal-hal yang tetap tidak bisa diingat. Beberapa hal juga sulit diotomasi, misalnya kalau ketemu X, bawakan bumbu Y. Nah belum tahu kapan ketemu dengan orang X tersebut (kadang di tempat les anak, kadang di jalan, dsb), jadi sulit membuat remindernya. Tidak bisa juga bumbu disimpan lama di mobil, jadi tetap harus ingat sebelum pergi janjian untuk membawa barangnya ke mobil. Untuk hal-hal yang sulit diingat seperti itu, saya mengandalkan istri saya untuk membantu mengingat (walau kadang kami berdua tetap tidak ingat)

Tambahan terakhir: jangan berbohong. Mengingat detail kebohongan itu susah, jadi sebaiknya selalu jujur supaya tidak perlu banyak mengingat sesuatu.

 

Trik Reverse Engineering Kode Python

Entah kenapa akhir-akhir ini saya banyak melihat pertanyaan mengenai reverse engineering kode Python yang sudah di-obfuscate, baik di Facebook maupun Telegram. Sudah ada beberapa artikel dalam Bahasa Indonesia yang membahas ini misalnya Bermain dengan Python Bytecode dan  Reverse Engineering Python Bytecode. Kedua artikel itu sudah bagus, jadi saya sarankan untuk membaca kedua artikel itu untuk dasar reversing bytecode Python.

Artikel ini hanya ingin membahas trik untuk mempermudah revers engineering proteksi tertentu yang memakai marshal dan gagal didekompilasi.

Setelah membaca kedua artikel tersebut, beberapa hal yang penting diketahui adalah:

  1. Sebuah fungsi atau modul (file) python bisa didapatkan byte codenya (dengan marshal yang merupakan modul bawaan Python)
  2. Kita bisa mengeksekusi hasil marshal dengan exec marshal.loads(bytecode)
  3. File pyc sebenarnya hanyalah file marshal dengan header
  4. Bytecode bisa dilihat versi teksnya dengan dis (modul bawaan Python juga)
  5. Ada decompiler (uncompyle6) yang bisa mengembalikan (mendekompilasi) kode pyc  kembali menjadi kode Python, tapi ini tidak selalu berhasil

Beberapa proteksi yang dilakukan secara umum seperti ini:Kode python dicompile menjadi pyc, headernya dihapus, dan dijadikan string, jadinya:

exec marshal.loads(bytecode);

Seperti sudah dibahas di artikel lain, untuk mendekompilasi kita bisa mengambil bytecode, menuliskan ke file dan menambah header, lalu kita decompile dengan kode seperti ini:

bytecode = '....' #isi bytecode di sini

import imp
magic_number = imp.get_magic()

import struct, time
timestamp = struct.pack('i', int(time.time()))

with open('temp.pyc', 'wb') as f:
    f.write(magic_number)
    f.write(timestamp)
    f.write(bytecode)

Lalu kita coba decompile filenya (uncompyle6 temp.pyc). Tapi kadang dekompilasi ini gagal, contohnya adalah di artikel: Reverse Engineering Python Bytecode. Cara yang pasti berhasil adalah dengan membaca bytecodenya (seperti dijelaskan di artikel tersebut), walau kadang ini sulit jika kodenya rumit.

Di sini saya akan menjelaskan trik untuk proteksi sejenis. Perhatikan bahwa di dalam bytecode file tersebut diakhiri dengan:

12     >> 39161 LOAD_NAME                0 (marshal)  #
          39164 LOAD_ATTR                8 (loads)    #
          39167 LOAD_NAME                2 (e)        #
          39170 CALL_FUNCTION            1            # marshal.loads(e)
          39173 LOAD_CONST               1 (None)     #
          39176 DUP_TOP                               #
          39177 EXEC_STMT                             # exec(marshal.loads(e))
          39178 LOAD_CONST               1 (None)     #
          39181 RETURN_VALUE                          #

Yang artinya, pasti ada kode dekripsi, dan terakhir memanggil: exec marshal.loads. Dalam kasus ini saya tidak peduli proses dekripsinya bagaimana. Tapi saya memperhatikan bahwa tidak ada fungsi berbahaya yang dipanggil selain marshal.loads.

Sekarang trik cara mendapatkan kodenya yang terdekrip tanpa harus membaca dan memahami bytecodenya: kita bisa memaksa agar tidak memanggil marshal, tapi marshax (saya ganti huruf terakhir), lalu membuat modul marshax yang akan menuliskan hasil dekripsi ke file.

Contohnya begini: saya simpan kode yang sudah di-marshal ke file temp, lalu saya baca, ganti teks marshal dengan marshax dan eksekusi. Karena sudah diubah, maka ini akan error karena modul marshax tidak ada,

import marshal

with open("temp", "rb") as f:
  c = marshal.loads(f.read().replace("marshal", "marshax"))
exec c

Tujuan kita adalah untuk menangkap kode yang sudah didekrip. Jadi untuk ini kita buat file marshax.py di direktori yang sama dengan isi:

def loads(x):
    with open("temp2", "w") as f:
        f.write(x)

Hasilnya, ketika exec c dipanggil, fungsi loads di marshax yang akan dipangil dan akan menuliskan kode yang sudah didekrip ke dalam file temp2.

Sekarang file temp2 bisa dicoba diberi header dan didecompile lagi. Jika dekompilasi gagal dan masih berakhir dengan marshal.loads lagi, ulangi langkah yang sama.

Demikian trik kecil dari saya. Semoga bisa membantu reverse engineering file Python lain. Teknik serupa (mengganti implementasi kode) juga bisa diterapkan di kasus lain. Semoga semakin banyak lagi yang menuliskan artikel reverse engineering dalam bahasa Indonesia, sehingga mudah saya link seperti di posting ini.

Membedah e-KTP

Posting ini sekedar membahas tentang kartu tanda penduduk elektronik (e-KTP). Sampai saat ini saya belum pulang ke Indonesia untuk mengurus e-KTP karena KTP lama masih berlaku. Waktu orang tua saya datang ke sini tahun lalu saya sudah sempat ngoprek e-KTP mereka sedikit, dan sekarang selagi mereka berkunjung saya teruskan dan tuliskan hasil eksplorasi saya.

Sebagian isi tulisan ini didapat dari reverse engineering, dan sebagian lagi dari berbagai informasi yang tersebar di Internet. Ada juga bagian yang merupakan spekulasi saya dari informasi yang ada.

Security sebuah smart card

Sebuah smart card adalah sebuah komputer kecil, di dalamnya ada CPU, RAM, dan juga storage. Smart card diakses menggunakan reader, secara umum ada dua jenis: contact (menggunakan konektor fisik seperti SIM card) dan contactless (tanpa konektor fisik seperti kartu e-Money berbagai bank saat ini). Dari sisi programming keduanya sama saja. Kartu smart card yang baru umumnya juga sudah tahan (immune) terhadap side channel attack (DPA/SPA/FI dsb).

Hal yang membuat smart card penting untuk security adalah kemampuan smart card untuk melakukan komputasi (menghitung, melakukan hasing, enkripsi, dekripsi, dsb), dan sangat sulit untuk melakukan ekstraksi data dari smart card. Bayangkan seperti disuruh mengekstrak data di sebuah komputer yang dicor dan dimasukkan ke lemari besi.

Dari segi security, kita bisa memandang smart card ini seperti komputer remote yang melakukan komputasi yang tidak kita ketahui, dan kita tidak bisa mengekstrak informasi jika tidak ada bug pada implementasinya. Bayangkan sebuah sevice php seperti ini

<?php echo hash_hmac (“sha256”, $_GET[“q”], “[email protected]!ku” );?>

Jika kita tidak memiliki akses ke source code program tersebut, maka kita bisa mencoba-coba berbagai input, dan dengan melihat outputnya kita tidak akan bisa mengetahui bahwa kita memakai key “[email protected]!ku”.

Untuk berkomunikasi dengan smart card, kita mengirimkan perintah dalam bentuk byte-byte (dinamakan PDU atau protocol data unit), dan dibalas oleh card dengan status dan byte-byte hasil. Sebenarnya ini tidak berbeda jauh dari komunikasi lain seperti HTTP: kita mengirimkan request, dan card akan mengirimkan status dan balasan. Bahkan smart card generasi baru memang memasukkan server HTTP di dalamnya.

Riset smart card di level protokol (bukan level serangan fisik) bisa dilakukan dengan biaya relatif rendah. Card reader jenis contact dengan konektor USB bisa didapatkan dengan dengan harga kurang dari 10 USD, dan versi contactless (NFC) dengan konektor USB harganya sekitar 30 USD (atau jika punya Raspberry Pi atau Arduino, harga modul NFC-nya saja bisa kurang dari 5 USD).

Perhatikan bahwa: sebuah smart card bisa diisi program. Programnya bisa melakukan apa saja, baik itu memenuhi standar tertentu, atau melakukan sesuatu yang sifatnya custom. Sebagai informasi, kebanyakan  (tapi tidak semua) card sekarang ini diprogram menggunakan Java (teknologi JavaCard). Eksperimen Java Card bisa dilakukan di PC tanpa kartu menggunakan JCardSim.

Smart card juga memiliki protokol standar untuk filesystem. Kita bisa memilih Master File/Dedicated File (MF/DF) yang merupakan struktur direktori, dan EF (Elementary File) yang merupakan file. Semua “nama” pada file hanyalah bilangan yang umumnya dituliskan dalam notasi heksa desimal. Sebuah MF/DF/EF bisa diproteksi dan hanya bisa diakses dalam kondisi tertentu saja (dalam kondisi lain statusnya access denied)

SAM (Secure Access Module/Secure Application Module)

Jika komputer biasa digunakan untuk melakukan komputasi kriptopgrafi untuk dimasukkan ke e-KTP maka programnya akan rawan sekali diubah dan keynya gampang dicuri. Untuk mengatasi hal ini digunakan smart card lain yang dinamakan SAM. Ini hanya merupakan nama peran/role untuk smart card. Sebuah smart card biasa bisa menjadi SAM. Jadi sebuah SAM juga bisa diberi program apa saja. SAM ini bisa berupa chip yang ditanam di hardware, atau berupa kartu biasa. Biasanya SAM ini akan menggunakan jenis kartu contact.

Sekarang masalah security berpindah ke SAM. Tentunya SAM ini berbahaya jika jatuh ke tangan yang salah, jadi ada mekanisme keamanan yang diterapkan pada SAM e-KTP. Mekanismenya cukup sederhana, sehingga jika cukup niat bisa diakali. Ketika Kartu SAM diberikan untuk dipakai dengan aplikasi di sebuah komputer, file konfigurasi diberikan. File konfigurasi ini dienkrip dengan “Machine ID” (yang bisa dengan mudah didapatkan oleh program apapun).

Dengan menggunaakan file konfigurasi yang di XOR dengan machine ID, didapatkan key untuk mengakses Kartu SAM. Kartu tidak bisa dengan mudah dipakai di komputer lain tanpa mengakali program dan/atau mengganti machine ID. Jika N kali salah memasukkan machine ID, maka kartu SAM akan terblokir, dan harus meminta kartu SAM baru.

Keamanan ini hanya sekedar menghindari SAM yang “tercecer” di jalan agar tidak bisa sembarang dipakai. Jika ada yang berniat mengambil kartu SAM dan tahu dipakai di komputer mana (atau device mana), maka keamanan ini tidak membantu. Jadi bisa saja seoarang operator meminjam kartu SAM, dibawa pulang dan dipakai di rumah.

Data Pada e-KTP

Data yang disimpan pada e-KTP pada MF/DF 7F0A. Untuk memilih MF/DF ini bisa digunakan PDU

00A40000027F0A

Beberapa data yang ada di kartu:

  1. Data kontrol kartu (Card Control, pada EF: 6FF0), terbuka tapi spesifikasinya tidak diketahui
  2. Foto (EF: 6FF2), data ini terbuka
  3. Data Demografik/Biodata (6FF1), datanya diproteksi
  4. Data sidik jari: Minutiae1 (6FF4) dan Minutiae2 (6FF5), datanya diproteksi
  5. Scan tanda tangan (6FF3), datanya diproteksi
  6. ECDSA Signature (6FF6), datanya diproteksi

Mengekstrak Foto dari e-KTP

Foto dapat diekstrak dari e-KTP karena memang tidak diproteksi. Cara membacanya cukup mudah, pertama pilih MF/DF dan EF foto, lalu baca 2 byte pertama

00A40000027F0A
00A40000026FF2
00B0000002

Pada 2 byte pertama terdapat panjang (ukuran) data JPEG yang perlu dibaca.  Perhatikan bahwa apapun perintahnya akan selalu ada 2 byte status kembalian (9000 artinya adalah OK, bisa dibandingkan dengan HTTP Code 200):

=> 00 a4 00 00 02 7f 0a
<= 90 00 
Response : 
=> 00 a4 00 00 02 6f f2
<= 90 00 
Response : 
=> 00 b0 00 00 02
<= 06 fe 90 00
Response : 06 fe

Dalam kasus ini panjang file adalah 0x6fe byte = 1790 byte.

Berikutnya data bisa dibaca dengan mengirimkan PDU berikut ini berulang sampai selesai terbaca. Misalnya kita membaca dari offset 2 sebanyak 16 byte, berikutnya dari offset 18 sebanyak 16 byte, dst.

00BB<Offset High><Offset Low><Size>

Jika kita memiliki offset: 0x1234, maka Offset High adalah 0x12 dan Offset Low 0x34.  Teorinya kita bisa membaca sampai 255 byte sekali baca, kenyataannya card readernya bisa error. Di aplikasi e-KTP digunakan 112 byte sekali baca tapi di salah satu card reader saya, saya perlu memakai ukuran 16 byte sekali baca supaya reliable.

Data yang didapatkan adalah file JPEG biasa dengan ukuran 96×96 piksel.


Autentikasi Kartu

Untuk membaca data yang diproteksi, diperlukan key yang berada di SAM. Langkah pertama adalah mutual authentication untuk mendapatkan session key. Berdasarkan hasil reverse engineering,  protokol ini sepertinya berdasarkan Doc 9303 ICAO (Machine Readable Travel Documents) terutama Part 11 (Security Mechanisms for MRTDs).

Di dalam dokumen di atas, diasumsikan mesin pembaca memiliki key dalam memori komputer. Dalam dokumen itu protokolnya seperti ini (hanya garis besar, lihat contoh Appendix D di dokumen 9303 Part 11). Masing-masing pihak (kartu dan app desktop) memiliki SEED yang menjadi dasar untuk pembuatan key:

  • To Card: 0084000008 (request challenge/random number)
  • From Card: 8 byte random
  • From App: Generate random X1 (8 byte) dan X2 (16 byte), lalu  hoitung P1 = 3DES(X1 + RandomFrom Card +X2) , P2 = MAC(P1), hasilnya P1 + P2 ukurannya 40 byte, kirimkan ini ke kartu
  • From Card: kartu melakukan perhitungan serupa dan mengembalikan 40 byte
  • App melakukan komputasi dan menghasilkan session key.

Sedangkan protokolnya e-KTP seperti ini:

  • To SAM: Reset 00FF000000
  • From SAM: OK
  • To CARD: Get Challenge: 0084000008
  • From Card: challenge (8 byte)
  • To SAM: GenerateMutualAuth 00F10000 + CardControl + UID (8) + Challenge (8)
  • From SAM: 40 byte
  • To Card: ExternalAuth: 0082000028 + response from SAM
  • From Card: 40 byte
  • To SAM: VerifyMutualAuth: 00F2000028 + Response From Card

Perbedaannya adalah ada data Card Control dan UID kartu yang dikirim ke SAM. Sepertinya Card Control ini berisi informasi untuk pembuatan SEED, tapi tanpa source code ini tidak bisa diketahui detailnya.

Akan sangat panjang untuk membuktikan bahwa ini aman, tapi pada dasarnya: jika kita tidak punya key enkripsinya, meskipun kita bisa mengubah apapun di sisi app, maka kita tidak bisa mencari tahu key-nya.

Secure Messaging

Berdasarkan pada session key yang didapat pada proses autentikasi, maka setiap PDU yang dikirim akan dienkrip  dulu sebelum dikirim ke kartu dan yang diterima akan didekrip dulu sebelum diproses. Deskripsi ini cukup panjang, tapi ada gambar di dokumen yang menjelaskan ini.

Karena session key tidak pernah di simpan di PC, tapi di SAM, maka secara praktis yang terjadi adalah:

  1. Aplikasi membuat PDU unprotected (misalnya select EF)
  2. Aplikasi mengirimkan PDU unprotected ke SAM
  3. SAM membalas dengan PDU versi Secure Messaging
  4. Aplikasi mengirimkan PDU terenkripsi ke kartu e-KTP
  5. Kartu e-KTP membalas dalam PDU yang terenkrip
  6. Aplikasi mengirimkan PDU terenkrip dari e-KTP ke SAM
  7. SAM akan mendekrip PDU dan hasilnya dibaca oleh aplikasi di PC

Jadi dalam proses ini, meskipun kita mengetahui data terenkripsi dan hasil dekripsinya, kita tetap tidak tahu key yang digunakan (session ini selalu random dalam setiap koneksi).

Emulasi SAM dan e-KTP

Untuk membuat aplikasi e-KTP tanpa memiliki SAM. kita bisa menggunakan SAM dan e-KTP buatan kita sendiri dengan key yang kita masukkan sendiri tentunya ini tidak akan jalan di e-KTP “beneran” sampai kita memiliki akses untuk SAM yang benar. Hal ini sudah pernah diimplementasikan oleh BPPT dalam paper PERANCANGAN EMULATOR KTP ELEKTRONIK BERBASIS JAVA CARD UNTUK MENDUKUNG PENGUJIAN FUNGSIONALITAS PEMBACA KTP ELEKTRONIK INDUSTRI NASIONAL.

Dalam paper ini disebutkan bahwa metode key derivation yang digunakan e-KTP sifatnya rahasia dan mereka mengimplementasikan sendiri algoritma yang sekedar bisa dipakai oleh kartu SAM dan kartu KTP mereka sendiri.

Amankah e-KTP

Aman tergantung dari sudut pandang mana: dari pembuatan KTP, dan dari pemilik/pengguna KTP. Keamanan e-KTP ada pada SAM-nya.  Ini berarti beberapa hal:

  • Kartu SAM harus dijaga ketat, karena jika bisa dipinjam, maka bisa digunakan membuat KTP Aspal
  • Semoga key generation-nya aman. Saya sudah pernah menemukan kode SAM yang aman, tapi cara membuat key yang random hanya mengandalkan fungsi random biasa (bukan secure random) dan menggunakan seed waktu saat ini.
  • Semoga key utama disimpan dengan baik oleh kemendagri

Saat ini data foto sama sekali tidak diproteksi, sehingga seseorang bisa mengambil foto dari dompet yang tertutup. Menurut standar security MRTD, seharusnya data yang bisa dibaca dienkrip dengan informasi yang tertera di kartu. Misalnya untuk paspor, dari nomor paspor, tanggal lahir, tanggal kadaluarsa. Informasi ini tertera di kartu, jadi seseorang yang berusaha membaca dokumen tidak bisa membaca jika memang tidak memegang kartunya. Dengan ini kita bisa memastikan apakah benar isi data elektronik sama dengan data yang dicetak.

Sempat ada aplikasi POC reader e-KTP tapi sayangnya sudah dihapus dari Google Play (tapi masih bisa didownload dari sini). Aplikasi ini membaca data foto seperti saya jelaskan di atas. Sebenarnya agak berbahaya mempercayai data ini, karena mudah sekali membuat card yang jika dibaca dengan aplikasi tersebut akan keluar foto.

Semoga programmernya handal dan tidak membuat kesalahan implementasi. Saya agak khawatir membaca kode seperti ini di salah satu aplikasi yang saya dekompilasi.

Dari mana bisa tahu ini semua?

Pertama adalah mencari dulu aplikasi desktop e-ktp. Ini bisa dicari dengan query berikut di Google.

“index of” e-ktp inurl:.go.id/

Sekarang sepertinya sudah cukup sadar sehingga installernya lebih sulit dicari, tapi tahun lalu ini mudah sekali dicari. Programnya ditulis dalam .NET tanpa obfuscation sehingga mudah dibuka.

Berikutnya eksperimen diteruskan dengan e-KTP orang tua saya. Saya sudah mencoba beberapa attack yang umum, dan sepertinya semuanya aman.

Saat ini saya baru menemukan hal-hal kecil yang undocumented. Seperti halnya web server yang bisa dicari direktori tersembunyi dengan teknik “forced browsing”, kita bisa mengirimkan perintah berurutan ke smart card untuk mencari tahu perintah mana yang menghasilkan sesuatu tapi tidak terdokumentasi.

Demikian hasil oprekan e-KTP untuk saat ini. Mungkin di masa depan akan saya teruskan lagi. Saat ini belum ada ide serangan baru.

 

AlphaSmart Dana

AlphaSmart Dana adalah device Palm OS lama dengan form factor keyboard yang sudah tidak diproduksi lagi. Device ini dulu cukup populer di banyak sekolah di amerika, terutama digunakan untuk anak-anak yang kesulitan menulis dengan pulpen/pensil. Device ini saat ini masih populer di kalangan penulis karena beberapa hal: keyboardnya enak dipakai untuk mengetik, minim gangguan (karena tidak bisa mengakses internet), relatif ringan (sekitar 1 kg), memakai 3 Batere AA biasa (atau yang rechargable) dan tahan beberapa puluh jam sebelum perlu mengganti batere lagi. Ada dua versi Dana, Wireless dan non wireless, yang akan dibahas di sini adalah versi wireless yang kami punya.

Stiker biru kecil di tengah Dana itu ditempelkan supaya gampang membedakan dari Dana yang lain.

Untuk mentransfer data ke komputer, ada beberapa opsi. Opsi pertama adalah menggunakan mode keyboard, dengan ini seolah-olah alphasmart akan “mengetik ulang” isi file ke editor apapun yang terbuka di layar komputer. Dengan cara ini AlphaSmart Dana bisa terkoneksi ke device apa saja yang menerima input dari USB keyboard (termasuk juga tablet atau ponsel, asalkan bisa memberikan cukup daya). Kabel yang digunakan adalah kabel USB printer standar. Opsi kedua adalah dengan menggunakan jaringan WIFI (sayangnya yang disupport hanya WEP). Opsi terakhir adalah dengan menggunakan SD Card

Karena menggunakan sistem operasi Palm OS, maka berbagai aplikasi Palm OS lama bisa diinstall di device ini dan tentunya kita bisa membuat sendiri aplikasi baru yang dibutuhkan. Contoh aplikasi yang bisa diinstall misalnya: Bible Reader (terpakai oleh Jonathan), Kamus, dan Timer. Sayangnya ukuran device ini tidak standar, jadi banyak aplikasi hanya akan muncul kecil di tengah layar. Beberapa aplikasi bisa diakali menggunakan RsrcEdit agar bisa menggunakan layar yang besar, tapi beberapa perlu dicompile ulang (jika sourcenya tersedia).

Beberapa tahun lalu saya sebenarnya sudah tertarik membeli device ini, harganya relatif murah (sekitar 20-50 USD, tergantung sellernya di eBay), tapi yang tidak murah adalah ongkos kirimnya, sehingga harga totalnya lebih dari 120 USD.

Tahun ini saya berusaha seminimal mungkin membeli gadget ataupun komponen elektronik untuk dioprek. Ketika mendekati ulang tahun saya, saya berpikir untuk membeli satu device untuk hadiah diri sendiri. Tadinya terpikir membeli console Nintendo Switch (apalagi baru ada kabar ini mulai bisa dihack) atau Nintendo 3DS (yang harganya sudah tidak terlalu mahal). Tapi kalau dipikir-pikir saya jarang sekali bermain game, jadi saya urungkan niat membeli console game.

Begini layar Dana di emulator Palm OS. Aslinya tidak sejernih ini.

Saat ini AlphaSmart seri Dana sudah mulai sulit dicari di eBay. Kebanyakan yang ada adalah AlphaSmart Neo, yang merupakan versi sebelumnya. Alphasmart Neo tidak memiliki sistem operasi dan bisa bertahan puluhan hingga ratusan hari dengan beberapa batere AA. Kelemahan Neo bagi saya adalah sulit dioprek (karena tanpa OS)

Ketika saya melihat ada yang menjual Dana di-eBay, tapi harga plus ongkos kirimnya 110 USD, saya kembali mengurungkan niat. Tapi kmemudian muncul listing lain: 7 Alphasmart Dana versi Wireless berikut ongkos kirim total semuanya menjadi 228 USD. Sebenarnya saya nggak butuh 7 benda ini, tapi jika dirata-ratakan harganya hanya 32.5 USD. Saya cukup yakin bisa menjual ulang benda ini dengan harga 33 USD per item (dan sudah terjual 2). Selain itu saya juga ingin mencobakan benda ini ke Jonathan.

7 Dana. Semuanya sudah ada dialokasikan, belum dikirimkan.

Ketika sampai, saya langsung coba semuanya dan semua berjalan normal. Tapi sayangnya hanya 3 yang memiliki stylus. Untuk memilih menu, kita bisa memakai jari, dan stylus apa saja bisa dipakai di benda ini, selain itu sebenarnya jarang sekali stylus ini dipakai karena semua  fungsi bisa diakses dari keyboard.

Layar Dana adalah seperti pada PDA Palm lama, jadi bagi sebagian orang mungkin akan sulit membaca layar ini. Bagi saya sih baik-baik saja. Layar Dana ada backlightnya sehingga bisa dipakai dalam gelap. Layarnya juga cukup jelas terbaca di bawah matahari langsung. Bagi sebagian orang kontrasnya kurang bagus dan sudut pandangnya kurang bagus. Benda ini juga tidak memiliki keyboard backlight, jadi harus memakai touch typing ketika mengetik dalam gelap. Sebuah lampu USB bisa dipasang di atas benda ini tapi akan boros batere.

Dengan menggunakan alphasmart saya dipaksa untuk tidak mengecek internet, dan juga tidak terganggu dengan berbagai notifikasi. Sejauh ini saya jadi lebih banyak menulis artikel blog (seperti artikel ini yang ditulis di AlphaSmart lalu ditransfer ke komputer).

SD Card

Dana mendukung dua SD Card. Agak aneh memang karena device modern biasanya hanya mendukung 1 kartu saja. Aplikasi bisa diletakkan di SD Card, jadi kita bisa menyimpan aplikasi di SD card pertama sementara SD Card kedua untuk data. SD Card yang didukung hanya yang ukurannya maksimum 1GB. Card ukuran ini sudah sulit dicari tapi masih bisa didapatkan secara online.

Secara umum penyimpanan internal Dana tergolong besar untuk Palm OS, biasanya PalmOS hitam putih hanya sampai 8 MB memorinya, tapi Dana sampai 16 Mb. Seperti Palm OS, memori Dana sifatnya volatile, artinya akan segera hilang isinya jika batere dicabut (tapi ada kapasitor yang bisa menyimpan data beberapa menit sementara kita mengganti baterenya). Jadi jangan sampai batere Dana benar-benar habis, karena semua isinya akan hilang.

Sebagai catatan: jika 1 kata rata-rata 10 huruf (kata dalam bahasa Indonesia cukup panjang), dan kita menulis 1000 kata per hari, maka hanya butuh 10kB, dan setahun hanya butuh 3650 kB atau 3.65 MB (jangan protes dengan konversi x1000 bukan x1024 saya memakai decimal prefix bukan binary prefix). Jadi tanpa SD Card pun kapasitas Dana sudah cukup besar. Sebuah SD Card 16 MB akan cukup besar untuk kebutuhan sebagian besar orang.

Battery Hack

Aslinya Dana bisa memakai 3 batere AA biasa (non rechargable), atau battery pack yan rechageable. Keduanya memakai slot yang sama, jadi tidak bisa kita memakai keduanya sekaligus. Bedanya antara batere biasa dan rechargeable pack hanyalah pada konektornya. Konektor batere biasa tidak akan menerima arus charging ketika Dana dicolok ke adaptor atau ke komputer, sedangkan konektor satu lagi akan menerima charging.

Hack paling sederha adalah: mengganti agar kabel charging bisa dipakai di slot batere biasa. Alternatif lainnya adalah membongkar battery pack lama dan menggunakan kabel itu tanpa menyolder kabel. Cara ini yang saya lakukan. Sekarang tiap beberapa hari saya bisa menhubungkan Dana ke komputer sambil charging.

Begini baterry pack aslinya. Saya kupas untuk diambil kabelnya saja.
Batere rechargeable saya pasang dengan konektor yang dilepas dari battery pack lama.

Sinkronisasi dengan PC

Saat ini software sinkronisasi Palm OS masih bisa digunakan di Windows 10, termasuk juga yang 64 bit. Sayangnya Dana tidak bisa disinkronisasi dengan Linux. Dulu saya pernah memakai Palm dengan USB dan sudah tahu berbagai triknya di Linux, tapi sayangnya module kernel visor tidak mengenali benda ini. Saya sudah berusaha compile ulang modul kernelnya dengan memodifikasi Vendor/Product ID agar dikenali, tapi ternyata protokolnya berbeda dan Dana akan crash ketika saya paksa.

Akses WIFI

Saya sudah mensetup access point dari Raspberry Pi untuk bisa menyimpan dan membuka dokumen dari jaringan. AlphaSmart hanya mendukung WEP dengan enkripsi 40 atau 128 bit. Share yang bisa diakses adalah SMB versi 1. Di Raspberry Pi saya setup Dropbox Uploader sehingga file yang saya simpan di folder akan diupload ke Dropbox. Tutorialnya sudah saya tulis di blog saya yang lain.

Meskipun teorinya bisa dipakai untuk browsing web sederhana, tapi berbagai software yang ada sudah terlalu tua dan berbagai web yang ada sudah  terlalu kompleks. Jadi akses WIFI ini hanya saya gunakan untuk mengirimkan dokumen supaya terarsip di Dropbox.

Dana terkoneksi ke jaringan

Sebagai catatan: jangan mengubah akses poin di rumah menjadi WEP, karena mudah sekali dicrack. Dengan RPI dan USB Dongle, range WIFI hanya dekat saja (paling menembus 1 kamar). Share untuk dana juga sebaiknya tidak dicampur dengan file lain karena dua alasan: supaya Dana tidak hang atau bingung jika ada terlalu banyak file, dan juga agar file lain aman andaikan ada yang berhasil masuk melalui access point yang ditujukan untuk Dana.

Penutup

Sejauh ini saya cocok memakai AlphaSmart Dana, dan sudah menulis banyak posting blog sejak menggunakan benda ini serta cukup banyak mengoprek benda ini. Bagi Risna menulis di AlphaSmart kurang nyaman karena kurang bisa melihat dengan jelas teks di layar dan kurang nyaman untuk editing. Jonathan baru suka bereksperimen memakai Dana, tapi belum suka banyak mengetik.

 

Reverse Engineering APK

Saya sudah menulis beberapa artikel terpisah mengenai reverse engineering APK Android (misalnya di http://yohan.es/security/android/) . Di posting ini saya ingin menggabungkan berbagai tulisan yang pernah saya buat dalam satu posting, supaya lebih gampang dibaca. Topik yang lebih umum mengenai Pengantar Reverse Engineering sudah pernah saya bahas di blog ini (tidak spesifik Android).

 

Tujuan Reversing

Pertama, tentukan tujuannya apa ingin bisa reversing APK. Ini bisa digolongkan jadi dua bagian: apakah ingin mengetahui cara kerjanya? (sekedar membaca kode) atau ingin mengubah aplikasinya? (memodifikasi kode) Yang termasuk dalam kategori pertama: apakah ingin ekstrak API-nya, ingin membaca file yang dibuat oleh aplikasi, ingin tahu protokol aplikasi.

Tujuan yang kedua lebih rumit: intinya ingin memodifikasi aplikasi. Beberapa tujuannya: memperbaiki bug, mengubah sifat aplikasi, menambah fitur, mencurangi game, dsb.

APK itu apa?

Pertama APK itu apa? APK adalah format aplikasi Android, berupa file ZIP yang di dalamnya ada classes.dex yang berisi kode Java, resource dalam bentuk XML (yang diencode khusus), file-file gambar, video, suara, dsb.

Selain itu ada juga bagian lain seperti native code (kode dalam bahasa mesin) yang ditulis dalam C/C++/Rust atau bahasa lain. Jika APK dibuat dengan teknologi selain Java, maka kemungkinan ada file-file dalam bahasa lain (misalnya pyc untuk Python, JS untuk JavaScript dsb).

Bagaimana APK dibuat?

APK dibuat dari kode program yang umumnya ditulis dalam bahasa Java dan C/C++, tapi tidak selalu harus demikian. APK bisa dibuat dengan kode HTML dan JavaScript, dari kode Python, Ruby, Unity, dsb. Semuanya sangat fleksibel.

Sebenarnya yang didukung langsung oleh Android hanya bisa ada dua jenis kode: Java atau Native. Native artinya kode yang dikompilasi ke bahasa mesin, biasanya ditulis dalam bahasa C/Assembly. Tapi baik kode Java maupun Native bisa meload interpreter bahasa lain, misalnya dari Java kita bisa langsung menggunakan komponen WebView yang mendukung JavaScript. Dari Java kita juga bisa menggunakan library JRuby/JPython untuk menjalankan kode Ruby/Python (dan masih banyak juga library untuk bahasa lain). Dari bahasa C kita juga bisa meload library apapun (termasuk juga interpreter Python, Ruby, Lua, dsb) dan menjalankan kode dalam bahasa itu.

Tapi fakta ini disembunyikan jika kita menggunakan tools tertentu. Misalnya ketika memakai cordova, maka kode Java disembunyikan dari programmer, dan programmer hanya memikirkan kode dalam HTML/JavaScript saja. Demikian juga dengan Unity, programmer tidak akan melihat kode Java dan Native yang disertakan oleh unity untuk menjalankan kode .NET.

Kode Java akan dikompilasi menjadi .class (file Class Java) lalu dikonversi menjadi bytecode dalvik.   Satu aplikasi terdiri dari banyak kelas dan semua ini disimpan dalam file DEX. Bytecode dalvik ini sifatnya biner, agar lebih mudah dibaca, dibuatlah format kode smali yang berupa teks. Dengan format smali, bytecode menjadi lebih mudah diedit.

Supaya lebih terbayang, berikut ini contoh kode dalam bahasa Java

    public int nextInt(int i) {
                return f++;
   }

Versi .class (bytecode Java):

  public int nextInt(int);
    Code:
       0: getstatic     #2                  // Field f:I
       3: dup
       4: iconst_1
       5: iadd
       6: putstatic     #2                  // Field f:I
       9: ireturn

Versi smali

.method public nextInt()I
    .locals 2
    .prologue
    .line 15
    sget v0, LMyRandom;->f:I
    add-int/lit8 v1, v0, 0x1
    sput v1, LMyRandom;->f:I
    return v0
.end method

Ketika sebuah aplikasi dibongkar, maka minimal ada sedikit kode Java. Lebih tepatnya lagi dari DEX kita bisa kembalikan menjadi file-file .class atau .smali, dan dengan decompiler biasanya bisa dikembalikan ke java.Jika APK tidak dibuat dengan bahasa Java, maka biasanya logika utama aplikasi berada di file lain, dan file Java ini hanya me-load file tersebut.

Membaca Source Code

Sebelum membongkar sebuah APK. Coba tanyakan dulu pada diri sendiri: andaikan saya diberikan source code lengkap sebuah aplikasi, apakah saya bisa akan paham? Andaikan diberi source code yang diberi nama jelas, diberi komentar, diberi dokumentasi tetap belum bisa mengerti, maka sebaiknya Anda kembali ke dasar dulu.

Intinya tool-tool untuk membongkar APK paling jauh hanya akan bisa mengembalikan menjadi source code. Bahkan terkadang jika ada proteksi tertentu, source codenya bisa salah, sulit dimengerti, atau bahkan source code tidak bisa dihasilkan, dan kita harus melihat ke smali code. Jadi jika source code saja tidak bisa dimengerti, maka langkah berikutnya akan sulit.

Mendapatkan APK

Sekarang jika sudah siap reverse engineering APK. Pertama adalah mendapatkan APK. Ini bisa didapatkan dari berbagai situs, misalnya APKPure. Perhatikan APK yang didapat mungkin bukan yang terbaru di Play Store.

APK juga bisa diterima dari programmer yang mengirimkan Anda file APK-nya. Pada kegiatan pentest, biasanya metode ini yang dipakai karena aplikasi belum diterbitkan.

APK juga bisa diekstrak dari aplikasi yang sudah terinstall di  handphone dengan berbagai aplikasi  di handphone misalnya Apk Extractor, ES File Explorer, dsb). APK juga bisa diambil dari desktop melalui Android Debug Bridge (ADB).

Android Debug Bridge (ADB)

Sebelum Anda mulai lebih jauh, pelajari juga tools dasar Android, terutama ADB. Carilah cara untuk mengaktifkan developer mode pada ponsel Anda, dan ikuti tutorial untuk menjalankan ADB, masuk ke shell adb, mem-push dan pull file ke/dari device, menginstall dan uninstall APK. Untuk device tertentu kadang Anda perlu menginstall device driver khusus untuk bisa melakukan koneksi ke ADB.

Hal penting lain adalah mendapatkan log dengan adb logcat dan memfilter isi log. Kemungkinan besar aplikasi akan crash ketika dimodifikasi, jadi mengetahui log akan membantu mencari tahu di mana crash terjadi.

Ekstraksi APK

Sekarang APK bisa diekstrak dengan apktool. Tool ini adalah tool command line yang sangat dasar. Ada beberapa tool lain yang “membungkus” tool ini agar lebih mudah dipakai dengan klik saja. Menurut saya, jika masih pemula, justru bagus untuk bisa mengetahui cara manual ekstraksi file.

Untuk orang yang tujuannya hanya ingin memahami kode Java saja, maka tool jadx akan lebih mudah dipakai. Tool ini juga memiliki GUI yang memudahkan kita membuka file dan melakukan dekompilasi langsung menjadi kode dalam Java. Tool ini memiliki kelemahan: ketika kode dipoteksi maka akan sulit memahami kodenya. Kelemahan lainnya adalah: kita tidak bisa memodifikasi kodenya, ini hanya sekedar untuk melihat saja.

Sebagai catatan: sebagian orang suka menggunakan dua langkah: dex2jar yang akan mengubah APK menjadi file  Jar (yang berisi file .class Java), lalu mendekompilasi file jar-nya dengan decompiler Java (misalnya JD atau CFR).

Perhatikan bahwa jika program tidak ditulis dalam bahasa Java, maka Anda harus memakai tools lain untuk reverse engineering. Beberapa teknologi yang pernah saya temui misalnya:

  • Unity. Ada yang masih memakai kode .NET, dan ada yang dikompilasi menjadi native code dengan il2cpp.
  • HTML/JS (Apache Cordova)
  • Ruby
  • Python
  • Cocos-2DX (native code), kadang dicampur Lua

Teknologi non-Java berada di luar scope posting blog ini. Jika memang tertarik, carilah informasi di internet mengenai masing-masing teknologi untuk tahu cara membongkarnya.

Memahami Program

Jika sudah berhasil diekstrak, maka langkah berikutnya adalah memahami programnya. Bagian ini adalah tersulit. Kembali lagi ke nasihat awal: jika diberikan source code sebuah program apakah Anda bisa mengerti? Jika dihapus semua nama fungsi-nya dan diganti dengan “a”, “b”, “c” apakah kira-kira Anda masih mengerti bahwa sebuah kode melakukan “sorting” atau “searching”?

Selain dengan membaca kode, seorang programmer bisa berusaha memahami program dengan menggunakan “debugger”. Ini juga bisa diaplikasikan ketika melakukan reverse engineering: debugger bisa membantu memahami cara kerja program. Selain itu programmer juga bisa menambahkan logging untuk membantu memahami alur program.

Seorang programmer yang baik akan menggunakan berbagai library yang populer. Pengetahuan mengenai library populer ini akan sangat berguna ketika mereverse engineer sesuatu. Kita bisa mengabaikan banyak kode yang bukan inti dari aplikasi. Misalnya jangan sampai pusing  dan berkutat membaca kode di package android.support.

Modifikasi kode

Sama halnya dengan modifikasi kode: jika ada kode open source di github, apakah Anda bisa menambahkan sendiri fitur yang Anda inginkan? misalnya sekedar mengganti teks, memindahkan tombol, menambah tombol. Jika jawabannya adalah: tidak bisa, maka memodifikasi APK juga akan sulit dilakukan.

Beberapa modifikasi sederhana, seperti bypass root checking, atau SSL Pinning mungkin masih bisa dilakukan dengan sekedar mengubah sebuah kondisi atau if. Tapi modifikasi seperti: mengganti user interface atau menambahkan fitur baru akan sangat sulit dilakukan jika Anda tidak mengerti bagaimana memprogram Android.

Jika ingin mulai dengan benar, belajarlah dulu membuat Aplikasi Android dasar. Materi untuk ini bisa didownload secara gratis. Tutorial dalam bentuk video juga banyak tersedia. Beberapa cara modifikasi APK baik secara permanen maupun temporer pernah saya tuliskan di sini.

Sangat sering saya temui orang yang ingin memodifikasi APK tapi masih bingung dengan konsep app signing. Bertanya: kenapa hasil modifikasi saya nggak  bisa diinstall? (masih lebih bagus jika pertanyaannya eksak seperti ini, ada yang bertanya: kenapa aplikasi saya nggak jalan? lalu setelah muter nanya jauh, ternyata maksudnya tidak bisa diinstall). Tanpa modifikasi apapun, jika aplikasi diunpack dan dipack ulang tapi tidak disign maka tidak bisa diinstall (dengan perkecualian Androidnya sudah dipatch dengan aplikasi tertentu agar mengabaikan code signing, tapi ini berbahaya dari segi security).

Sebelum belajar melakukan modifikasi, minimal belajar dulu packaging ulang aplikasi: ekstrak aplikasi, tidak usah dimodifikasi, lalu package ulang, sign ulang dan install ulang. Pelajari apa itu “signing”, dan bagaimana caranya signing aplikasi. Program tanpa proteksi harusnya akan berjalan normal setelah repackage (tanpa modifikasi).

Jika aplikasi berjalan normal ketika direpackage sebelum dimodifikasi, tapi  kemudian program crash setelah dimodifikasi maka kemungkinan Anda salah memodifikasi. Lihat pesan pada logcat untuk mencari tahu kenapa.

Proteksi

Untuk aplikasi yang diproteksi, maka proses reverse engineerig menjadi lebih sulit. Misalnya proteksi yang paling sederhana sekedar obfuscation. Nama-nama method dan variabel diubah agar sulit dimengerti. Ini bisa sekedar menjadi a,b,c, d tapi juga agar namanya tidak valid untuk OS Windows (misalnya CON atau NUL).

Contoh kode yang gagal didekompilasi

Proteksi tingkat lanjut juga ada, misalnya dengan mengenkrip kode program yang kemudian diload ketika program berjalan. Di tingkat yang lebih lanjut lagi, digunakan native code sehingga harus melihat kode assembly (bahasa mesin) bukan sekedar kode smali.

Ketika proteksi mulai digunakan, maka yang berikutnya dipahami adalah berbagai trik dan pengalaman. Misalnya konstanta MD5/SHA1/AES bisa digunakan untuk mencari tahu algoritma apa yang digunakan. Kadang yang paling mudah adalah dari berbagai string yang muncul dalam sebuah method, misalnya ada pesan tentang error AES, maka kemungkinan kelas itu berhubungan dengan enkripsi AES. Bahkan kemungkinan besar seluruh package tempat kelas tersebut berada berhubungan dengan AES.

Menelusuri Kode

Ketika seseorang bertanya: kok tahu kalau kode enkripsinya ada di kelas yang ini? Jawabannya biasanya adalah: dari pengalaman dan dari penelusuran kode program.

Yang saya maksud dengan menelusuri kode adalah membaca secara manual dan kadang dicampur dengan logging untuk melihat apakah method tertentu dipanggil. Contohnya begini: jika kita tahu di Activity tertentu teks dimasukkan (dalam bentuk plaintext alias belum dienkrip), dan ketika di kirimkan melalui HTTP sudah terenkrip, maka kita bisa menelusuri method yang dipanggil sampai data terkirim untuk mencari di mana method enkripsi.

Secara umum, computational thinking membantu sekali karena ini seperti menyelesaikan sebuah puzzle. Kadang kita harus menelusuri dari belakang, dari depan, atau dari tengah.

Library

Pemakaian library tertentu menunjukkan programmer menggunakan paradigma tertentu dalam memprogram. Contohnya adalah jika library RX Java digunakan maka reactive programming digunakan.

Penggunakan AspjectJ menunjukkan bahwa Aspect Oriented Programming digunakan. Dalam kasus seperti ini, pengetahuan mengenai berbagai paradigma pemrograman akan sangat berguna.

Malware Android

Berbagai malware memiliki proteksi yang di atas rata-rata software biasa. Proteksi malware tertentu sangat kompleks, karena mungkin hanya menargetkan HP jenis tertentu, dan jika crash ya sudah (emangnya ada yang mau kirim bug report?), jadi berbagai proteksi yang sifatnya advanced bisa diterapkan.

Banyak software banking juga memiliki proteksi tapi biasanya lebih mudah dari malware, karena sebuah aplikasi banking dibatasi oleh beberapa hal: mereka ingin aplikasinya tetap berjalan di berbagai ponsel, mereka tidak ingin terdeteksi sebagai malware, mereka tidak ingin aplikasi menjadi terlalu lambat, mereka tetap ingin bisa mendebug aplikasi jika ada masalah.

Jadi secara umum: membongkar malware levelnya lebih susah. Sebuah malware juga kadang mengandung exploit yang mewajibkan kita mengerti internal Android untuk bisa mengerti eksploitnya.

Security

Jangan kira jika sudah berhasil membongkar sebuah APK kita pasti bisa menemukan masalah security. Sebuah APK biasanya hanyalah salah satu “client” dari sebuah aplikasi server. Artinya segala pemrosesan dilakukan di server, dan jika aplikasinya bagus, maka bagaimanapun kita akali, tetap akan dicek di server.

Contohnya dalam aplikasi banking: jika kita bisa mengubah request kita ke bank, maka seharusnya tidak mungkin kita mengubah jumlah saldo, nilai transaksi, nomor rekening, dsb.

Tapi bukan berarti kita langsung menyerah membongkar APK penting karena dianggap sudah aman. Dalam beberapa kasus saya pernah menemukan bahwa aplikasi yang penting dan sudah dipakai umum masih memiliki bug. Saya pernah menemukan bisa mentransfer dari rekening orang ke diri sendiri. Bug itu tidak ditemukan oleh yang lain karena aplikasinya memakai enkripsi custom dengan socket (bukan HTTP), dan tanpa reverse engineering tidak akan bisa ditamper dengan tool seperti burpsuite. Sebagai catatan: dalam hal ini yang salah bukan sisi app-nya, tapi sisi servernya.

Tools

Bagi saya tools-tools ini sudah cukup untuk membongkar dan menyusun 95% APK yang saya temui:

  • apktool
  • jadx
  • compiler Java dan atau IDE (Intellij/Netbeans/Android Studio)

Tools yang komersial juga ada: JEB tapi harganya relatif mahal.

Beberapa tool lain yang juga saya pakai:

Network

Jika niatnya tidak ingin tahu aplikasi secara dalam, tapi hanya sekedar melihat trafficnya saja, saya memakai tool berikut:

Tools-tools tersebut tidak jalan jika ada certificate pinning. Untuk mengatasinya ada banyak metode yang bisa dipakai, tergantung metode pinning yang dipakai oleh program. Dalam kasus sederhana memakai JustTrustMe (Xposed module) atau Frida sudah cukup, tapi di aplikasi tertentu kita perlu patch kode smali untuk bypass SSL Pinning. Artikel berikut ini membahas metode umum untuk bypass SSL Pinning.

Untuk native code saya menggunakan tools lain: IDA Pro dan  Radare. Saya tidak akan membahas native code reverse engineering di sini.

Memulai

Jadi bagaimana untuk memulai? apa yang perlu dipelajari?. Menurut saya urutan ini cukup baik:

  • Belajar membuat aplikasi Android sederhana (minimal hello world), belajar membuat beberapa user interface sederhana (misalnya halaman login), ini terutama jika ingin mengubah/menambah user interface dari APK yang sudah ada. Sudah ada materi gratis dari Google yang bisa didownload di Internet, berbahasa Indonesia.
  • Ekstrak aplikasi tersebut dengan apktool dan jadx
  • Belajar menggunakan proguard, lalu buat atau download aplikasi dari github, kemudian coba compile, bongkar. Setelah itu coba compile dan obfuscate dengan proguard, lalu bongkar.
  • Download aplikasi dari Google Play yang diinginkan, coba ekstrak aplikasinya. Coba bongkar beberapa aplikasi. Langkah ini bisa diganti dengan mendownload soal CTF Android

Penutup

Berbagai jawaban di atas seharusnya sudah cukup menjawab pertanyaan awal. Banyak pertanyaan lanjutan akan bisa dicari jawabannya di Internet, dan beberapa pertanyaan akan sangat spesifik aplikasi dan bahkan spesifik pada versi aplikasi itu.

Contohnya: banyak aplikasi yang versi awalnya tidak diobfuscate sama sekali (misalnya Gojek, BBM) tapi kemudian diobfuscate. Kebanyakan aplikasi juga akan berubah nama kelasnya, dan bahkan library yang dipakai di versi yang baru bisa berbeda. Di sisi server berbagai hal juga bisa berubah, dari mulai URL, format yang dipakai, metode signature yang dipakai, dsb.

Jadi kalau ada orang yang nanya sesuatu di Gojek terbaru, saya gak akan bisa langsung jawab. Ini seperti nanya isi buku terbaru, saya harus baca dulu apa saja yang berubah dari versi lama, harus tracing lagi nama-nama fungsi, nama library dsb. Dan ini butuh waktu, tidak sebentar apalagi jika pertanyaannya sangat spesifik.

Tergantung kompleksitas aplikasi dan tujuan reversing, mengerjakan satu APK bisa butuh waktu beberapa menit, beberapa jam, dan bahkan berhari-hari. Di kasus ekstrem game Pokemon Go yang proteksinya sangat baik, bahkan dulu dibutuhkan waktu ribuan man-hour (banyak orang bekerja berhari-hari) sebelum mereka berhasil membongkarnya (dan setelah itu sudah diganti lagi algoritmanya, sementara orang-orang sudah menyerah).

Waktu adalah sesuatu yang berharga. Buat apa saya membongkar sebuah APK spesifik secara gratis, sedangkan saya membongkar APK lain (untuk pentest) dibayar? Tapi saya juga tidak pelit, jika memang kebetulan saya pernah atau sedang membongkar APK iseng, saya akan memberikan petunjuk/jawaban (ingat, hanya APK iseng, bukan  APK di mana saya menandatangani NDA untuk pentesting).

Khusus untuk yang masih banyak nanya mengenai APK Gojek: saya tidak lagi tertarik pada Gojek sejak beberapa tahun yang lalu. Saya bahkan belum pernah memakai jasa Gojek (saya tinggal di Thailand). Saya tidak kenal dengan orang-orang di Gojek.

Semoga rangkuman di atas ini cukup buat menjawab berbagai pertanyaan seputar reverse engineering APK.

Mengajarkan Computational Thinking dan Coding Pada Anak-Anak

Saya tidak akan menjelaskan panjang lebar apa itu Computational Thinking. Sudah ada banyak materi online, bahkan kursus online dari Google juga ada. Computational Thinking adalah cara berpikir untuk menyelesaikan masalah yang diinspirasi dari cara orang menyelesaikan masalah di ilmu komputer. Computational thinking perlu dipakai untuk membuat program komputer, tapi juga bisa diaplikasikan ke berbagai bidang lain.

Computational thinking bisa dan perlu diajarkan pada orang di berbagai usia, tapi saya hanya akan berfokus pada anak-anak di posting ini.  Mungkin sebagian akan langsung berpikir: anak-anak kok diajari seperti itu, harusnya diajari seni, kreativitas, agama, sopan-santun, dsb. Pencetus istilah computational thinking pernah menyatakan ini:

I FEEL VERY DEEPLY COMMITTED TO THE IDEA that, although rationality isn’t everything, and passion and interests and faith of various sorts count as much–nevertheless, rationality is a force for the good, and the more people that are capable of rational, critical thinking–the better the world will be; the more that have access to knowledge about the rest of the world–the better the world will be.”

–Seymour Papert, Mathematician, Computer Scientist, Educator

Computational thinking menurut saya adalah life skill yang berguna untuk mempermudah hidup. Berbagai pendekatan menyelesaikan masalah dalam computational thinking bisa diaplikasikan dalam kehidupan sehari-hari. Misalnya bagaimana menyusun buku secara terurut, bermain sudoku, bermain catur, merencanakan perjalanan, menyusun jadwal. Bahkan membaca cerita detektif dan misteri akan lebih menyenangkan jika kita memiliki cara berpikir yang logis.

Saat ini ada inisiatif internasional yang bernama Bebras yang memperkenalkan computational thinking kepada pelajar mulai sekitar kelas 3 SD sampai usia SMU. Berbeda dengan olimpiade informatika atau coding challenge yang perlu memprogram, dan olimpiade matematika yang sangat teoretis, tantangan Bebras berada di antara keduanya.

Walaupun saya tidak meminta Jonathan jadi programmer, tapi karena dia melihat saya tiap hari berada di depan komputer, ngoprek segala macam hardware, termasuk membuatkan dia berbagi mainan, dia jadi curious. Jadi pelajaran yang saya berikan pada Jonathan lebih banyak untuk menjawab keingintahuannya. Hal penting bagi saya saat ini adalah: saya tidak ingin memaksakan kemampuan Jonathan dan membebaninya dengan hal yang kompetitif.

Saya memakai layar di kiri, sambil membuka file PDF di layar kanan untuk diketik ulang oleh Jonathan di laptop kecil.

Topik seperti matematika dianggap sulit, tapi sebenarnya bisa dijelaskan pada anak-anak dengan banyak pengalaman sehari-hari. Hal-hal kecil seperti menghitung benda yang kita miliki, menghitung kembalian, dan menghitung waktu bisa diajarkan. Misalnya kita bisa bertanya seperti ini “kira-kira butuh 10 menit untuk pergi ke sana, jadi kita perlu berangkat jam berapa?”.

Joshua berlari dari kami sambil mempraktikkan matematika: menghitung ada berapa bus yang bisa diparkir di tempat parkir ini.

Demikian juga halnya computational thinking: pada anak-anak ini bisa diajarkan dengan hal-hal praktis. Supaya tidak terlalu banyak hal yang sifatnya teori, contoh hal praktis yang bisa diajarkan dari sejak kecil yang merupakan aplikasi dari computational thinking misalnya:

  •  belajar berpikir mengenai urutan, dan apa konsekuensinya jika kita melakukan sesuatu dalam urutan tertentu
  • belajar melihat suatu masalah dari belakang atau tengah (tidak harus selalu dari depan)
  • belajar membagi masalah menjadi bagian yang lebih kecil

Coding Apps

Computational thinking tidak butuh komputer. Meskipun demikian banyak hal akan lebih mudah dijelaskan menggunakan komputer. Coding merupakan aplikasi dari computational thinking dalam bentuk membuat kode program. Cara termudah (dan juga termalas) dalam mengajarkan coding adalah melalui berbagai aplikasi yang ada, baik di PC maupun tablet. Contoh aplikasi semacam ini misalnya: Code Spark Academy with the Foos, Scratch, Scratch Jr.

Beberapa aplikasi, seperti Scratch (ini aplikasi Desktop) sangat serius, dan perlu dasar matematika (aritmatika, sistem koordinat). Pendekatan visual kadang bagus untuk menyelesaikan kelas masalah tertentu, tapi sulit di kelas masalah yang lain (misalnya substitution cipher). Saya bisa menunjukkan bahwa program yang saya buat (program beneran) juga menggunakan “if”, “while”, dsb dan membandingkannya dengan notasi Scratch.

Sementara Scratch jr lebih ditujukan untuk menyampaikan cerita.  Misalnya jika saya menceritakan lelucon ke Jonathan, dia bisa membuat ulang joke-nya dalam bentuk cerita di Scratch Junior. Tapi ada batasan kerumitan cerita yang bisa dibuat oleh seorang anak dengan medium seperti ini.

Beberapa aplikasi terlalu menekankan pada aspek “fun” (misalnya Code Spark Academy with the Foos) yang akhirnya anak-anak jadi bermain tapi tidak belajar, dan ilmu yang didapat terbatas. Bahkan sejak usia Joshua lewat 2 tahun dia sudah bisa menyelesaikan banyak level di Code Spark Academy dengan “brute force” (nggak bisa ke kanan? kalau begitu dicoba ke atas. nggak bisa ke atas ? kalau begitu dicoba ke kiri).

Kami juga memiliki mainan Osmo. Benda ini pernah kami bahas di posting ini. Osmo memberikan aspek interaksi fisik pada aplikasi iPad. Salah satu permainannya adalah coding. Ini juga terlalu sederhana, sekedar berpikir beberapa langkah ke depan.

Permainan

Pendekatan offline yang paling sederhana dan bagus adalah melalui permainan yang mengajarkan berpikir. Contohnya: sudoku, catur, dan berbagai board game. Cara ini bagus, tapi membutuhkan investasi waktu yang cukup banyak dari orang tua.

Jonathan tidak memiliki niat untuk belajar sangat dalam mengenai catur, tapi dia cukup suka untuk memahami berbagai gerakan biji catur dan aturan catur. Ini merupakan contoh baik mengenai aturan (“if” di dunia komputer). Komputer bisa diajak bermain catur, tapi untuk tujuan belajar input dari orang lain ketika bermain catur akan lebih berguna. Misalnya: kamu yakin kamu mau menggerakan pion itu?

Sudoku ukuran kecil untuk belajar. DI baliknya ada ukuran penuh 9×9.

Ketika saya mencobakan soal bebras, ada beberapa soal yang pada dasarnya mirip sudoku. Begitu mengenali ini, dia bisa menyelesaikannya dengan cepat. Untuk anak-anak ada versi sudoku yang lebih kecil (bukan 9×9). Aturan sudoku sangat sederhana, dan bisa diajarkan dengan cepat. Tapi yang dibutuhkan oleh anak-anak adalah input dari orang tua untuk mengenal berbagai strategi yang ada, misalnya: coba kamu cari dulu, mana baris atau kolom yang punya 1 kotak kosong.

Board game yang kami miliki yang berusaha mengajarkan pemrograman adalah: Code Monkey Island. Menurut saya game ini cukup fun, tapi dari sisi programming kurang berhasil mengajari programming selain masalah kondisi (“if”).

 

Buku

Pendekatan offline lain  adalah melalui buku. Ada banyak buku menarik yang bisa dibaca oleh anak-anak, berikut ini review singkat dari beberapa buku yang kami miliki (mungkin di lain waktu kami akan menuliskan lebih dalam).

Buku Lift-the-flap computers and coding mengajarkan tentang dasar komputer. Isinya hanya fakta-fakta dan cerita yang menurut Jonathan cukup lucu.

Buku Coding for beginners using Scratch. Jonathan sudah meniru beberapa program dari buku ini, tapi sejauh ini kurang berkesan.

Buku seri micro adventures. Ini buku sangat lama, dan bentuknya novel yang disisipi kode dalam bahasa BASIC. Entah kenapa Jonathan justru sangat tertarik dan terkesan dengan berbagai program BASIC. Contohnya dia mengetik program BASIC untuk mendecode string (caesar cipher), dan ketika dia melihat ada puzzle semacam itu di buku lain, dia ingat programnya, dia ingin memakai programnya, dan juga dia mengerti untuk memodifikasi program dari enkrip menjadi dekrip dengan mengubah plus atau minus N.

Selain buku untuk anak-anak, buku  Mindstorms: Children, Computers, And Powerful Ideas patut dibaca oleh guru dan orang tua. Buku ini ditulis tahun 1980 dan direvisi tahun 1993. Buku ini ditulis oleh Seymour Papert, salah satu pionir AI, yang pernah bekerja sama bertahun-tahun dengan Jean Piaget, seorang psikolog dan filosofer yang terkenal karena studi epistemologi pada anak-anak (epistemologi adalah teori  mengenai pengetahuan). Jadi buku ini dituliskan oleh orang yang benar-benar mengerti ilmu perkembangan anak, dan yang benar-benar mengerti mesin.

Materi online

Sudah ada banyak materi online untuk mengajarkan pemrograman dan computational thinking. Berikut ini beberapa linknya (sebagian saya tahu ini dari Bu Inge yang terlibat aktif di Bebras Indonesia).

Untuk yang berbahasa Indonesia situs Bebras Indonesia berisi berbagai informasi Bebras dan, Olympia.id berisi materi dan contoh soal bebras.

CS Unplugged (dari University of Canterbury, New Zealand)  berisi berbagai kurikulum dan materi untuk berbagai usia. Sesuai namanya “unplugged”, tidak dibutuhkan komputer untuk belajar materi di situs tersebut. Materi yang ada perlu dibaca oleh pengajar dan diajarkan ke anak-anak, bukan kita serahkan langsung materinya ke anak-anak.

Dari jaman dulu BBC memiliki misi edukasi yang sangat baik. Di situs BBC ada topik Computational Thinking. Sama seperti CS Unplugged, materi yang ada perlu dibaca oleh pengajar dan diajarkan ke anak-anak.

Untuk pemrograman yang praktis, ada banyak situs, salah satunya adalah code.org. Di sini beberapa pelajaran langsung bisa diberikan ke anak (ada video dan teks yang bisa dibaca oleh anak-anak).

Banyak situs lain juga yang sangat abstrak tapi mungkin cocok untuk para guru agar lebih memahami konsep belajar di abad yang baru.

Penutup

Sebagai homeschooler kami tidak perlu menunggu sekolah untuk mengupdate dirinya dengan ilmu computational thinking.  Bagi kami topik ini juga cukup natural karena kami berdua memiliki background teknik informatika, jadi lebih mudah bagi kami menyisipkan topik computational thinking ini dalam pelajaran sehari-hari.

Di posting lain saya akan mencoba lebih banyak memberikan contoh-contoh praktis mengajarkan computational thinking dan mungkin juga akan membahas lebih detail berbagai aplikasi, buku, dan website yang pernah kami coba.

Mengajarkan Basis Bilangan

Salah satu dari materi di pelajaran Language Arts adalah memahami dictionary order (lexicographical order) . Materi ini sangat mudah dimengerti, bahwa AAA muncul sebelum AAB. Beberapa latihan dalam materi ini adalah mempraktikkan mencari kata di kamus dan mengurutkan kata berdasarkan urutan kamus.

Seperti biasa, kadang Jonathan belajar di samping saya yang sedang bekerja di depan komputer. Jadi saya mencoba menguji Jonathan dengan soal sederhana, seperti, jika kita cuma punya 4 huruf dan kita urutkan berdasarkan urutan kamus, maka setelah AAAA, AAAB, AAAC adalah? jawabannya tentunya adalah AAAD. Nah setelah AAAZ berikutnya apa? saya membantu jawab dengan AABA, berikutnya Jonathan sudah tahu bahwa setelah AAZZ berikutnya adalah ABAA. Saya menggunakan Microsoft Word dengan font yang saya perbesar untuk bisa dengan cepat menjelaskan hal seperti ini.

Saya jelaskan juga bahwa sebenarnya cara kita berhitung dalam basis 10 juga seperti itu. Setelah digit terakhir (paling kanan) menjadi 9, maka berikutnya menjadi 0, dan kita menambahkan ke digit sebelumnya. Tadi ada 26 simbol untuk A-Z sedangkan untuk bilangan desimal ada 10 bilangan (0-9). Bagaimana jika kita cuma punya 0 dan 1 (biner). Saya mulai dengan 0000, apa berikutnya? gampang sekali dipahami bahwa ini menjadi 0001. Jonathan perlu berpikir sedikit untuk mengingat bahwa digit “2” tidak ada, jadi 1 kembali menjadi 0, dan digit berikutnya dinaikkan, hasilnya 0010. Berikutnya lagi kita tambah satu lagi menjadi 0011.

Sekarang saya memberi label desimal di sebelah kiri urutannya:

0 0000
1 0001
2 0010
3 0011

Dengan melihat tabel ini bisa dilihat bahwa 3 desimal sama dengan 0011 dalam biner. Saya bisa saja menjelaskan lebih lanjut mengenai cara singkat konversi dari biner ke desimal, tapi karena saya hanya menyisipkan materi di language arts maka tidak saya teruskan.

Sebenarnya masalah berhitung biner ini sudah pernah dibaca Jonathan, salah satunya dari buku Lift-The-Flap Computers and Coding.

Seperti kebanyakan buku, yang diajarkan biasanya lebih ke cara cepat konversi biner ke desimal, dan bukan mengapa cara berhitungnya seperti itu.

Ini sekedar cerita bahwa dengan metode homeschooling, sebagai pengajar saya bisa menyisipkan berbagai materi lain yang berhubungan dengan sebuah mata pelajaran, meskipun sepertinya pelajaran tersebut jauh sekali dari pelajaran saat ini. Saya juga bisa menjelaskan dengan cara yang menurut saya terbaik untuk Jonathan.

Sebagai catatan, hal seperti ini bukan cuma dilakukan oleh saya, banyak orang tua lain yang berusaha menjelaskan konsep kompleks kepada anaknya. Contoh yang saya baca baru-baru ini adalah: Conversations with a six-year-old on functional programming.

Sebenarnya banyak yang sudah menyadari betapa pentingnya menyambungkan satu konsep dengan konsep lain dengan istilah thematic learning (metode pembelajaran tematik). Tapi sering kali yang saya dapati dalam praktik adalah: materinya agak dipaksakan dan fokus yang salah. Mengenai materi yang dipaksakan ini bisa dilihat dari contoh-contoh yang kurang masuk akal di buku. Tema yang dianggap berhubungan juga biasanya terbatas, padahal banyak hal yang berhubungan di dunia ini.

Mengenai fokus yang salah biasanya karena gurunya berkonsentrasi hanya di bidang yang dikuasai atau disukainya. Kadang ini menyebabkan pelajaran tetap tidak bisa dipahami dan tidak berbekas di ingatan anak.

Contohnya: jika topiknya adalah tentang siklus air (water cycle) dan gurunya adalah tipe yang suka seni maka banyak waktu dihabiskan menggambar, mewarnai siklus air, membuat prakarya. Untuk tipe yang kurang menyukai seni seperti Jonathan, kegiatan seperti itu sangat membosankan. Seringkali ini juga jadi tidak tepat sasaran: yang suka seni hanya ingat bahwa tadi membuat gambar burung kecil di atas gunung, tapi tidak bisa menjelaskan water cycle, sementara anak lain yang tidak suka menggambar bisa menjelaskan secara lisan seluruh water cycle tapi merasa bosan berjam-jam mewarnai.

Demikian cerita singkat mengenai pelajaran basis bilangan ketika mengajar Jonathan.