Pages

10 Desember 2008

MAC OS X Reversing Tutorial for Beginner

Tutorial ini hanya terbatas untuk opcode x86, bukan PPC karena yang saya punya cuman hackint0sh.

Di sini saya akan mencoba membahas crackme yang paling simpel yang dibuat oleh CorruptFire yaitu boolRegistered.

Kracking Tools
Sebelum kita mulai tentunya kita harus mengetahui tools2 apa saja yang akan kita gunakan. Apakah kita akan menggunakan Olly Debugger sama seperti di windows?tentu tidak karena sejauh ini belum ada yang membuat kracking tools dengan tampilan GUI seperti OllyDbg. Tools yang akan kita gunakan antara lain:
1. Debugger, untuk keperluan ini kita gunakan gdb. GDB dibundle jadi satu dengan Apple Developer Tools.
2. Disassembler, kita akan menggunakan otx dari http://otx.osxninja.com dan class-dump
3. HexEditor, kita akan menggunakan 0xED.

gdb
GDB adalah GNU Project Debugger, yang akan digunakan untuk melakukan tracing selama program di eksekusi. Dengan adanya gdb, kita bisa melakukan tugas2 antara lain:
1. Start program atau attach program yang telah berjalan
2. Break, untuk menghentikan sementara program yang sedang berjalan seakan2 program tersebut hang
3. Mengetahui apa yang terjadi selama program tersebut berhenti.

GDB sudah dibundling dengan XCode, jadi jika sudah menginstall XCode, tinggal jalankan gdb aja.

otx

“otx stands for "object tool extended". It uses otool (object tool) to disassemble a Mach-O executable file, then enhances the disassembled output. Simple enhancements include adding the machine code of each instruction and the offset of each instruction from the beginning of a function.
More complicated enhancements include displaying the names and data types of Objective-C methods even if symbols have been stripped, and adding comments that describe member variables, function calls, static data and more.”
-taken from http://otx.osxninja.com/otwtf.html

You might also be asking yourself what the hell a disassembler is. I’ll tell you what it is...with some help from Wikipedia: http://en.wikipedia.org/wiki/Disassembler

class-dump
Aplikasi yang mendisassemble suatu program dengan mengeluarkan hanya judul class-nya saja.

HexEditor
“A hex editor is a program which allows you to edit compiled programs and binary data-files. These editors are called hex editors because they most often present data in hexadecimal format. Hexadecimal is used because it is easier for most humans than working in binary. In addition, hexadecimal is frequently useful because computers tend to work with 8-bit bytes of information and because ASCII is an 8-bit code.”
- taken from http://www.tech-faq.com/hex-editor.shtml

Hehe... agak males nulisnya jadi copy paste ajah. Ok, langsung aja tu de poin. Dalam melakukan kracking, tentu dikenal tahapan2 yang harus dilakukan yaitu Testing untuk mengetahui bagian mana yang akan dipatch, Disassembling, Debugging untuk mengetahui bagian mana yang seharusnya di-patch dan yang terakhir adalah Patch.

Testing
Tahapan ini adalah menjadi sangat penting karena mulai dari sini kita bisa mengetahui perilaku program tersebut, apakah menggunakan serial checking, file lisensi, online activation dll.

Jalankan program boolRegistered dan masukkan sembarang username dan serial



Jika nama dan serial yang kita masukkan salah maka akan keluar Error Serial Error bla..bla..bla...

OK, what next?
Selanjutnya kita masuk ke tahap disassembling, pertama kita jalankan class-dump dari Terminal



dan buka file hasil class-dump



Kita lihat di atas ada beberapa class yang kelihatannya menarik yaitu isRegistered(Boolean), checkRegister dan validateSerial(Boolean). Dan untuk melihat code-nya lebih dalam kita gunakan tool disassembler yang lain yaitu otx.

Buka OTX dan drag aplikasi boolRegistered ke window otx



Buka file hasil disassembler, scroll down.... dan kita akan ketemu class2:

  • AppManager awakeFromNib
    Fungsi ini merupakan fungsi inisiasi

  • AppManager applicationDidFinishLaunching
    Fungsi-fungsi yang dijalankan ketika aplikasi telah berjalan

  • AppManager checkRegister:
    Fungsi check register

  • AppManager isRegistered
    Fungsi check apakah sudah ter-register atau belum

  • AppManager validateSerial:forName:
    Fungsi check terhadap nama dan serial yang di-inputkan


OK, sekarang kita coba lihat class checkRegister dan ada sesuatu yang menarik yaitu string isEqual



Bagaimana kita menterjemahkan opcode di atas? Sebenernya untuk menterjemahkan hanya diperlukan logika sederhana dengan menggunakan string-string yang telah di tampilkan, misalnya untuk code di atas kita kumpulkan dahulu semua yang bisa kita baca secara logika misalnya kata-kata isEqual dan di bawahnya ada string "The Name you entered is not valid..." yang didahului dengan opcode testb dan je.

Secara logika berarti pada isEqual terdapat pengecekan sesuatu terhadap sesuatu dan jika hasil pengecekan itu salah maka akan menampilkan Error Message "The Name you entered is not valid...".

Dari error message tersebut bisa dipastikan bahwa yang dimaksudkan pada isEqual adalah pengecekan terhadap nama yang dimasukkan. Jika pengecekan benar maka akan lompat ke address 0x00002a04 dimana address tersebut akan melanjutkan pengecekan terhadap serial yang dimasukkan.

Next, kita trace lagi address 0x00002a04 dan ternyata ada lagi isEqual



tapi untuk rutin pengecekan yang satu ini kita lihat bahwa jika serial yang dimasukkan tidak benar(jne) maka akan lompat ke address 0x00002bc7 dimana jika kita lihat di address tersebut, yang tampil adalah error message "The Serial you entered is not valid. Please cheeck it and try again." Jika kita teliti lebih dalam mulai dari address 0x00002bc7 dan scroll ke atas maka akan kita temui kata2 "successSheet dan itulah yang kita maksud.

Jadi agar pengecekan serial itu "selalu" benar, maka kita harus melakukan patching terhadap salah satu decision sehingga serial apapun yang selalu dimasukkan akan menjadi benar.



OK, balik lagi ke address 0x00002a5i yang berisi instruksi jnel 0x00002bc7, kita turun lagi ke bawah sampai dengan ketemu fungsi validateSerial:forName:. Jadi disitulah pengecekan terhadap serial yang kita masukkan valid atau tidak.

Kita cari code dari class validateSerial:forName: lebih lanjut.



Di atas adalah sepenggal code dari class validateSerial:forName:. Tidak perlu dijelaskan arti masing2 baris instruksi karena saya sendiri enggak ngerti hehe.... Yang perlu diperhatikan adalah semua return value dari masing-masing fungsi call selalu dimasukkan ke register EAX. Jika EAX berisi 1 maka hasil dari pemaggilan fungsi call berarti benar dan begitu juga sebaliknya.

Patching

Kita bisa memulai proses patching pada address:
1. 0x00002a9a dengan mengeset register EAX menjadi 1
2. 0x00002c64 dengan melakukan force return menjadi 1

Sekarang kita coba patch pertama:

Jalankan gdb dan load aplikasi boolRegistered.app kemudia ketik "r"



Sekarang kita masukkan sembarang nama dan serial



Jangan dulu di klik register, tapi kita balik lagi ke Terminal
Ketik Ctrl+C trus ketik b *0x00002a9a dan ketik c



Setelah itu masuk ke aplikasi dan klik Register, maka otomatis kita balik lagi ke Terminal karena kita sudah nitip breakpoint ke address 0x00002a9a

Ketik set $eax=1, artinya kita akan memaksa register EAX berisi satu apapun hasil kalkulasi dari validateSerial:forName:
Ketik c



Masuk lagi ke aplikasi boolRegistered, dan hasilnya adalah:



Wohoho... berhasil...



Cara kedua:

Hapus semua breakpoint dengan mengetik d, pilih y
breakpoint pada address 0x00002c64 dengan mengetikkan b * 0x00002c64, ketik c
Klik Register pada aplikasi boolRegister maka akan balik lagi ke terminal


Ketik ret 0x1, ketik c



Hurrayyyy....

Tapi itu hanya sebatas trapping di gdb aja, bagaimana membuatnya menjadi permanen? yaitu dengan menulis langsung byte2 yang diperlukan di aplikasinya.

Buka Hex Editor kita misalnya pake 0xED.

Klik kanan pada aplikasi boolRegisterd dan pilih Show Package Contents




Masuk folder Contents > MacOs
Drag boolRegistered ke 0xED. Trus gimana kita biar tau bagian mana yang di patch?

Jadi yang akan kita patch adalah address 0x00002a9a dengan mengeset register EAX menjadi 1.

Hex dari address di atas adalah 84c0, jika jika hanya menggunakan nilai hex tersebut, mungkin banyak juga dari program tersebut menggunakan nilai yang sama. Untuk membedakan nilai hex pada address 00002a9a maka kita menggabungkan dengan nilai hexa di baris bawahnya yaitu 0f8425010000, jadi kalau digabungkan menjadi 84c00f8425010000 dan nilai hexa itu yang akan kita cari di hex editor.



Pada 0xED, Pilih menu Edit > Find > Find
Masukkan 84c00f8425010000 dan klik Find, untuk memastikan tidak ada duplicate, klik sekali lagi Find. Kalau itu hanya satu-satunya maka kita akan mulai proses patch.

jadi fungsi pada address 0x00002a9a yaitu:

testb %al, %al
jel 0x00002bc7

akan kita rubah menjadi



xor %eax, %eax ==> 31 C0
incl %eax ==> 40


karena ada 8 byte yang akan kita ganti jadi sisanya kita isi dengan opcode nop (90)

84c00f8425010000
31c0409090909090


OK, masuk ke 0xED, Pilih menu Edit > Find > Find

isi Find : 84c00f8425010000
isi Replace : 31c0409090909090



klik Replace


Klik Save. Close 0xED dan jalankan lagi aplikasi boolRegistered, kemudian isikan sembarang nama dan serial misalnya orakanggo dan 1234567
Klik Register.

voila!!!!!!!!

by : Jasakom

0 komentar:

Posting Komentar

 

Information Technology & GadGet Copyright © 2009 Gadget Blog is Designed by Ipietoon Sponsored by Online Business Journal