{"id":384,"date":"2018-06-21T09:01:02","date_gmt":"2018-06-21T02:01:02","guid":{"rendered":"http:\/\/sybond.web.id\/blog\/?p=384"},"modified":"2025-07-31T11:38:25","modified_gmt":"2025-07-31T04:38:25","slug":"sparc_disassembly","status":"publish","type":"post","link":"https:\/\/sybond.web.id\/blog\/2018\/06\/21\/sparc_disassembly\/","title":{"rendered":"SPARC Disassembly"},"content":{"rendered":"<p><img loading=\"lazy\" class=\"aligncenter\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/d\/db\/Sparc-logo.svg\/1280px-Sparc-logo.svg.png\" alt=\"ORACLE SPARC Logo\" width=\"400\" height=\"400\"><\/p>\n<p>Postingan ini sebagai catatan pribadi dan mudah-mudahan bermanfaat untuk yang kebetulan harus &#8220;kecemplung&#8221; debugging aplikasi di Solaris dengan mesin SPARC. Sebagai catatan berikut adalah mesin yang saya pergunakan:<\/p>\n<pre class=\"toolbar:2 lang:default highlight:0 decode:true\">SunOS ###stripped### 5.10 Generic_147440-19 sun4v sparc sun4v<\/pre>\n<p>Sedangkan file executable binary-nya adalah:<\/p>\n<pre class=\"toolbar:2 wrap:true lang:default highlight:0 decode:true\">###stripped###: ELF 64-bit MSB executable SPARCV9 Version 1, UltraSPARC3 Extensions Required [CBCOND VIS3 VIS], dynamically linked, not stripped\n<\/pre>\n<h3>Tools<\/h3>\n<p>Sebelum memulai <em>debugging<\/em> di Solaris, sebenarnya ada beberapa <em>tools<\/em> yang disediakan oleh Solaris untuk keperluan debugging live appication. Tools tersebut adalah <a href=\"http:\/\/www.oracle.com\/technetwork\/server-storage\/solaris\/dtrace-tutorial-142317.html\">dtrace<\/a> dan <a href=\"https:\/\/docs.oracle.com\/cd\/E18752_01\/html\/816-5041\/toc.html\">mdb<\/a>. Untuk saat ini saya lebih <em>prefer<\/em> menggunakan <strong>mdb<\/strong> karena kebutuhan untuk melakukan patching kecil pada executable file sehingga perlu diketahui <em>offset bytecode<\/em> yang akan di-<em>patch<\/em>, dan hal ini bisa dicapai dengan <strong>mdb<\/strong>.<br \/>\n<!--more--><br \/>\nSelain <strong>mdb<\/strong>, perlu disiapkan adalah dokumen manual terutama<em> instruction set<\/em> sparcv9. Yang sayangnya saya tidak bisa menemukannya di internet <em>mapping bytecode<\/em> dengan <em>instruction set<\/em> yang diharapakan di sparcv9. Sebagai tools tambahan, dan banyak membantu adalah <a href=\"https:\/\/onlinedisassembler.com\/static\/home\/index.html\">Online Disassembler<\/a>. Situs ini menyediakan disassembler untuk berbagai tipe prosesor yang salah satunya adalah sparcv9.<\/p>\n<p>Tools terakhir adalah hex editor, saat ini saya menggunkan <a href=\"https:\/\/mh-nexus.de\/en\/hxd\/\">HxD<\/a>, karena kemudahan dan kebetulan saat ini menggunakan Windows di laptop kantor.<\/p>\n<h2 class=\"DocTitle\">Solaris Modular Debugger<\/h2>\n<p>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.&nbsp;Dalam postingan ini saya hanya akan memberikan beberapa command yang dipergunakan untuk proses debugging hingga pada akhirnya dapat menemukan lokasi bytecode yang harus dipatch.<\/p>\n<p>Untuk <em>command-command<\/em> lain di <strong>mdb<\/strong> sepertinya banyak dan dapat ditemui di situs Oracle,<\/p>\n<p>Untuk memulai debugging aplikasi dengan <strong>mdb<\/strong> (dan banyak debugger lainnya) dapat dipilih apakah melakukan debug pada file binary atau pada proses aplikasi yang berjalan. Untuk kebutuhan <em>dynamic analysis<\/em> saya menggunakan yang kedua.<\/p>\n<pre class=\"toolbar:2 plain:false lang:default highlight:0 decode:true\">&gt;mdb -p 1024<\/pre>\n<p>Sebagai contoh saya mencoba menjalankan mdb untuk melakukan debugging proses aplikasi yang berjalan dengan <code>pid=1024<\/code>.<\/p>\n<h5>List Functions<\/h5>\n<p>Karena kebetulan binary yang akan dipatch adalah <em>not stripped<\/em>, maka nama-nama fungsi dapat dilihat dengan <strong>mdb<\/strong>. Command yang dipergunakan adalah:<\/p>\n<pre class=\"toolbar:2 lang:default highlight:0 decode:true\">&gt; ::nm -t func\nValue              Size               Type  Bind  Other Shndx    Name\n0x000000010009fe80|0x000000000000002c|FUNC |LOCL |0x0  |10      |getreg\n0x000000010009fec8|0x000000000000002c|FUNC |LOCL |0x0  |10      |putreg\n0x000000010009fef4|0x0000000000000020|FUNC |LOCL |0x0  |10      |get_fregpair_index\n0x000000010009ff30|0x00000000000000bc|FUNC |LOCL |0x0  |10      |verify_asi\n0x00000001000a2a54|0x00000000000003b8|FUNC |LOCL |0x0  |10      |reinit_task\n0x00000001000a2e0c|0x000000000000005c|FUNC |LOCL |0x0  |10      |proc_clear_fa_structures\n0x00000001000a2e68|0x0000000000000120|FUNC |LOCL |0x0  |10      |fa_send_rsp\n0x00000001000a2f88|0x00000000000001b0|FUNC |LOCL |0x0  |10      |standard_authorization\n0x00000001000a3138|0x0000000000000090|FUNC |LOCL |0x0  |10      |make_default_flex_action\n0x00000001000a36d8|0x00000000000000d0|FUNC |LOCL |0x0  |10      |sa_msg_dbupd_fp\n0x00000001000a37a8|0x00000000000000d0|FUNC |LOCL |0x0  |10      |sa_msg_dbupd_fp_rev\n0x00000001000a3878|0x00000000000000d0|FUNC |LOCL |0x0  |10      |sa_msg_dbupd_rev\n0x00000001000a3948|0x00000000000000d0|FUNC |LOCL |0x0  |10      |sa_msg_dbupd\n0x00000001000a3ff0|0x00000000000000d0|FUNC |LOCL |0x0  |10      |sa_msg_pre_fp\n0x00000001000a40c0|0x00000000000000d0|FUNC |LOCL |0x0  |10      |sa_msg_pre_fp_rev\n0x00000001000a4190|0x00000000000000d0|FUNC |LOCL |0x0  |10      |sa_msg_pre_rev\n0x00000001000a4260|0x00000000000000d0|FUNC |LOCL |0x0  |10      |sa_msg_pre\n0x00000001000a4a74|0x00000000000000d0|FUNC |LOCL |0x0  |10      |sa_msg_si_fp\n0x00000001000a4b44|0x00000000000000d0|FUNC |LOCL |0x0  |10      |sa_msg_si_fp_rev\n0x00000001000a4c14|0x00000000000000d0|FUNC |LOCL |0x0  |10      |sa_msg_si_rev\n0x00000001000a4ce4|0x00000000000000d0|FUNC |LOCL |0x0  |10      |sa_msg_si\n0x00000001000ac730|0x0000000000000280|FUNC |LOCL |0x0  |10      |parse_cref_pin_resp\n&gt;\n<\/pre>\n<p>Dari command <code>nm<\/code>, dapat diketahuai pula <em>offset<\/em> lokasi <em>bytecode<\/em> untuk fungsi tersebut pada binary file. Sebagai contoh <em>function<\/em>&nbsp;<code>sa_msg_pre<\/code>, dapat kita temukan pada offset <code>0xa4260<\/code>.<\/p>\n<h5>Disassembly<\/h5>\n<p>Untuk melakukan <em>disassembly<\/em> pada <strong>mdb<\/strong> dapat menggunkan command <code>dis<\/code>, struktur commandnya adalah <code>offset::dis<\/code> atau <code>function_name::dis<\/code>. Contoh saya akan melakukan <em>disassembly<\/em> sebuah function&nbsp;sa_msg_pre:<\/p>\n<pre class=\"toolbar:2 lang:default highlight:0 decode:true \">&gt; sa_msg_pre::dis\nsa_msg_pre:                     save      %sp, -0xb0, %sp\nsa_msg_pre+4:                   sethi     %hi(0x100000), %i5\nsa_msg_pre+8:                   sethi     %hi(0x100000), %i4\nsa_msg_pre+0xc:                 or        %i5, 0x241, %i3\nsa_msg_pre+0x10:                or        %i4, 0x3f4, %l7\nsa_msg_pre+0x14:                sllx      %i3, 0xc, %l6\nsa_msg_pre+0x18:                add       %l6, 0xcf0, %l4\nsa_msg_pre+0x1c:                sllx      %l7, 0xc, %l5\nsa_msg_pre+0x20:                ldx       [%l5 + 0xaf8], %o3\nsa_msg_pre+0x24:                mov       0x2, %o0\nsa_msg_pre+0x28:                add       %l4, 0x178, %o2\nsa_msg_pre+0x2c:                call      +0x163cf4     \nsa_msg_pre+0x30:                mov       %l4, %o1\nsa_msg_pre+0x34:                cmp       %i2, 0x4\nsa_msg_pre+0x38:                bge,pn    %icc, +0x28   \nsa_msg_pre+0x3c:                nop\nsa_msg_pre+0x40:                cwbe      %i2, 0x1, +0x44\nsa_msg_pre+0x44:                nop\nsa_msg_pre+0x48:                cwbe      %i2, 0x2, +0x44 \nsa_msg_pre+0x4c:                nop\nsa_msg_pre+0x50:                cwbe      %i2, 0x3, +0x5c \nsa_msg_pre+0x54:                nop\nsa_msg_pre+0x58:                ba        +0x5c         \nsa_msg_pre+0x5c:                sethi     %hi(0x100000), %i1\nsa_msg_pre+0x60:                be,pn     %icc, +0x34   \nsa_msg_pre+0x64:                cmp       %i2, 0x67\nsa_msg_pre+0x68:                be,pt     %icc, +0x34   \nsa_msg_pre+0x6c:                nop\nsa_msg_pre+0x70:                cmp       %i2, 0x68\nsa_msg_pre+0x74:                be,pt     %icc, +0x30   \nsa_msg_pre+0x78:                nop\nsa_msg_pre+0x7c:                ba        +0x38         \nsa_msg_pre+0x80:                sethi     %hi(0x100000), %i1\nsa_msg_pre+0x84:                call      +0xb248       \nsa_msg_pre+0x88:                restore   %g0, 0x0, %g0\nsa_msg_pre+0x8c:                call      +0xed5c       \n&gt;\n<\/pre>\n<h5>Breakpoint<\/h5>\n<p>Untuk melakukan breakpoint pada offset tertentu atau fungsi tertentu dapat menggunakan command <code>offset:b<\/code> atau <code>function_name:b<\/code>. Sebagai contoh saya melakukan breakpoint fungsi&nbsp;sa_msg_pre:<\/p>\n<pre class=\"toolbar:2 lang:default highlight:0 decode:true \">&gt; sa_msg_pre:b<\/pre>\n<p>Untuk melihat list breakpoint:<\/p>\n<pre class=\"toolbar:2 lang:default highlight:0 decode:true\">&gt; $b\n   ID S TA HT LM Description                              Action\n----- - -- -- -- ---------------------------------------- ----------------------\n[ 1 ] + T   0  0 stop on SIGINT                           -\n[ 2 ] + T   0  0 stop on SIGQUIT                          -\n[ 3 ] + T   0  0 stop on SIGILL                           -\n[ 4 ] + T   0  0 stop on SIGTRAP                          -\n[ 5 ] + T   0  0 stop on SIGABRT                          -\n[ 6 ] + T   0  0 stop on SIGEMT                           -\n[ 7 ] + T   0  0 stop on SIGFPE                           -\n[ 8 ] + T   0  0 stop on SIGBUS                           -\n[ 9 ] + T   0  0 stop on SIGSEGV                          -\n[ 10] + T   0  0 stop on SIGSYS                           -\n[ 11] + T   0  0 stop on SIGXCPU                          -\n[ 12] + T   0  0 stop on SIGXFSZ                          -\n[ 13] +     0  0 stop at sa_msg_pre                       -\n<\/pre>\n<p>Untuk menghapus breakpoint gunakan command <code>:d {nomor_breakpoint}<\/code> contohnya untuk menghapus breakpoint terakhir (nomor 13) : <code>:d 13<\/code>.<\/p>\n<h3>Online Disassembler<\/h3>\n<p>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&nbsp;<a href=\"https:\/\/onlinedisassembler.com\/odaweb\/\">offline<\/a> (selalu mendapat &#8220;Server Error (500)&#8221;). Jadi untuk detilnya saya belum bisa menuliskan di postingan ini.<\/p>\n<p>Untuk kasus saya berikut adalah bagian function yang perlu dipatch yaitu pada line 12:<\/p>\n<pre class=\"toolbar:2 plain:false lang:default mark:12 highlight:0 decode:true\">&gt; 1000d9828::dis -a\n1000d9800                       add       %g4, 0xb02, %o2\n1000d9804                       ldub      [%fp - 0x1d6], %o1\n1000d9808                       btst      0x20, %o1\n1000d980c                       be,pn     %icc, +0x144  \n1000d9810                       add       %i0, 0x290, %i4\n1000d9814                       ldd       [%fp - 0x2c1], %d2\n1000d9818                       mov       0x2, %o2\n1000d981c                       call      +0x12d218     \n1000d9820                       mov       %i4, %o0\n1000d9824                       tst       %o0\n1000d9828                       be,pn     %icc, +0x12c  \n1000d982c                       mov       %i2, %o1\n1000d9830                       call      +0x124b10     \n1000d9834                       nop\n1000d9838                       add       %fp, -0xb39, %o1\n1000d983c                       mov       0x2, %o2\n1000d9840                       mov       %i4, %o0\n1000d9844                       call      +0x12cb64     \n1000d9848                       std       %d0, [%fp - 0xb39]\n1000d984c                       mov       0x4, %o0\n1000d9850                       ldx       [%fp - 0xb39], %o3\n<\/pre>\n<p>Instruksi <code>be,pn<\/code> adalah padanan untuk <code>je<\/code> jika di mesin x86, melihat referensi di situs ORACLE <code>be<\/code> artinya adalah &#8220;branch on equal&#8221;. Dan memang sepadan dengan <code>je<\/code> (jump if equal).<\/p>\n<p>Untuk kasus saya, saya perlu merubah <code>be<\/code> ini menjadi <code>ba<\/code> (branch always). Mari kita lihat instruksi tersebut dalam <em>bytes hex<\/em>.<\/p>\n<pre class=\"toolbar:2 plain:false lang:default highlight:0 decode:true\">&gt; 1000d9828::dump -f -e\n1000d9828:  0240004b 9210001a 400492c4 01000000\n<\/pre>\n<p>Dengan command <code>dump<\/code>, kita bisa mengetahui ternyata instruksi <code>be,pn<\/code> dengan parameternya memiliki nilai bytes: <code>0x0240004b<\/code>, lebih tepatnya <code>0x0240<\/code>, sedangkan <code>0x004b<\/code> merupakan nilai parameter instruksinya. Selanjutnya, adalah mencoba mencari nilai yang tepat untuk <code>ba<\/code>.&nbsp;Karena keterbatasan referensi, maka disinilah peran Online Disassembler (ODA).<\/p>\n<p>ODA dengan mudah melakukan encoding\/decoding susunan bytes yang diinput menjadi pseudo code instruksi sparcv9. Dan akhirnya saya temukan bahwa untuk <code>ba<\/code> nilai instruksi dalam bytes nya adalah: <code>0x1080<\/code>.<\/p>\n<p>Dengan demikian patching dapat dilakukan dengan merubah 2 bytes dari <em>binary executable<\/em>. Berikut adalah hasil akhirnya:<\/p>\n<pre class=\"toolbar:2 plain:false lang:default mark:12 highlight:0 decode:true\">&gt; 1000d9828::dis -a\n1000d9800                       add       %g4, 0xb02, %o2\n1000d9804                       ldub      [%fp - 0x1d6], %o1\n1000d9808                       btst      0x20, %o1\n1000d980c                       be,pn     %icc, +0x144  \n1000d9810                       add       %i0, 0x290, %i4\n1000d9814                       ldd       [%fp - 0x2c1], %d2\n1000d9818                       mov       0x2, %o2\n1000d981c                       call      +0x12d218     \n1000d9820                       mov       %i4, %o0\n1000d9824                       tst       %o0\n1000d9828                       ba        +0x12c        \n1000d982c                       mov       %i2, %o1\n1000d9830                       call      +0x124b10     \n1000d9834                       nop\n1000d9838                       add       %fp, -0xb39, %o1\n1000d983c                       mov       0x2, %o2\n1000d9840                       mov       %i4, %o0\n1000d9844                       call      +0x12cb64     \n1000d9848                       std       %d0, [%fp - 0xb39]\n1000d984c                       mov       0x4, %o0\n1000d9850                       ldx       [%fp - 0xb39], %o3\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Postingan ini sebagai catatan pribadi dan mudah-mudahan bermanfaat untuk yang kebetulan harus &#8220;kecemplung&#8221; debugging aplikasi di Solaris dengan mesin SPARC. Sebagai catatan berikut adalah mesin yang saya pergunakan: SunOS ###stripped### 5.10 Generic_147440-19 sun4v sparc sun4v Sedangkan file executable binary-nya adalah: ###stripped###: ELF 64-bit MSB executable SPARCV9 Version 1, UltraSPARC3 Extensions Required [CBCOND VIS3 VIS], dynamically [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4,11],"tags":[],"_links":{"self":[{"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/posts\/384"}],"collection":[{"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/comments?post=384"}],"version-history":[{"count":41,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/posts\/384\/revisions"}],"predecessor-version":[{"id":613,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/posts\/384\/revisions\/613"}],"wp:attachment":[{"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/media?parent=384"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/categories?post=384"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/tags?post=384"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}