Trend Micro CTF Asia Pacific & Japan 2015 Online Qualifier Writeup: Analysis-offensive 200

Melanjutkan tulisa writeup sebelumnya, ini challenge kedua yang saya selesaikan. Kebetulan yang di analisis adalah apk android, jada saya berusaha untuk menyelesaikannya meskipun dengan susah payah (maklum noobs :D).

soal:
Category: Analysis-offensive
Points: 200

Click button to get the flag!
Link apk

Begitu mendapatkan apk, yang pertama saya lakukan adalah mengekstraknya, setelah melihat-lihat resource asset yang ada di apk saya mendapati file image bernama f.png, yang ternyata tidak bisa di buka dengan image viewer, mencurigakan :D. Akhirnya saya lihat dengan hexeditor, ternyata header file-nya hilang, saya balikin deh header-nya, dan ternyata saya dapat gambar ini:

f

haha.., ternyata ga semudah itu untuk mendapatkan flagnya. Ok, kalau gitu coba cara kedua, Pertama saya coba jalankan aplikasinya di emulator, ternyata saat di jalankan akan muncul splash screen, setelah itu muncul halaman baru dimana kita bisa klik akan membunuh virus (ada gambar virus/bakteri terhapus), dan nampaknya untuk menyelesaikannya butuh klik 10 juta kali haha…

Screen Shot 2015-09-27 at 8.13.23 PM

Challenge accepted, secara naif saya membuat uiautomator buat klik halaman tersebut sebanyak 10 juta kali (maunya), dan setelah di run beberapa saat, saya perkirakan klik tersebut baru akan selesai setelah 500 jam-an, hahaha..Ok, solusi ga feasible ni.

Selanjutnya saya analisis aplikasinya waktu runtime dengan drozer dan saya menemukan ada dua kemungkinan attack yang bisa dilakukan satu pada activity dan satu broadcast receiver yang bisa di invoke dari luar aplikasi, dua attack vector tersebut adalah dua kelas ini:

  1. activity: com.tm.ctf.clicker.activity.SplashActivity
  2. broadcast receiver: com.tm.ctf.clicker.receiver.ScoreBroadcastReceiver

Jadinya saya menggunakan dex2jar untuk mendecompile dex file-nya menjadi yang kemudian dengan bantuan JD-GUI saya bisa mendecompile jar untuk mengira kode java-nya:

Screen Shot 2015-09-27 at 7.53.34 PM

wah, ternyata ada activity bernama CongraturationsActivity, ini menarik, janga-jangan kalau saya invoke activity itu secara langsung, saya bisa dapat flag-nya. Secara naif saya langsung eksekusi ide itu. Pertama, saya manipulasi apk dengan dengan apktool supaya CongraturationsActivity bisa di invoke dari luar aplikasi, selanjutnya dengan bantuna drozer saya coba invoke activity-nya, dan…ternyata ga bisa hahaha..Ok, kalau gitu mari lihat code-nya:

Pertama, CongraturationsActivity, oh ternyata di kelas ini di cek apakah counter yang ada di shared preference sudah 10 juta atau belum, kalau belum, close activitiynya, ini rupanya yang membuat cara sebelumnya ga jalan Screen Shot 2015-09-27 at 8.03.06 PM

Ok, dengan itu saya coba beberapa cara, karena running di emulator saya bisa langsung memanipulasi nilai shared preference-nya, saat runtime dan ternyata saat halaman itu muncul, flag-nya ga dapat, karakter yang ditampilkan berantakan bukan flag yg dicari hahaha..;

Wah, harus serius kalau gitu, jadilah akhirnya dibaca sebagian besar code-nya secara lebih teliti. dan akhirnya cara menyelesaikannya secara singkat adalah dengan mendecode apk-nya dengan apktool, dimodifikasi code-nya dan di build kembali pakai apktool di jalankan, kemudian di kirim broadcast Score 7 nilai supaya string data terisi semuanya, dan kemudian tampilkan flag-nya melalui kelas CongraturationsActivity tadi. Cara panjangnya adalah sebagai berikut:

1. decompile apk dengan apktool
2. ubah di kelas CongraturationsActivity agar tidak di close meskipun data shared preferences bukan 10000000, mudahnya ganti line 150 pada kelas CongraturationsActivity.smali dari

if-eq v0, v1, :cond_0

jadi

if-ne v0, v1, :cond_0

sehingga kalau bukan 10M malah ga di close activitynya

3. ubah di kelas c.smali di method onTouchEvent
pindah code smali berikut di awal (aslinya ini hanya di eksekusi kalau sudah 10 juta klik)


    invoke-static {}, Landroid/os/Message;->obtain()Landroid/os/Message;

    move-result-object v0

    new-instance v1, Ljava/lang/StringBuilder;

    iget-object v2, p0, Lcom/tm/ctf/clicker/activity/c;->q:Ljava/lang/String;

    invoke-static {v2}, Ljava/lang/String;->valueOf(Ljava/lang/Object;)Ljava/lang/String;

    move-result-object v2

    invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    const-string v2, "Jh"

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v1

    iput-object v1, v0, Landroid/os/Message;->obj:Ljava/lang/Object;

    iget-object v1, p0, Lcom/tm/ctf/clicker/activity/c;->b:Landroid/os/Handler;

    invoke-virtual {v1, v0}, Landroid/os/Handler;->sendMessage(Landroid/os/Message;)Z

4. selanjutnya build ulang dengan apktool
5. sign dengan jarsigner
6. install kembali apk ke hp/emulator
7. jalankan aplikasi
8. saat halaman mainactivity muncul, kirim broadcast message berikut dengan menggunakan drozer

run app.broadcast.send --action com.tm.ctf.clicker.SCORE --component com.tm.ctf.clicker com.tm.ctf.clicker.receiver.ScoreBroadcastReceiver --extra integer SCORE 3769
run app.broadcast.send --action com.tm.ctf.clicker.SCORE --component com.tm.ctf.clicker com.tm.ctf.clicker.receiver.ScoreBroadcastReceiver --extra integer SCORE 10007
run app.broadcast.send --action com.tm.ctf.clicker.SCORE --component com.tm.ctf.clicker com.tm.ctf.clicker.receiver.ScoreBroadcastReceiver --extra integer SCORE 59239
run app.broadcast.send --action com.tm.ctf.clicker.SCORE --component com.tm.ctf.clicker com.tm.ctf.clicker.receiver.ScoreBroadcastReceiver --extra integer SCORE 100003
run app.broadcast.send --action com.tm.ctf.clicker.SCORE --component com.tm.ctf.clicker com.tm.ctf.clicker.receiver.ScoreBroadcastReceiver --extra integer SCORE 495221
run app.broadcast.send --action com.tm.ctf.clicker.SCORE --component com.tm.ctf.clicker com.tm.ctf.clicker.receiver.ScoreBroadcastReceiver --extra integer SCORE 1000003
run app.broadcast.send --action com.tm.ctf.clicker.SCORE --component com.tm.ctf.clicker com.tm.ctf.clicker.receiver.ScoreBroadcastReceiver --extra integer SCORE 9999999

9. selanjutnya klik halaman mainactivity sekali, tunggu sebentar flag akan muncul
TMCTF{Congrats_10MClicks}

Screen Shot 2015-09-26 at 7.12.07 PM

Trend Micro CTF Asia Pacific & Japan 2015 Online Qualifier Writeup: Programming 200

Weekend ini saya ikut bermain CTF Trend Micro Qualifier 2015 bersama teman-teman kantor, sangat menarik dan menantang (banyak yang susah menurut saya :D), terutama bagi newbie dalam CTF seperti saya. Writeup dari dua soal yang saya selesaikan akan di tulis dalam dua postingan terpisah, berikut yang pertama (yang kedua ada di link ini https://jampasir.wordpress.com/2015/09/27/trend-micro-ctf-asia-pacific-japan-2015-online-qualifier-writeup-analysis-offensive-200/), soal Programming dengan skor 200

soal

# Calculate it.
# nc ctfquest.trendmicro.co.jp 51740

saat nc ke server tersebut kita akan mendapat soal matematika dengan berbagai variasinya dan harus menjawabnya dengan dengan cepat sebelum timeout, ada yang dalam bentuk sederhana (misal 5 + 5) atau dalam format romawi (misal V + IX) atau dalam format kata (misal one + zero – seven) atau kombinasi ketiganya (misal 5 + one – IX). challenge ini saya selesaikan dengan membuat python, berikut log-nya:

awalnya
awalnya

selanjutnya: Screen Shot 2015-09-27 at 12.55.46 PM

akhirnya:

Screen Shot 2015-09-27 at 12.56.15 PM

dapat flagnya: TMCTF{U D1D 17!}
berikut kode python yang saya buat untuk menyelesaikan challenge tersebut (berantakan tambal sulam, ga diperbaiki apa adanya ini mah :D ):

Baca selebihnya »

Android Unit: px (pixel), dp/dip (density-independent pixel) dan sp (scale-independent pixels)

tldr;

selalu gunakan sp untuk teks dan dp untuk yang lainnya. Kecuali, benar-benar terpaksa dan tahu benar konsekuensinya, gunakanalah px.

Ekosistem android dikenal dengan fragmentasi spesifikasi device yang sangat bervariasi. Tentunya ini tantangan tersendiri bagi developer. Untungnya, untuk masalah screen density yang bervariasi, sepertinya sudah diantisipasi oleh para pengembang platform Android di Google, dengan memperkenalkan dua unit/satuan baru yaitu dip/dp (density-independent pixel) dan sp (scale-independent pixels).

Misalkan ada dua tablet 7-inch (ukuran diagonal layar), tablet pertama (A) memiliki resolusi layar  1200x1920px 320dpi dan yang lainnya (B) beresolusi 2048x1536px 326dpi. Membuat button dengan ukuran 300x300px mungkin akan tampak normal pada  tablet tapi akan tampak kecil di tablet

Tapi akan berbeda jika kita spesifikasikan ukuran buttonnya dengan ukuran yang bergantung pada density layar alias menggunakan dip misal 300x300dp.

secara fisik ukuran button tersebut akan selalu sama pada ukuran layar yang berbeda.

Perhatikan gambar berikut:

Screen Shot 2015-07-15 at 1.45.58 PM

ukuran 200dp akan dikonversi pada device mdpi (device dengan density 160dpi/dots per inch) menjadi 200px dan menjadi 400px pada device xhdpi (density 420dpi) misal pada nexus 4. Sehingga ukuran tersebut tampak sama dan konsisten secara fisik untuk beragam device dengan ukuran layar yang berbeda.

serupa dengan dp adalah sp (scaled-independent pixels) yang kita gunakan untuk ukuran teks. Perbedaannya, dengan menggunakan satuan sp android akan menscale ukuran teks sesuai dengan setting ukuran teks di device (yang biasa dapat di akses melalui menu settings).

Jadi, selalu gunakan sp untuk teks dan dp untuk yang lainnya. Kecuali, kamu benar-benar terpaksa dan tahu benar konsekuensinya, jangan menggunakan satuan px. Jika kebetulan designer yang bekerja bersama anda belum tahu, beritahukan untuk selau menginformasikan spesifikasi design dengan dp/sp. Beberapa website berikut akan sangat membantu:

  1. http://developer.android.com/guide/practices/screens_support.html
  2. http://developer.android.com/training/multiscreen/screendensities.html
  3. http://dpi.lv/
  4. https://pixplicity.com/dp-px-converter/
  5. https://www.youtube.com/watch?v=zhszwkcay2A

Tulisan ini terinspirasi setelah membaca status path Sidiq (salah satu Android Developer Expert dari Indonesia )

Hosting website dengan RedHat OpenShift

Weekend lalu, saya memiliki Ide untuk membuat service untuk aplikasi yang saya buat di sini Al-Mishbah. Karena saya lagi belajar menggunakan Lumen, micro-framework yang dibuat oleh Taylor Otwell, empunya Laravel, saya langsung mengembangkannya dengan lumen; setelah selesai protipe website tersebut, saya memutuskan untuk mendeploy web tersebut ke RedHat OpenShift yang menyediakan paket free.

Tapi kemudian saya menyadari, ternyata di OpenShift masih hanya mensupport PHP versi 5.4 (kurang tahu minor versionnya) sedangkan Lumen mensyaratkan PHP 5.5.9; Jadi saya berubah pikiran untuk mengubah framework sekalian dengan menggunakan Laravel mengingat ada tutorial untuk langsung mendeploy-nya di laman berikut https://hub.openshift.com/quickstarts/115-laravel-5-0 . Tapi, karena saya tidak terbiasa dengan Laravel, saya agak kesulitan.

Dan setelah melihat framework laravel-nya sendiri, saya lihat ini framework lumayan gendut, jadi rasanya sayang kalau untuk service yang sederhana menggunakan framework sebesar ini. Kemudian saya teringat dengan SlimFramework yang juga saya gunakan di service saya yang lain. Dan akhirnya, Service tersebut selesai saya deploy di sini: rowahu.info/hadits/bukhari/1 . Pattern url yang digunakan adalah http://rowahu.info/hadits/<nama kitab hadits>/<nomor hadits>.

Menginstall rhc (redhat client) di Mac Os X

  1. Pastikan ruby (gems) sudah terinstall, di OSX biasanya sudah terinstall, update jika diperlukan.
  2. Ketika perintah berikut untuk menginstall rch dengan gem
    $sudo gem install rhc
  3. Jika ada masalah dengan dependency, pastikan untuk mengupdate gem-nya
    $sudo gem update

Setup rhc

setelah rch selesai di install, kita tinggal setup OS kita dengan otentikasi yang dibutuhkan, sehingga nantinya tidak perlu repot saat autentikasi dll.

  1. Mulai dengan mengeksekusi perintah berikut
    $rhc setup
  2. Selanjutnya masukkan username dan password yang digunakan signup di openshift
  3. Nantinya akan ada pilihan untuk menyimpan public key dan mengupload-nya ke server supaya tidak repot lagi memasukkan username dan password saat menggunakan rhc selanjutnya

Membuat aplikasi

Membuat aplikasi di openshift dapat dilakukan di web ataupun melalui console dengan menggunakan rhc yang sudah terinstall tersebut. Untuk membuat aplikasi dengan rhc bisa dengan langkah berikut:

$ rhc create-app rowahu php-5.4 mysql-5.5

untuk mensetup aplikasi dengan nama rowahu dengan spesifikasi (cartridges) php-5.4 dan mysql-5.5
sesaat kemudian nanti akan di dapatkan informasi tentang environment yang sudah terbuat: mysql usrname dan password, mysql connection url URL dari aplikasi dan juga untuk SSH serta alamat URL Git dari server source code yang bisa kita gunakan seperti berikut:

  URL:        http://rowahu-hakimlabs.rhcloud.com/
  SSH to:     xyzabcdefghij@rowahu-hakimlabs.rhcloud.com
  Git remote: ssh://xyzabcdefghij@rowahu-hakimlabs.rhcloud.com/~/git/rowahu.git/

selanjutnya, kita bisa meng-clone source code tersebut dan memodifikasinya sesuai kebutuhan aplikasi yang kita kembangkan.

Screen Shot 2015-06-29 at 3.10.23 PM

Mengubah nama domain

Secara default, kita akan mendapatkan subdomain dari rhcloud.com, tapi kita bisa mengubah nama domain dengan nama domain yang kita beli sendiri (misalnya rowahu.info):

  1. Beli domain dari reseller domain apapun.
  2. Selanjutnya, buat alias di dashboard aplikasi di openshiftScreen Shot 2015-06-29 at 3.12.53 PM
  3. Kemdudian, setting dns host record di tempat anda membeli domain tersebut ke alaman url aplikasi yang dibuatkan oleh rhcloud seperti berikut
  4.  Screen Shot 2015-06-29 at 3.17.17 PM

Sekarang aplikasi web kita sudah bisa diakses dengan custom domain sesuai dengan keinginan kita.

happy coding :)

Google Apps Script for Fun and Profit

Saya suka membaca, buku, artikel, blog, notes dll, untuk blog saya biasa menggunakan google reader dan setelah di shutdown, saya berpindah menggunakan feedly, ada lebih dari seratus sumber berita saya subscribe (meskipun tidak selalu saya baca semua artikelnya). Saya juga senang sekali kalau ada yang mengirimkan artikel-artikel menarik melalui email karena tentu saja pengirim info tersebut telah memilihkan berita atau informasi yang menarik bagi saya. Hal tersebut yang dilakukan oleh salah seorang manager senior di kantor.

Karena beliau relatif sering mengirimkan artikel tersebut, saya berfikir untuk menyimpan artikel-artikel tersebut di google site saya, sehingga saya bisa mengaksesnya sewaktu-waktu dengan mudah. Oleh karena itu saya membuat script sederhana untuk mengambil artikel tersebut dan menyimpannya di google site dengan menggunakan google apps script. Menggunakan google apps script ternyata sangat mudah, berikut script yang saya buat:

/**
 * Retrieves all inbox and post body email from pak Soegi with subject: "fyi" to google sites
 * https://sites.google.com/a/kaskusnetworks.com/hakim/home/articles
 * For more information on using the GMail API, see
 * https://developers.google.com/apps-script/class_gmailapp
 */
function processInbox() {
  Logger.log("start reading inbox");
  // get top 50 inbox (assuming no more than 50 threads within a day)
  // sort it based on first message date, since sometimes old thread goes up because of new message/reply
  // it make sure that only latest message read and posted to google site
  var threads = GmailApp.getInboxThreads(0, 50).sort(function(thread1, thread2){
    return thread2.getMessages()[0].getDate().getTime() - thread1.getMessages()[0].getDate().getTime();
  });
  
  var day_in_miliseconds = 86400000; // 24*60*60*1000
  if (threads.length > 0){
    for (var i = 0; ; i++) {
      // get all messages in a given thread
      var thread = threads[i];
      var firstmessage = thread.getMessages()[0];
      var firstmessagedate = firstmessage.getDate()
      var now = new Date();
      // only check for past 24 hour email
      if ((now.getTime() - firstmessagedate.getTime()) <= day_in_miliseconds){
        var messages = thread.getMessages();
        // log message subject
        var message = messages[0]; // we only care for the first message
        Logger.log(message.getFrom() + " subject: "+ message.getSubject())
        if (message.getSubject().trim() == "fyi" && message.getFrom().indexOf("soegi") > 0){
          var date = message.getDate()
          // post to google sites
          var fyi = "<strong>" + date.toLocaleDateString() + "</strong><br/>"+message.getBody();
          addArticlesToPage(fyi);
        }
      }else{ // outdated message
        break;
      }
    }  
  }
  
};

function addArticlesToPage(fyi){
  var domain = 'kaskusnetworks.com';
  var sitenya = 'hakim';
  var site = SitesApp.getSite(domain, sitenya);
  var page = SitesApp.getPageByUrl("https://sites.google.com/a/kaskusnetworks.com/hakim/home/articles");
  var content = page.getHtmlContent();
  // append content
  content = content.replace("</div></td>","<br/>"+fyi+"</div></td>");
  page.setHtmlContent(content);
}

selanjutnya saya tinggal menentukan trigger yang akan mengeksekusi fungsi tersebut (semcam membuat cron jobs). akhirnya halaman google sites saya akan selalu terupdate dengan link-link informasi menarik yang dikirimkan kepada saya. Dan di akhir pekan, saya bisa membaca semua link-link tersebut dengan santai.

happy scripting :)

Orthogonality

Beberapa waktu yang lalu saya sempat berdiskusi dengan team kecil kami, saat itu, seorang developer anggota tim butuh memanggil satu fungsi native dari embedded browser (ie. webview). Karena data yang di tambilkan webview adalah dari server (via Rest API), salah satu ide yang sempat muncul adalah dengan menyematkan satu kode dari server yang memanggil satu fungsi native yang didefinisikan di aplikasi. Tentu saja saya tidak sependapat dengan cara seperti ini, dan akhirnya teknik yang lebih baik diimplementasikanm yaitu fungsi tersebut disematkan di client aplikasi sebelum di tampilkan di webview.

Orthogonality

Dalam geometry, garis ortogonal adalah garis yang tegak lurus terhadap bidang frontal. dan dua garis disebut ortogonal jika keduanya tegak lurus satu sama lain (perpotongannya membentuk sudut 90 derajat). Dalam pemrograman, dua hal dikatakan ortogonal jika perubahan pada salah satunya tidak berpengaruh terhadap yang lainnya (independent/decoupled). Pada sistem yang didisain dengan sangat baik, perubahan pada basis data tidak akan berpengaruh terhadap antar muka, dan sebaliknya perubahan antarmuka juga tidak akan secara langsung berdampak pada basis data.

Demikian juga seperti topik yang saya ceritakan di awal blog ini, saya insist tidak boleh API memanggil fungsi di native client karena ini akan membuat aplikasi kita tidak ortogonal dengan API. Misalnya saat nama fungsi di aplikasi client berubah, maka di server juga harus dirubah begitu juga sebaliknya. bagaimana kalau sampai lupa dilakukan perubahan tersebut di salah satu tempat, padahal setidaknya ada 2 developer yang terlibat? Saat dua sistem yang berbeda sangat bergantung (dependent) satu sama lain, maka tidak akan terjadi pembenahan satu tempat saat satu bug muncul. Tentunya hal ini sangat tidak baik. Oleh karena itu, sistem yang baik adalah yang ortogonal, yang mana perubahan di satu bagian tidak akan berdampak langsung pada bagian yang lain yang tidak berkaitan.

bacaan:
1. http://en.wikipedia.org/wiki/Orthogonality_(programming)
2. http://en.wikipedia.org/wiki/Orthogonal#Computer_science

Install perl dan perl module di Mac OS X

karena suatu kebutuhan saya berusaha menginstall perl dan beberapa modulnya di Mac OS X, berikut adalah cara install perl yang saya dapatkan dari web sitenya perl

  • Install “Command Line Tools for Xcode”, either directly or through Xcode, both available fromApple Developer downloadsexternal link (free registration required). Xcode can also be installed through the App Store application.
  • Open the Terminal.app (found in Applications -> Utilities) and copy & paste the command below into it (then press the ‘return’ key):
    curl -L http://xrl.us/installperlosx | bash
  • Once this is finished (it takes several minutes), quit the Terminal app.

dan karena Mac OS X saya sudah terinstall xcode, maka yang harus saya lakukan hanya tinggal langkah ke 2 dan 3 :)

selanjutnya untuk menginstall modul perl kita butuh cpanm(inus), untuk menginstal cpanm cukup eksekusi perintah berikut di terminal

cpan App::cpanminus

 setelah selesai kita bisa instal modul perl menggunakan cpanm, misal kita mau install modul DBI

cpanm DBI