SPARC Disassembly

ORACLE SPARC Logo

Postingan ini sebagai catatan pribadi dan mudah-mudahan bermanfaat untuk yang kebetulan harus “kecemplung” debugging aplikasi di Solaris dengan mesin SPARC. Sebagai catatan berikut adalah mesin yang saya pergunakan:

Sedangkan file executable binary-nya adalah:

Tools

Sebelum memulai debugging di Solaris, sebenarnya ada beberapa tools yang disediakan oleh Solaris untuk keperluan debugging live appication. Tools tersebut adalah dtrace dan mdb. Untuk saat ini saya lebih prefer menggunakan mdb karena kebutuhan untuk melakukan patching kecil pada executable file sehingga perlu diketahui offset bytecode yang akan di-patch, dan hal ini bisa dicapai dengan mdb.

Selain mdb, perlu disiapkan adalah dokumen manual terutama instruction set sparcv9. Yang sayangnya saya tidak bisa menemukannya di internet mapping bytecode dengan instruction set yang diharapakan di sparcv9. Sebagai tools tambahan, dan banyak membantu adalah Online Disassembler. Situs ini menyediakan disassembler untuk berbagai tipe prosesor yang salah satunya adalah sparcv9.

Tools terakhir adalah hex editor, saat ini saya menggunkan HxD, karena kemudahan dan kebetulan saat ini menggunakan Windows di laptop kantor.

Solaris Modular Debugger

Inti dari tool debugging adalah kita bisa melakukan trace instruksi yang dilakukan oleh sebuah proses atau aplikasi, kemudian melakukan intercept pada bagian proses tertentu untuk dianalisa lebih jauh. Dalam postingan ini saya hanya akan memberikan beberapa command yang dipergunakan untuk proses debugging hingga pada akhirnya dapat menemukan lokasi bytecode yang harus dipatch.

Untuk command-command lain di mdb sepertinya banyak dan dapat ditemui di situs Oracle,

Untuk memulai debugging aplikasi dengan mdb (dan banyak debugger lainnya) dapat dipilih apakah melakukan debug pada file binary atau pada proses aplikasi yang berjalan. Untuk kebutuhan dynamic analysis saya menggunakan yang kedua.

Sebagai contoh saya mencoba menjalankan mdb untuk melakukan debugging proses aplikasi yang berjalan dengan pid=1024.

List Functions

Karena kebetulan binary yang akan dipatch adalah not stripped, maka nama-nama fungsi dapat dilihat dengan mdb. Command yang dipergunakan adalah:

Dari command nm, dapat diketahuai pula offset lokasi bytecode untuk fungsi tersebut pada binary file. Sebagai contoh function sa_msg_pre, dapat kita temukan pada offset 0xa4260.

Disassembly

Untuk melakukan disassembly pada mdb dapat menggunkan command dis, struktur commandnya adalah offset::dis atau function_name::dis. Contoh saya akan melakukan disassembly sebuah function sa_msg_pre:

Breakpoint

Untuk melakukan breakpoint pada offset tertentu atau fungsi tertentu dapat menggunakan command offset:b atau function_name:b. Sebagai contoh saya melakukan breakpoint fungsi sa_msg_pre:

Untuk melihat list breakpoint:

Untuk menghapus breakpoint gunakan command :d {nomor_breakpoint} contohnya untuk menghapus breakpoint terakhir (nomor 13) : :d 13.

Online Disassembler

Tools ini memudahkan kita untuk membuat bytecode yang akan dipergunakan untuk mengganti bytecode asli dari aplikasi / modul. Sayang saat postingan ini dibuat, situs tersebut sedang offline (selalu mendapat “Server Error (500)”). Jadi untuk detilnya saya belum bisa menuliskan di postingan ini.

Untuk kasus saya berikut adalah bagian function yang perlu dipatch yaitu pada line 12:

Instruksi be,pn adalah padanan untuk je jika di mesin x86, melihat referensi di situs ORACLE be artinya adalah “branch on equal”. Dan memang sepadan dengan je (jump if equal).

Untuk kasus saya, saya perlu merubah be ini menjadi ba (branch always). Mari kita lihat instruksi tersebut dalam bytes hex.

Dengan command dump, kita bisa mengetahui ternyata instruksi be,pn dengan parameternya memiliki nilai bytes: 0x0240004b, lebih tepatnya 0x0240, sedangkan 0x004b merupakan nilai parameter instruksinya. Selanjutnya, adalah mencoba mencari nilai yang tepat untuk ba. Karena keterbatasan referensi, maka disinilah peran Online Disassembler (ODA).

ODA dengan mudah melakukan encoding/decoding susunan bytes yang diinput menjadi pseudo code instruksi sparcv9. Dan akhirnya saya temukan bahwa untuk ba nilai instruksi dalam bytes nya adalah: 0x1080.

Dengan demikian patching dapat dilakukan dengan merubah 2 bytes dari binary executable. Berikut adalah hasil akhirnya: