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

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

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s