Cara Memakai System Call Linux Di Assembly
CATATAN HACKING - Untuk memanggil system call Linux, programmer assembly harus mengetahui nomor definisi system call yang disebut system call numbers. Informasi ini dapat diperoleh dengan membaca file /usr/include/asm/unistd_32.h. Berikut ini adalah contoh isi file tersebut:
#ifndef _ASM_X86_UNISTD_32_H \#define _ASM_X86_UNISTD_32_H /* * This file contains the system call numbers. */ \#define __NR_restart_syscall 0 \#define __NR_exit 1 \#define __NR_fork 2 \#define __NR_read 3 \#define __NR_write 4 \#define __NR_open 5 \#define __NR_close 6 \#define __NR_waitpid 7 \#define __NR_creat 8 \#define __NR_link 9 \#define __NR_unlink 10 \#define __NR_execve 11 ... \#define __NR_inotify_init1 332 \#define __NR_preadv 333 \#define __NR_pwritev 334 \#define __NR_rt_tgsigqueueinfo 335 \#define __NR_perf_event_open 336
Isi file di atas menunjukkan bahwa pada sistem operasi Linux tersebut, terdapat 337 system call yang dapat dipanggil oleh programmer assembly, mulai dari 0 hingga 336. Setelah menemukan system call number, langkah berikutnya adalah menentukan apa saja yang dibutuhkan untuk memanggil system call tersebut. Salah satu cara yang dapat dilakukan adalah dengan memanggil perintah man. Walaupun ditujukan bagi programmer C, informasi yang ditampilkan oleh man cukup berguna bagi programmer assembly yang ingin memanggil system calltersebut. Sebagai contoh, bila programmer ingin melihat informasi untuk system call ber-nomor 4 (didefinisikan sebagai __NR_write), maka ia dapat memberikan perintah:
$ man 2 write NAME write - write to a file descriptor SYNOPSIS \#include <unistd.h> ssize_t write(int fd, const void *buf, size_t count); ...
Untuk mengerjakan system call di Linux, programmer assembly menggunakan INT dengan nomor interrupt 0x80. Sebelum memberikan INT 0x80, nomor system call (sesuai dengan yang ada di file unistd_32.h) harus diletakkan terlebih dahulu di register EAX, sehingga kernel Linux dapat mengetahui system call apa yang akan dikerjakan. Selain itu, bila ada, nilai parameter harus diberikan pada register tertentu dengan urutan seperti berikut ini:
- Nilai parameter pertama di-isi pada register EBX
- Nilai parameter kedua di-isi pada register ECX
- Nilai parameter ketiga di-isi pada register EDX
- Nilai parameter keempat di-isi pada register ESI
- Nilai parameter kelima di-isi pada register EDI
- Bila jumlah parameter lebih dari lima, EBX mengandung pointer ke lokasi memori yang berisi input parameter secara berurutan.
Pada system call write, informasi yang diberikan oleh man pages menunjukkan bahwa dibutuhkan tiga parameter, yaitu fd, *buf, dan count. Dengan demikian:
- Register EBX mengandung file descriptor (fd)
- Register ECX mengandung pointer ke string yang akan ditampilkan (*buf)
- Register EDX mengandung informasi jumlah karakter di string tersebut (count)
Nilai kembalian dari sebuah system call akan ditampung di register EAX.
Contoh kode program assembly secara lengkapnya akan menjadi:
$ vi test.s .section .data tulisan: .ascii "Ini program pertama saya.\n" .section .text .globl _start _start: movl $4, %eax # System call nomor 4 (write) movl $1, %ebx # Parameter 1: file descriptor = 1 (stdout) movl $tulisan, %ecx # Parameter 2: string yang dicetak movl $26, %edx # Parameter 3: jumlah karakter (26 huruf) int $0x80 # Memanggil kernel Linux movl $1, %eax # System call nomor 1 (exit) movl $0, %ebx # Parameter 1: status code int $0x80 # Memanggil kernel Linux $ as -o test.o test.s $ ld -o test test.o $ ./test Ini program pertama saya.
Post a Comment for "Cara Memakai System Call Linux Di Assembly"