Не важно, как медленно ты продвигаешься, главное, что ты не останавливаешься.


Sunday, 22 February 2015

Hello ASM, Nice to meet you

% Pendahuluan

Assembly language / bahasa rakitan merupakan bahasa tingkat rendah yang berjalan dilevel mesin, berupa instruksi yang sudah disepakati, disusun dari bilangan biner yang dikumpulkan dalam satuan bilangan hex. Kegunaan bahasa ini tentu saja sama seperti bahasa permrograman lainnya, untuk memerintah si komputer berdasarkan kode yang kita buat. Namun lebih spesifik, assembly merupakan bahasa tingkat rendah yang tidak enak dibaca oleh manusia yang di era bahasa tingkat tinggi banyak digunakan salah satunya untuk analisa program (reverse engineer), membuat shellcode, dll.

gambar 1 (diambil dari om vivek securitytube.net)

Sedikit penjelasan tentang gambar 1, terdapat kode 30 c0, 50, 68 6e 2f ... kode ini disebut dengan opcodes, merupakan bahasa yang dibaca oleh mesin. bergeser kesebelahnya xor, push, bla bla bla. merupakan kode asm yang dibuat oleh manusia.

% Register

Register merupakan salah satu hal penting yang sering dijumpai ketika mempelajari bahasa assembly, karena register bisa dibilang sebagai "tempat penyimpanan". Terdapat beberapa macam register dengan masing-masing kegunaannya. Namun yang sering digunakan adalah general purpose register, yaitu eax, ebx, ecx, dan edx untuk processor 32bit, rax, rbx, rcx, rdx untuk 64bit.


gambar 2 : register (tutorialspoint.com)

Untuk lebih lengkap mengenai register, bisa kunjungi linki berikut ini http://register

% System Call

System call (sys call) merupakan kumpulan fungsi / instruksi yang ada pada kernel sebuah sistem operasi. kernel ini bisa dibilang sebagai jembatan untuk interaksi antara manusia dan mesin. Berikut beberapa contoh syscall pada linux 32bit.

%eaxName%ebx%ecx%edx%esx%edi
1sys_exitint----
2sys_forkstruct pt_regs----
3sys_readunsigned intchar *size_t--
4sys_writeunsigned intconst char *size_t--
...






Sebagai contoh, untuk menampilkan tulisan "hello" pada bahasa pyhton:

print "hello"

Berbeda dengan asm, untuk mencetak string hello pada layar, maka kita harus memanggil syscall sys_write dengan detail register eax = 4 (no sys_write), ebx = 1 (stdout, file descriptor), ecx="hello", edx = size "hello"

maka, secara singkatnya dapat ditulis :

mov eax, 4
mov ebx, 1
mov ecx, "hello"
mov edx, 5


syscall tidak akan berjalan tanpa perintah interrupt (0x80 atau 80h), intruksi ini digunakan sebagai sinyal kepada kernel untuk melaksakan syscall yang dipanggil. maka kode lengkapnya:

mov eax, 4
mov ebx, 1
mov ecx, "hello"
mov edx, 5
int 0x80

Referensi syscall number dan fungsinya : http://asm.sourceforge.net/syscall.html

% Say Hello

Setelah membaca penjelasan singkat diatas, simak kode hello.asm berikut ini

section .data
  pesan db 'Hello asm, nice to meet you',0xa
  lenpesan equ $-pesan

section .text
  global _start

_start: 
  mov eax, 4            ;panggil sys_write (4)
  mov ebx, 1            ;file descriptor, stdout
  mov ecx, pesan        ;string yang ditampilkan
  mov edx, lenpesan     ;panjang string yg ditampilkan
  int 0x80              ;interrupt, execute sys_write

  mov eax, 1            ;panggil sys_exit (1)
  int 0x80              ;interrupt, execute sys_exit

Kode ini berjalan pada OS linux 32bit, simpan kedalam file dengan nama hello.asm

Compile file tersebut (pada percobaan ini saya menggunakan nasm), hasil compile menghasilkan file object hello.o






langkah selanjutnya, link object tersebut dengan linker




Proses ini menghasilkan file dengan nama hello yang merupakan file executable, jalankan dengan perintah ./hello, atau jika tidak bisa, berikan permission chmod +x hello, kemudian ./hello






Hello asm, nice to meet you !!

Sekian penjelasan singkat dari saya, semoga bermanfaat.

Referensi :

 - The Art of Assembly Language
 - Tutorials Point - Assembly Language
 - Youtube - windows asm
 - http://en.wikibooks.org/wiki/X86_Assembly/Interfacing_with_Linux
5 λ .: February 2015 % Pendahuluan Assembly language / bahasa rakitan merupakan bahasa tingkat rendah yang berjalan dilevel mesin, berupa instruksi yang sudah ...
<