Reversing di GNU/Linux

Disclaimer

For Educational Purpose Only. Penulis tidak bertangungjawab atas penggunaan ataupun penyalahgunaan tutorial ini. Use at your own risk.

Latar Belakang

Tutorial ini dibuat karena kebetulan penulis tidak menggunakan OS Proprietary, dan beberapa saat yang lalu harus melakukan reversing terhadap sebuah aplikasi sehingga mau tidak mau, reversing tersebut dilakukan menggunakan GNU/Linux.

Target

PDF Camp (http://www.verypdf.com/)

Tools

  • UPX (http://upx.sf.net/)
  • IDA Pro versi Linux (http://www.hex-rays/idapro/)
  • Setjangkir kopi pahit (*optional bikin sendiri)

Langkah-langkah

  • Install pdf camp di komputer yang menggunakan Windows(R)
  • Browse ke direktori tempat aplikasinya ter-install misalnya “\Program Files\verypdf\pdfcamp”
  • Cari sub direktori pada direktori instalasi tersebut yang namanya “drivers”
  • Pada direktori drivers, terdapat file bernama “pdfui.dll”. nah, file tersebut yang akan kita reverse karena di dalamnya berisi intan dan permata…weleh maksudnya di dalam file tersebut terdapat fungsi registrasi :D
  • Ok, sekarang kita akan mereverse “pdfui.dll” di GNU/Linux, jadi langkah berikut dilakukan di GNU/Linux.
  • File “pdfui.dll” dikompres menggunakan UPX, jadi kita terlebih dahulu harus melakukan dekompresi dengan perintah:

    upx -d pdfui.dll

  • Setelah dekompresi selesai, maka kita akan me-load “pdfui.dll” ke IDA Pro untuk selanjutnya di-disassembly. Untuk itu, gunakan perintah:

    idal pdfui.dll

  • Selanjutnya perhatikan jendela disassembly IDA Pro. Kita akan berada pada entry point “pdfui.dll”. Scroll sedikit ke bawah, hingga menemukan string yang akan ditampilkan pada messagebox jika registrasi berhasil. String tersebut adalah:

    “Thank you selected our products.”

  • String yang kita cari berada pada offset 0x902062EB. Selanjutnya kita scroll ke atas lagi untuk mencari fungsi yang menghitung serial serta BAD jump yang akan menampilkan messagebox jika registrasi gagal.
  • Pada offset 0×90206268 kita bisa melihat BAD jump yang akan menampilkan message box jika registrasi gagal.
  • Nah, ini dia messagebox yang akan ditampilkan jika registrasi gagal
  • Ok, sekarang kita kembali ke BAD jump yang tadi. Di atas BAD jump tersebut ada CALL ke fungsi pengecekan pertama.
  • Tekan enter untuk mengikuti arah instruksi CALL tersebut, maka kita akan sampai pada pengecekan pertama. Fungsi pengecekan ini akan memeriksa jumlah karakter pada serial yang kita masukkan. Serial yang valid adalah jika jumlah karakternya lebih dari 13 karakter.
  • Setelah pengecekan berhasil (jumlah karakter pada serial lebih dari 13 karakter) maka kita akan dibawa ke fungsi pengecekan serial selanjutnya yaitu dengan adanya instruksi CALL ke offset 0×90208530
  • Nah pada offset tersebut terdapat fungsi / subrutin berikut ini ( lengkap dengan penjelasan yang asal-asalan :p ) :
    ;
    ; +--------------------------------------------------------------+
    ; | This file is generated by The Interactive Disassembler (IDA) |
    ; | Copyright (c) 2004 by DataRescue sa/nv,                      |
    ; +--------------------------------------------------------------+
    
    ; --------------- S U B	R O U T	I N E ---------------------------------------
    
    sub_90208530    proc near        ; CODE XREF: sub_902085C0+21^p
    
    var_18  = dword ptr -18h                        ; buffer lokal
    var_C   = dword ptr -0Ch                        ; buffer lokal
    arg_0   = dword ptr  4                          ; parameter 1 (serial)
    
            sub    esp, 18h                         ; alokasi buffer lokal
            push   esi                              ; simpan esi
            mov    esi, [esp+1Ch+arg_0]             ; esi = parameter 1
            lea    edx, [esp+1Ch+var_18]            ; edx = buffer lokal
            push   edi                              ; simpan edi
            mov    al, [esi]                        ; al = serial[0] ?
            mov    cl, [esi+1]                      ; cl = serial[1] ?
            mov    byte ptr [esp+20h+var_C], al     ; simpan serial[0]
            xor    al, al                           ; kosongkan al
            push   edx                              ; edx = parameter untuk atoi
            mov    byte ptr [esp+24h+var_C+1], al   ; isi buffer lokal dengan al
            mov    byte ptr [esp+24h+var_18], cl    ; isi buffer lokal dengan cl
            mov    byte ptr [esp+24h+var_18+1], al  ; isi buffer lokal dengan al
            call   atoi                             ; ubah edx menjadi integer/bilangan
            mov    edi, eax                         ; edi = serial[1]
            lea    eax, [esp+24h+var_C]             ; eax = serial[0]
            push   eax                              ; eax = parameter untuk atoi
            call   atoi                             ; ubah eax menjadi integer/bilangan
            add    edi, eax                         ; edi = serial[1] + serial[0]
            add    esp, 8                           ; seimbangkan stack
            cmp    edi, 8                           ; serial[0] + serial[1] = 8
            jz     short loc_9020857A               ; jika benar, *LANJUTKAN*
            pop    edi                              ; kembalikan edi
            xor    eax, eax                         ; eax = 0 *SERIAL SALAH*
            pop    esi                              ; kembalikan esi
            add    esp, 18h                         ; seimbangkan stack
            retn   4                                ; keluar dari fungsi
    ; ---------------------------------------------------------------------------
    
    loc_9020857A:                ; CODE XREF: sub_90208530+3E^j
            cmp    byte ptr [esi+2], 56h            ; serial[2] = 56h = ASCII("V")
            jz     short loc_9020858A               ; jika benar, *LANJUTKAN*
            pop    edi                              ; kembalikan edi
            xor    eax, eax                         ; eax = 0 *SERIAL SALAH*
            pop    esi                              ; kembalikan esi
            add    esp, 18h                         ; seimbangkan stack
            retn   4                                ; keluar dari fungsi
    ; ---------------------------------------------------------------------------
    
    loc_9020858A:                ; CODE XREF: sub_90208530+4E^j
            cmp    byte ptr [esi+3], 32h            ; serial[3] = 32h = ASCII("2")
            jz     short loc_9020859A               ; jika benar, *LANJUTKAN*
            pop    edi                              ; kembalikan edi
            xor    eax, eax                         ; eax = 0 *SERIAL SALAH*
            pop    esi                              ; kembalikan esi
            add    esp, 18h                         ; seimbangkan stack
            retn   4                                ; keluar dari fungsi
    
    loc_9020859A:                ; CODE XREF: sub_90208530+5E^j
            cmp    byte ptr [esi+5], 31h            ; serial[5] = 31h = ASCII("1")
            jz     short loc_902085AA               ; jika benar, *LANJUTKAN*
            pop    edi                              ; kembalikan edi
            xor    eax, eax                         ; eax = 0 *SERIAL SALAH*
            pop    esi                              ; kembalikan esi
            add    esp, 18h                         ; seimbangkan stack
            retn   4                                ; keluar dari fungsi
    ; ---------------------------------------------------------------------------
    
    loc_902085AA:                ; CODE XREF: sub_90208530+6E^j
            mov    cl, [esi+0Fh]                    ; cl = serial[0x0F]
            xor    eax, eax                         ; eax = 0
            cmp    cl, 38h                          ; serial[0x0F] = 38h = ASCII("8")
            pop    edi                              ; kembalikan edi
            setz   al                               ; set al=1 jika serial benar
            pop    esi                              ; kembalikan esi
            add    esp, 18h                         ; seimbangkan stack
            retn   4                                ; keluar dari fungsi
    sub_90208530   endp
    
    ; ---------------------------------------------------------------------------
  • Bagi yang tidak hafal ASCII hexcode, bisa menggunakan python untuk mencari tahu karakter yang ada pada perhitungan tersebut.
  • Ok, jadi sampai di sini kita bisa mengambil kesimpulan bahwa:
    • jumlah karakter pada serial adalah 16 karakter
    • angka pada karakter pertama dan kedua jika dijumlahkan nilainya 8
    • karakter ke-3 pada serial adalah huruf “V”
    • karakter ke-4 pada serial adalah angka “2″
    • karakter ke-6 pada serial adalah angka “1″
    • karakter ke-16 (terakhir) pada serial adalah angka “8″
    • contoh serial yang valid adalah: 62V2x1xxxxxxxxx8
  • Sekian tutorial kali ini, mohon dikoreksi jika ada kesalahan khususnya pada keterangan kode disassembly. Dan maaf jika tutorial kali ini cukup membingungkan karena memang tutorial ini bukan ditujukan untuk pemula

Ucapan Terima Kasih

  • Tuhan Yang Maha Esa
  • NitrouZ, dylavig, 4NV|E, movzx, lucuBRB, orakanggo, pinczakko, hddstudio, segenap crew SBKJ dan InRev, serta semuanya yang tidak sempat saya sebutkan satu persatu, dan juga Anda yang telah membaca tutorial sederhana ini :)>-

, , , ,

7 Responses to Reversing di GNU/Linux

  1. plumiash November 24, 2008 at 8:47 #

    muaknyus oom!

    :D tambah lagi dooong.. :D

  2. dylavig November 24, 2008 at 9:23 #

    keren nih :)>- :D tks

  3. garo November 27, 2008 at 16:56 #

    wew,, gw mah biasa maen lompat2an JE, JNE, JZ, JMP, dll aja,, ga sampe dapet gitu :D

  4. arifnpm December 6, 2008 at 14:16 #

    Loh, IDA kan gak gratis. Hahaha, ngebajak sawah yaaaa? Gapapa, untuk belajar sih.
    Btw, punya tutorial untuk assembly x64 gak? Kalo punya ebook atau tutorial mengenai bahasa assembly x64 bagi2 dunkz. Thanks!

  5. drubicza December 7, 2008 at 3:55 #

    #1: terima kasih ^:)^ nanti saya usahakan buat tutorial reversing lagi jika ada waktu luang :)

    #2: thanks bro dylavig :D wah, ditunggu tutorial dari bro juga :)

    #3: kalau menurut teman saya dulu, membuat key generator adalah langkah terbaik jika dibandingkan dengan hard patching.

    #4: iya Om :”> IDA nya tidak gratis. maafkan saya, soalnya hanya itu yang bisa saya gunakan dalam tempo yang sesingkat-singkatnya. kebetulan saya belum punya tutorial untuk x86_64 … nanti kalau ada akan saya share :) terima kasih ^:)^

  6. lucubrb March 28, 2009 at 1:40 #

    kya… keren om ndru :genit:

    baru baca :genit:

  7. fuckeeh July 8, 2010 at 22:28 #

    nambah ilmu lagi nih,..,., manstab.,., :D

Leave a Reply