Belajar Bahasa Pemrograman Assembly
Assalamualaikum. Hari ini saya akan membahas sedikit tentang bahasa pemrograman assembly. Bahasa pemrograman yang satu ini terbilang cukup menyeramkan bagi para programmer. Padahal sebenarnya bahasa pemrograman assembly ini tidak seseram yang dibayangkan. Dulu waktu kuliah sempat belajar bahasa assembly atau biasa disebut bahasa rakitan atau bahasa mesin. Alasannya mungkin karena bahasa assembly memang sangat dekat dengan prosesor dibandingkan bahasa tingkat tinggi seperti C dan lain-lain. Perlu diketahui juga bahwa bahasa assembly ini ada bermacam-macam tergantung jenis prosesor yang menjadi targetnya. Jadi bahasa assembly untuk PC yang menggunakan arsitektur prosesor x86 atau x64 akan berbeda dengan bahasa assembly untuk arsitektur ARM, ARM64, MIPS atau yang lainnya. Selain itu, pada setiap assembler yaitu aplikasi untuk mengubah source code menjadi file biner memiliki sintaks tersendiri. Misalnya assembler GNU atau biasa disebut gas dapat menggunakan sintaks AT&T dan Intel tergantung direktif yang diberikan. Ngomong-ngomong soal assembler, ada banyak sekali assembler yang dapat digunakan berdasarkan target prosesor yang diinginkan. Misalnya dulu waktu kuliah, pakainya Turbo Assembler (TASM) buatan Borland. Selain itu ada juga Macro Assembler (MASM) yang dikembangkan oleh Microsoft, High Level Assembler (HLA), Netwide Assembler (NASM), Flatassembler (FASM), GNU Assembler (GAS) dan masih banyak assembler lainnya. Biar tidak terlalu panjang lebar, mending langsung saja download salah satu assembler itu untuk dijadikan bahan eksperimen yaitu Macro Assembler (MASM). Perlu diingat bahwa masm32 ini dirancang untuk menghasilkan executable 32-bit. Pilih salah satu mirror terdekat untuk download file zipnya. Untuk Indonesia, mirror terdekat adalah Australia. Setelah download selesai, lanjutkan dengan mengekstrak dan menginstall masm32. Secara default proses instalasi akan menyimpan file masm32 ke folder c:\masm32\
. Lalu jangan lupa masukkan folder instalasi masm32 ke dalam PATH Environment Variables. Tanpa perlu panjang lebar, untuk contoh kali ini akan digunakan dari tutorial LSASS Injection. Pada artikel tersebut terdapat source code menggunakan bahasa C. Source code tersebut akan saya tulis ulang menggunakan bahasa assembly dengan sintaks masm32. Berikut ini adalah source code agent
yang dikonversi dari bahasa C++ menjadi bahasa assembly dengan sintaks masm32:
Sedangkan source code untuk honeycred
yang sudah dikonversi ke assembly adalah sebagai berikut:
Untuk melakukan assemble dan link menggunakan masm32, gunakan perintah seperti ini:
ml /nologo /c /coff agent.asm
link /nologo /subsystem:windows agent.obj
Jadi proses untuk mengubah dari source code menjadi executable terdiri dari dua proses. Proses pertama mengubah dulu source code assembly menjadi file objek, baru kemudian diubah menjadi executable menggunakan proses linking. Tapi ada juga assembler yang bisa langsung mengubah source code assembly menjadi executable yaitu Flatassembler (FASM). Jika menggunakan bahasa assembly, ukuran executable yang dihasilkan cukup kecil. Misalnya executable agent.exe
di atas itu ukurannya hanya 2560 byte atau 2.5 KB. Jika dijalankan, maka agent.exe
akan berjalan secara terus-menerus dan cara menghentikannya adalah dengan menggunakan Task Manager. Proses assemble & link dapat dibuat menjadi mudah dengan menggunakan script PowerShell seperti ini:
Sebenarnya ada banyak cara untuk melakukan proses assemble & link secara otomatis misalnya menggunakan Makefile
yang dapat diproses oleh aplikasi seperti nmake buatan Microsoft, GNU make, cmake atau yang lainnya. Mudah-mudahan saya sempat membahas topik khusus untuk Makefile
di lain kesempatan.
Lalu bagaimana dengan bahasa assembly pada sistem operasi Linux? sebenarnya tidak jauh berbeda dengan bahasa assembly pada Windows. Namun bahasa assembly untuk linux identik dengan penggunaan instruksi interrupt 0x80
atau syscall
yang digunakan untuk mengeksekusi perintah di kernel. Sebenarnya ada banyak materi yang berkaitan dengan bahasa assembly khususnya di linux, misalnya soal ABI (Application Binary Interface). Perlu diingat juga bahwa GNU assembler yang umum digunakan pada sistem operasi linux, secara default menggunakan sintaks AT&T. Namun bisa juga menggunakan sintaks intel dengan menggunakan direktif .intel_syntax noprefix
. Tapi kali ini saya akan memberikan contoh penggunaan Flatassembler pada sistem operasi linux debian server. Pertama, lakukan instalasi paket flatassembler dengan perintah:
sudo apt install fasm
Setelah itu buat source code assembly seperti ini:
Lalu gunakan Flatassembler untuk meng-assemble source code tersebut menjadi aplikasi/executable dengan format ELF 64bit.
Bisa dilihat bahwa aplikasi yang dibuat menggunakan bahasa assembly ukurannya sangat kecil dan tidak sampai 1 KB. Itu salah satu alasan mengapa kebanyakan proses eksploitasi pada sistem operasi menggunakan bahasa assembly.
Terakhir, perlu diingat bahwa bahasa assembly itu cukup kompleks dan untuk memahaminya harus banyak meluangkan waktu untuk mempelajari tentang arsitektur komputer dan sistem operasi. Jadi harus benar-benar sabar jika mempelajari bahasa assembly, tidak bisa instan. Saya rasa cukup sekian dulu, sampai jumpa di lain kesempatan. Wassalam.