Recent Comment

PaidVerts
Photobucket
PaidVerts

Friday 19 February 2010

Belajar Assembly di Linux

Bagi seseorang yang bergelut di dunia security bahasa Assembly adalah bahasa yang wajib dikuasai. Karena bahasa ini adalah bahasa tingkat rendah, dekat dengan bahasa mesin (biner), maka mempelajari bahasa ini akan sangat menguntungkan. Dengan mempelajari bahasa assembly, sedikit banyak secara otomatis kita akan memahami cara komputer bekerja lebih dalam lagi.

Artikel ini juga sebagai pembuka sebelum saya membahas mengenai shellcode, buffer overflow dan teknik exploitasi lain yang membutuhkan pemahaman mengenai assembly dan sistem operasi. Bila anda ingin menjadi hacker yang baik, anda wajib menguasai bahasa ini.

Bahasa Mesin, Assembly dan C

Pada dasarnya komputer adalah makhluk digital yang hanya mengerti digit 1 dan digit 0 (binary). Komputer hanya mau menerima data dalam bentuk binary dan juga hanya bisa mengerti perintah dalam bentuk binary. Perintah dalam bentuk binary ini disebut dengan bahasa mesin.

Secara umum program bisa dilihat sebagai urutan langkah/perintah/instruksi untuk menyelesaikan sesuatu. Programmer bisa langsung membuat program dengan menuliskan perintah dalam bentuk 1 dan 0 (bahasa mesin), atau menggunakan bahasa tingkat tinggi yang lebih manusiawi seperti C, Visual Basic atau Java.

Hanya dua simbol yang dimengerti komputer, yaitu 1 dan 0

Perhatikan contoh sederhana ini: programmer ingin menyimpan nilai register EAX ke dalam stack. Dalam bahasa mesin programmer harus menuliskan 01010000. Sedangkan dalam bahasa assembly programmer cukup menulis PUSH EAX. Manakah yang lebih manusiawi? Tentu menggunakan assembly lebih manusiawi. Sangat sulit bagi manusia bila harus selalu menggunakan 1 dan 0 setiap memberi perintah.

codeinbinary

Semakin tinggi bahasanya, maka semakin manusiawi cara memberi perintahnya. Contohnya bila programmer ingin menampilkan suatu teks di layar monitor, dalam bahasa C programmer cukup menuliskan printf(“Hello World”), mudah dan singkat. Namun dalam bahasa yang lebih rendah seperti assembly, dibutuhkan sekitar 5 langkah untuk menyelesaikan tugas yang sama.

Semua program dalam bahasa apapun dibuatnya, pada akhirnya ketika akan dieksekusi akan diterjemahkan dalam bahasa mesin, karena itulah satu-satunya bahasa yang dimengerti prosesor.

Bahasa Assembly dan Processor

Karena bahasa assembly adalah mnemonic (singkatan) untuk instruksi dalam bahasa mesin. Maka perintah-perintah dalam bahasa assembly terkait erat dengan prosesornya. Setiap prosesor memiliki instruction set masing-masing,sehingga bahasa assembly untuk prosesor Intel akan berbeda dengan assembly untuk prosesor lainnya. Namun karena intel menguasai pangsa pasar prosesor maka hampir semua produsen prosesor membuat instruksi set yang kompatibel dengan intel.

Bahasa assembly adalah mnemonic dari instruksi bahasa mesin (berbentuk binary) yang disebut opcode

Dokumentasi lengkap mengenai membuat program dalam prosesor intel, termasuk daftar instruction setnya bisa diperoleh di website resmi intel, di intel developer manuals. Dalam artikel ini saya hanya menjelaskan beberapa instruksi dasar yang paling banyak dipakai, selebihnya bisa dilihat di manual yang ada di website intel.

Assembly AT&T dan NASM

Ada dua sintaks bahasa assembly, yaitu dalam format AT&T dan NASM. Sintaks AT&T banyak dipakai dalam lingkungan GNU seperti GNU Assembler, dan menjadi format default GNU Debugger (GDB). Sedangkan format NASM dipakai oleh netwide assembler dan banyak dipakai di lingkungan windows.

Perlu dicatat bahwa perbedaan NASM dan AT&T ini hanya masalah sintaks saja, keduanya menghasilkan bahasa mesin yang sama persis

Beberapa perbedaan antara format AT&T dan NASM adalah:

* Baris komentar diawali dengan “;” semicolon untuk NASM. AT&T mengawali komentar dengan # (hash)
* Dalam format AT&T, setiap register diawali dengan %. NASM tidak menggunakan %.
* Dalam format AT&T, setiap nilai literal (konstanta) diawali dengan $. NASM tidak menggunakan $.
* Pada perintah yang menggunakan operand sumber dan tujuan, format AT&T menuliskan tujuan sebagai operand kedua (contoh: CMD ,). Sedangkan NASM menuliskan tujuan sebagai operand pertama (contoh: CMD ,).

Register

Register adalah variabel internal yang sudah built-in di dalam prosesor yang bisa dipakai oleh programmer untuk bermacam-macam keperluan. Karena register posisinya di prosesor, bukan di memory, maka menggunakan register sebagai variabel jauh lebih cepat dibanding menggunakan variabel yang dismipan di suatu alamat di memori.

Berikut adalah jenis-jenis register yang ada pada prosesor Intel.
Kategori Nama Penjelasan
General Purpose EAX, EBX, ECX, EDX Lebar data 32 bit, boleh diapakai untuk keperluan apa saja. E adalah Extended (karena awalnya register general purpose hanya 16 bit).
AX,BX,CX,DX 16 bit bawah dari register 32 bit di atas. AX adalah bagian 16 bit bawah dari EAX.
AH,AL,BH,BL,CH,CL,DH,DL Bagian 8 bit dari register 16 bit di atas . AH adalah 8 bit atas dari AX. AL adalah 8 bit bawah dari AX.
Segment Register CS, SS, DS, ES, FS, GS Digunakan untuk menunjuk 16 bit awal alamat memori. CS = Code, SS = Stack, DS = Data, ES,FS,GS = Extra segment register
Offset Register Digunakan untuk menunjuk 16 bit akhir alamat memori. Alamat memori ditunjukkan dengan gabungan segment dan offset.
EBP Dipakai sebagai offset frame dalam stack. Biasanya menunjuk pada bottom of stack frame di suatu fungsi. ESP menunjukkan puncak stack, EBP menunjuk dasar stack.
ESI Biasanya dipakai untuk offset string sumber dalam operasi yang melibatkan blok memori.
EDI Biasanya dipakai untuk offset string tujuan dalam operasi yang melibatkan blok memori.
ESP Stack pointer, menunjukkan puncak dari stack.
Special EFLAGS Tidak bisa dipakai programmer, hanya dipakai prosesor untuk hasil operasi logical dan state.
EIP Tidak bisa dipakai programmer, hanya dipakai prosesor untuk menunjukkan alamat memori yang berisi instruksi berikutnya yang akan dieksekusi.

Perhatikan gambar di bawah ini untuk melihat register-register yang ada dalam prosesor keluarga IA32 (Intel Architecture 32 bit).
http://www.faculty.iu-bremen.de/birk/lectures/PC101-2003/01x86/80x86%20Architecture/registers.htm

courtesy of iu-bremen.de

Dalam gambar di ats terlihat bahwa register-register Extended (berawalan E) adalah register 32 bit. Agar kompatibel program-program sebelumnya ketika register hanya ada 16 bit, maka register yang lain adalah bagian bit bawah dari versi extendednya. Contohnya adalah register ESI dan SI. Register SI adalah 16 bit paling bawah dari ESI. Pada register EAX, AX adalah 16 bit paling bawah dari EAX. Register AX pun dipecah lagi menjadi 8 bit atas AH dan 8 bit bawah AL. Programmer bebas menggunakan yang mana saja sesuai kebutuhannya.

The Classic “Hello World”

Cukup sudah berteori, kini kita mulai berbasah-basah. Mari kita buat program pertama dalam assembly yang menampilkan teks “Hello World”. Dalam artikel ini saya menggunakan format syntax Intel, bukan AT&T. Silakan ketik source berikut dan simpan dalam nama hello.asm

; section text khusus buat code
section .text

global _start

_start:
; systemcall => write(1,msg,len)
mov edx,len ; panjang string dimasukkan dalam register EDX
mov ecx,msg ; alamat memori yang menyimpan string dimasukkan dalam register ECX
mov ebx,1 ; file descriptor (1=stdout=defaultnya console) disimpan dalam register EBX
mov eax,4 ; Nomor syscall 4 adalah fungsi sys_write()
int 0x80 ; panggil system call dengan interrupt 80 hexa.

; systemcall => exit(0)
xor ebx,ebx ; membuat EBX menjadi 0 sebagai return code ketika exit
mov eax,1 ; nomor syscall 1 adalah fungsi exit()
int 0x80 ; panggil system call dengan interrupt 80 hexa.

section .data ; section data khusus buat data/variable
msg db "Hello, World!",0xa ; String diikuti dengan 0xA yaitu new line \n.
len equ $ - msg ; Panjang string didapat dengan mengurangi address di baris ini dengan alamat string.

Setelah itu kita akan mengcompile file ASM itu menjadi object code berformat ELF dengan NASM (netwide assembler). Setelah itu akan terbentuk file hello.o yang harus dilink dengan linker LD agar menjadi format executable.

$ nasm -f elf hello.asm
$ ld -s -o hello hello.o
$ ./hello
Hello, World!

Selamat, anda telah berhasil membuat program Hello World dalam bahasa Assembly. Program di atas sangat sederhana, kita memanggil system call write() untuk menampilkan string (msg), kemudian kita memanggil system call exit() untuk keluar dari program dan program selesai. String msg kita taruh dalam section .data karena section tersebut khusus untuk menyimpan data/variabel. Sedangkan instruksi assembly disimpan dalam section .text karena section text khusus untuk menyimpan code.

Hello World Opcode

Untuk melihat keterkaitan antara assembly dan bahasa mesin kita bisa melihat opcode dari program assembly yagn kita buat dengan program objdump pada gambar berikut ini.

hubungan assembly dan opcode

Opcode di sebelah kiri adalah versi bahasa mesin dari bahasa assembly di sebelah kanannya. Hal ini menunjukkan eratnya kaitan antara assembly dan bahasa mesin. Contohnya adalah instruksi assembly INT 0×80 diterjemahkan ke bahasa mesin: 0xCD 0×80 (dalam hexa) atau 11001101 (binary dari 0xCD) 10000000 (binary dari 0×80).

Perhatikan bahwa pada source code assembly, “MOV EDX, len” setelah dicompile diterjemahkan menjadi “MOV EDX, 0xE”. Hal ini karena len adalah konstanta berisi panjang string “Hello, World!” yaitu sepanjang 14 karakter. Instruksi assembly pada source code “MOV ECX, msg” setelah dicompile diterjemahkan menjadi “MOV ECX, 0×80490a4″. Mengapa msg diterjemahkan menjadi 0×80490a4? Hal ini karena msg adalah address dari string “Hello, World!” sehingga setelah dicompile diterjemahkan menjadi alamat 0×80490a4. Terlihat juga pada gambar di atas pada lokasi 0×80490a4 terdapat string “Hello, World!”.

System Call

Dalam program hello world di atas kita memanfaatkan system call untuk menampilkan teks di layar monitor. System call adalah gerbang menuju kernel mode bagi program yang membutuhkan servis yang hanya bisa dikerjakan oleh kernel.

system call adalah gateway menuju kernel mode

System call di Linux dipanggil dengan menggunakan interrupt 80 hexa. Nomor system call dimasukkan dalam register EAX. Daftar lengkap nomor systemcall di Linux bisa dibaca di file header: /usr/include/asm/unistd.h. Berikut adalah cuplikan isi dari file unistd.h

#ifndef _ASM_I386_UNISTD_H_
#define _ASM_I386_UNISTD_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

Dalam contoh hello world kita memanfaatkan system call nomor 4 (write) dan nomor 1 (exit). Untuk mengetahui cara pemakaian dan argumen untuk system call tersebut, kita bisa gunakan man di Linux.

$ man 2 write
SYNOPSIS
ssize_t write(int fd, const void *buf, size_t count);
$ man 2 exit
void _exit(int status);

Dari manual system call write meminta 3 argument: yaitu file descriptor bertipe integer, alamat memori tempat string berada, dan terakhir adalah panjang string bertipe integer. Ketika argumen tersebut disimpan dalam register mulai dari EBX, ECX dan EDX. Argumen pertama di EBX, argumen kedua di ECX dan ketiga di EDX. Register EAX dipakai untuk menyimpan nomor system call. Dari manual system call exit meminta 1 argument: yaitu kode status bertipe integer yang disimpan dalam register EBX.

Dalam contoh hello world di atas kita menggunakan 3 intruksi assembly yaitu MOV, XOR dan INT. Mari kita bahas intstruksi tersebut.

Instruksi MOV

Kita menggunakan MOV untuk menyalin data dari sumber ke tujuan. Sumber dan tujuan bisa alamat memori, atau register. Perhatikan contoh berikut:
NASM/Intel AT&T Deskripsi
MOV EAX, 0×51 MOVL $0×51, %EAX Mengisi register EAX dengan nilai 51 hexa
MOV ESP, EBP MOVL EBP, ESP Menyalin isi register EBP ke register ESP

Perbedaan antara sintaks NASM dan AT&T adalah arah pengkopian. Dalam sintaks NASM, tujuan ada pada operand pertama, sedangkan dalam sintaks AT&T tujuan adalah operand ke-2.

Instruksi XOR

Instruksi XOR digunakan untuk melakukan operasi logika Xclusive OR. XOR akan menghasilkan 0 bila kedua operandnya sama, dan menghasilkan 1 bila tidak sama. XOR ini biasanya dipakai untuk membuat register menjadi 0 dengan melakukan XOR untuk operand yang sama seperti pada contoh hello world tersebut.
NASM/Intel AT&T Deskripsi
XOR EBX,EAX XOR %EAX,%EBX XOR isi EBX dengan EAX, hasilnya disimpan di EBX

Instruksi INT

Instruksi INT digunakan untuk mengirim sinyal interrupt ke prosesor. Dalam contoh di atas kita memakai interrupt nomor 80 hexa untuk meminta layanan dari kernel.
NASM/Intel AT&T Deskripsi
INT 0×80 INT $0×80 Memanggil interrupt nomor 80 hexa

Contoh Lain: Hello World X Times

Kali ini kita akan memodifikasi program hello world di atas agar bisa menampilkan pesan yang sama berkali-kali tergantung dari argumen yang dimasukkan user.

section .text

global _start

_start:
pop eax ; pop number of argc (diabaikan)
pop eax ; pop argv[0] (diabaikan karena berisi nama program)
pop eax ; pop argv[1] (ini dipakai untuk stringtoint)
call stringtoint ; ECX berisi argumen bertipe integer sebagai counter

_print:
push ecx ; selamatkan counter di stack karena ECX dipakai juga di _print_hello
call _print_hello ; print hello world
pop ecx ; ambil lagi counter dari stack karena akan dipakai untuk looping
loop _print ; kurangi ECX dengan 1, bila belum 0 kembali ke _print

; ini system call exit(0)
mov ebx,0
mov eax,1
int 0x80

_print_hello: ; systemcall write(1,msg,len)
mov edx,len
mov ecx,msg
mov ebx,1
mov eax,4
int 0x80
ret

stringtoint: ; mengubah string di lokasi yang ditunjuk EAX menjadi integer di ECX
; EAX address of string
xor ecx,ecx ; clear ECX
xor ebx,ebx ; clear EBX
mov bl,[eax] ; BL berisi kode ASCII string di lokasi yang ditunjuk EAX
sub bl, 0x30 ; Kode ascii angka adalah 30h-39h, dikurangkan dengan 30h
add ecx,ebx ; ECX ditambah EBX, ECX berisi nilai integer
ret

section .data
msg db "Hello, World!",0xa
len equ $ - msg

Simpan source code di atas dengan nama helloxtimes.asm, lalu compile dan link seperti di bawah ini.

$ nasm -f elf helloxtimes.asm
$ ld -s -o helloxtimes helloxtimes.o
$ ./helloxtimes 1
Hello, World!
$ ./helloxtimes 2
Hello, World!
Hello, World!
$ ./helloxtimes 3
Hello, World!
Hello, World!
Hello, World!
$ ./helloxtimes 4
Hello, World!
Hello, World!
Hello, World!
Hello, World!

Kita belajar beberapa instruksi baru dalam contoh ke-2 ini, yaitu looping, penggunaan argumen dan prosedur, sedangkan system call yang dipakai tetap sama, yaitu write() dan exit().

Program kali ini menerima argumen berupa integer 1-9 yang dipakai sebagai counter berapa kali pesan akan muncul di monitor. Argumen ini diambil dari stack dengan instruksi POP. Pada puncak stack ada argc, yaitu jumlah argumen ketika program dijalankan. Di bawahnya berisi address dari argv[0] yaitu nama program. Kemudian di bawahnya lagi baru berisi address dari argv[1] yaitu parameter/argumen pertama. Perhatikan pada baris ke-6 s/d baris ke-8 ada instruksi POP EAX sebanyak tiga kali. Ini dilakukan karena yang diperlukan ada pada posisi ke-3 sehingga kita harus membuang 2 elemen di puncak sebelum bisa mengambil address argv[1]. Address argumen ke-1 diambil dari POP lalu disimpan dalam register EAX. Karena bentuknya masih string, maka harus diubah dulu menjadi integer dengan memanggil prosedur stringtoint pada baris ke-9.
Instruksi POP untuk Mengambil Argumen

Instruksi POP untuk Mengambil Argumen

Ketika program dijalankan dengan satu argumen seperti “./helloxtimes 7″. Maka jumlah argumen (argc) akan berisi 2, yaitu nama program itu sendiri, dan satu argumennya. ARGC akan disimpan pada puncak stack, dan elemen di bawahnya berisi alamat memori dari nama program, dan dibawahnya lagi berisi alamat memori dari argumen pertama. Perhatikan gambar di atas yang menunjukkan proses pengambilan alamat memori berisi string argumen pertama dari stack. Dalam contoh tersebut argumen adalah string “7″, yaitu karakter berkode ASCII 37 hexa diikuti dengan ASCII 0 (karakter NULL). Alamat memori berisi string argumen pertama itu diambil dari stack dan disimpan di register EAX.

Pada prosedur stringtoint, register EAX berisi address string yang akan diubah menjadi integer. Kita hanya mengambil karakter pertama saja, pada baris ke-35 dengan instruksi MOV, isi memori pada address yang ditunjuk oleh EAX dicopy ke register BL.

“MOV EBX, [EAX]” berbeda dengan “MOV EBX,EAX”. MOV EBX,[EAX] berarti menyalin isi memori pada alamat yang disimpan di EAX ke dalam register EBX. Sedangkan MOV EBX,EAX berarti menyalin isi register EAX ke register EBX

Saya menggunakan register BL karena kode ASCII lebarnya hanya 8 bit. Bila benar berisi angka, maka register BL akan berisi nilai 30h-39h (kode ascii untuk “0″-”9″). Setelah itu register BL dikurangi dengan 30h untuk mendapatkan nilai dari 0-9. Setelah itu hasilnya ditambahkan ke register ECX sehingga kembali dari prosedur ini dengan nilai integer hasil konversi di register ECX.

Setelah mendapatkan nilai argumen bertipe integer di register ECX, selanjutnya ECX ini perlu diselamatkan dulu dalam stack (baris 12) sebab ECX akan dipakai dalam prosedur _print_hello (baris 13). ECX dipakai sebagai alamat string msg ketika memanggil system call write(). Setelah kembali dari prosedur _print_hello, nilai ECX perlu dikembalikan seperti semula dengan POP ECX (baris 14) sebab akan dipakai sebagai counter dalam LOOP (baris 15). Ketika menjalankan instruksi LOOP, register ECX akan dikurangi 1, kemudian bila ECX > 0 maka program akan lompat ke _print. Bila ECX bernilai 0, maka loop berhenti dan menjalankan system call exit(0).

Setelah memahami cara kerja program contoh ke-2 itu. Sekarang mari kita bahas instruksi baru yang ada di sana: CALL, RET, PUSH, POP, LOOP.

Instruksi PUSH dan POP

Instruksi PUSH digunakan untuk menyimpan nilai ke dalam stack. Kebalikannya adalah instruksi POP untuk mengambil nilai dari stack. Stack dalam Linux membesar ke alamat memori yang lebih rendah. Puncak stack ada di alamat rendah, sedangkan dasar stack ada di alamat yang lebih tinggi.
NASM/Intel AT&T Deskripsi
PUSH value PUSHL value Menyimpan nilai ke dalam stack
POP dest POPL dest Mengambil nilai dari stack ke dest


Struktur Data Stack

Stack adalah struktur data yang mirip seperti tumpukan piring. Data yang diambil dari stack adalah data yang dimasukkan terakhir, atau istilahnya adalah LIFO (last in first out). Jadi kalau kita ingin mengambil data di tengah-tengah tumpukan, caranya adalah dengan mengambil dulu data dari puncak sampai habis, sehingga data yang kita inginkan berada di puncak stack.
PUSH dan POP dalam Stack

PUSH dan POP dalam Stack

Reguster ESP menunjukkan alamat memori dari puncak stack. Setiap ada instruksi PUSH, maka register ESP berkurang (ingat stack bertumbuh ke alamat yang makin mengecil) karena puncak stack berubah. Begitu pula bila sebaliknya bila ada instruksi POP, maka register ESP akan bertambah.

PUSH EAX

PUSH EAX di atas sama dengan dua instruksi di bawah ini:

SUB ESP, 4
MOV DWORD PTR SS:[esp], EAX

PUSH EAX (4 byte) bisa dilakukan dengan mengurangkan ESP dengan 4, kemudian menyalin isi EAX ke memori di lokasi SS:[ESP], yaitu di segment stack pada offset yang ditunjuk oleh ESP. DWORD PTR menunjukkan bahwa lebar data yang akan disalin ke memori dalam instruksi MOV itu selebar 4 byte.

POP EAX

POP EAX di atas sama dengan dua instruksi di bawah ini:

MOV EAX, DWORD PTR SS:[esp]
ADD ESP, 4

POP EAX (4 byte) bisa dilakukan dengan menyalin isi memori di lokasi SS:[ESP], yaitu di segment stack pada offset yang ditunjuk oleh ESP ke register EAX, lalu menambahkan ESP dengan 4. DWORD PTR menunjukkan bahwa lebar data yang akan disalin ke memori dalam instruksi MOV itu selebar 4 byte.

Instruksi CALL dan RET

Instruksi CALL digunakan untuk memanggil sebuah prosedur. Sedangkan RET dipakai untuk kembali dari prosedur kembali ke lokasi setelah instruksi pemanggilan. Ketika instruksi CALL dijalankan, prosesor menyimpan alamat instruksi sesudah instruksi CALL ke dalam stack (return address), kemudian prosesor lompat ke alamat subroutine yang dituju. Ketika instruksi RET dijalankan, maka prosesor mengambil (POP) return address (alamat yang di-push ketika CALL), kemudian loncat ke alamat tersebut.
NASM/Intel AT&T Deskripsi
CALL subroutine1 CALL subroutine1 Memanggil prosedur subroutine1
RET RET Kembali dari prosedur

CALL dan RET

Instruksi LOOP

LOOP digunakan untuk melakukan looping sejumlah nilai yang ada pada register ECX. Ketika ada instruksi LOOP, prosesor akan mengurangi nilai ECX dengan 1, kemudian membandingkan hasilnya. Bila nilai ECX sekarang masih > 0, maka prosesor akan loncat ke alamat yang ditunjuk dalam LOOP. Bila nilai ECX sekarang menjadi 0, prosesor tidak akan loncat, tapi melanjutkan mengerjakan instruksi selanjutnya setelah LOOP.
NASM/Intel AT&T Deskripsi
LOOP address LOOP address Looping ke alamat yang ditunjukkan oleh address bila ECX > 0.

Instruksi tunggal “LOOP address” ekivalen dengan 2 instruksi assembly berikut:

DEC ECX ; DECREMENT: ECX = ECX - 1, register ECX dikurangi 1
JNZ address ; JUMP IF NOT ZERO: Bila ECX masih belum 0, JUMP ke address

Ilustrasi LOOP

Pada gambar di atas ada dua kondisi yang mungkin yaitu ECX > 0 atau ECX = 0. Mungkin ada yang bertanya, lho bagaimana dengan kondisi ECX < 0 ? Ingat komputer hanya mengenal 2 simbol, yaitu 0 dan 1, jadi pada dasarnya tidak ada “-1″ atau “-0″ dalam representasi binary. Bilangan negatif direpresntasikan dengan pengkodean two-complement, silakan baca di signed number representation karena itu diluar topik yang kita bahas sekarang.

Bila ECX bernilai 0 sebelum mengerjakan instruksi LOOP, maka yang terjadi adalah program akan looping sebanyak 0xFFFFFFFF atau 4.294.967.295 kali. Hal ini terjadi karena 0 – 1 = -1 yang dalam binary adalah 0xFFFFFFFF dengan sistem two-complement.

Sunday 14 February 2010

JADWAL PIALA DUNIA 2010

Bagi yang memerlukan Jadwal Piala Dunia 2010 silakan di download dan di copy Jadwal Piala Dunia 2010 dari blog chandra16486.blogspot.com atau With Luv Candy347, karena saya sebagai maniak bola juga sangat menantikan sekali pertandingan akbar yang tidak akan lama lagi di perlagakan oleh para pemain sepak bole kelas dunia. Terdiri dari 32 negara peserta dg 8 grup. Dan 1 grup terdiri 4 tim. Dan akan bertarung kurang lebih sebulan lamanya tepatnya dari tanggal 11 Juni sampai 11 juli 2010.

Hari Jumat, 11 Juni

Grup A:
11 Juni 2010
21:00 Afrika Selatan v Meksiko, Soccer City, Johannesburg
12 Juni 2010
01:30 Uruguay v Prancis, Cape Town Stadium, Cape Town

17 Juni 2010
01:30 Afrika Selatan v Uruguay, Loftus Versfeld Stadium, Pretoria
17 Juni 2010
18:30 Prancis v Meksiko, Peter Mokaba Stadium, Polokwane

22 Juni 2010
21:00 Meksiko v Uruguay, Royal Bafokeng Stadium, Rustenburg
21:00 Prancis v Afrika Selatan, Free State Stadium, Bloemfontein

Grup B:
12 Juni 2010
18:30 Argentina v Nigeria, Ellis Park Stadium, Johannesburg
21:00 Korea Selatan v Yunani, Nelson Mandela Bay Stadium, Port Elizabeth

17 Juni 2010
21:00 Argentina v Korea Selatan, Soccer City, Johannesburg
18 Juni 2010
01:30 Yunani v Nigeria, Free State Stadium, Bloemfontein

23 Juni 2010
01:30 Yunani v Argentina, Peter Mokaba Stadium, Polokwane
01:30 Nigeria v Korea Selatan, Moses Mabhida Stadium, Durban

Grup C:
13 Juni 2010
01:30 Inggris v Amerika Serikat, Royal Bafokeng Stadium, Rustenburg
13 Juni 2010
18:30 Aljazair v Slovenia, Peter Mokaba Stadium, Polokwane

18 Juni 2010
21:00 Inggris v Aljazair, Cape Town Stadium, Cape Town
19 Juni 2010
01:30 Slovenia v Amerika Serikat, Ellis Park Stadium, Johannesburg

23 Juni 2010
21:00 Amerika Serikat v Aljazair, Loftus Versfeld Stadium, Pretoria
21:00 Slovenia v Inggris, Nelson Mandela Bay Stadium, Port Elizabeth

Grup D:
13 Juni 2010
21:00 Jerman v Australia, Moses Mabhida Stadium, Durban
14 Juni 2010
01:30 Serbia v Ghana, Loftus Versfeld Stadium, Pretoria

18 Juni 2010
18:30 Jerman v Serbia, Nelson Mandela Bay Stadium, Port Elizabeth
19 Juni 2010
18:30 Ghana v Australia, Royal Bafokeng Stadium, Rustenburg

24 Juni 2010
01:30 Australia v Serbia, Mbombela Stadium, Nelspruit
01:30 Ghana v Jerman, Soccer City, Johannesburg

Grup E:
14 Juni 2010
18:30 Belanda v Denmark, Soccer City, Johannesburg
21:00 Jepang v Kamerun, Free State Stadium, Bloemfontein

19 Juni 2010
21:00 Belanda v Jepang, Moses Mabhida Stadium, Durban
20 Juni 2010
01:30 Kamerun v Denmark, Loftus Versfeld Stadium, Pretoria

25 Juni 2010
01:30 Denmark v Jepang, Royal Bafokeng Stadium, Rustenburg
01:30 Kamerun v Belanda, Cape Town Stadium, Cape Town

Grup F:
15 Juni 2010
01:30 Italia v Paraguay, Cape Town Stadium, Cape Town
15 Juni 2010
18:30 Selandia Baru v Slowakia, Royal Bafokeng Stadium, Rustenburg

20 Juni 2010
18:30 Italia v Selandia Baru, Mbombela Stadium, Nelspruit
21:00 Slowakia v Paraguay, Free State Stadium, Bloemfontein

24 Juni 2010
21:00 Paraguay v Selandia Baru, Peter Mokaba Stadium, Polokwane
21:00 Slowakia v Italia, Ellis Park Stadium, Johannesburg

Grup G:
15 Juni 2010
21:00 Brasil v Korea Utara, Ellis Park Stadium, Johannesburg
16 Juni 2010
01:30 Pantai Gading v Portugal, Nelson Mandela Bay Stadium, Port Elizabeth

21 Juni 2010
01:30 Brasil v Pantai Gading, Soccer City, Johannesburg
21 Juni 2010
18:30 Portugal v Korea Utara, Cape Town Stadium, Cape Town

25 Juni 2010
21:00 Korea Utara v Pantai Gading, Mbombela Stadium, Nelspruit
21:00 Portugal v Brasil, Moses Mabhida Stadium, Durban

Grup H:
16 Juni 2010
18:30 Spanyol v Swiss, Moses Mabhida Stadium, Durban
21:00 Honduras v Cili, Mbombela Stadium, Nelspruit

21 Juni 2010
21:00 Spanyol v Honduras, Nelson Mandela Bay Stadium, Port Elizabeth
22 Juni 2010
01:30 Cili v Swiss, Ellis Park Stadium, Johannesburg

26 Juni 2010
01:30 Swiss v Honduras, Free State Stadium, Bloemfontein
01:30 Cili v Spanyol, Loftus Versfeld Stadium, Pretoria

16 Besar
26 Juni 2010, 21:00
Juara Grup A v Peringkat Kedua Grup B, Nelson Mandela Bay Stadium, Port Elizabeth (Partai 49)

27 Juni 2010, 01:30
Juara Grup C v Peringkat Kedua Grup D, Royal Bafokeng Stadium, Rustenburg (Partai 50)

27 Juni 2010, 21:00
Juara Grup D v Peringkat Kedua Grup C, Free State Stadium, Bloemfontein (Partai 51)

28 Juni 2010, 01:30
Juara Grup B v Peringkat Kedua Grup A, Soccer City, Johannesburg (Partai 52)

28 Juni 2010, 21:00
Juara Grup E v Peringkat Kedua Grup F, Moses Mabhida Stadium, Durban (Partai 53)

29 Juni 2010, 01:30
Juara Grup G v Peringkat Kedua Grup H, Ellis Park Stadium, Johannesburg (Partai 54)

29 Juni 2010, 21:00
Juara Grup F v Peringkat Kedua Grup E, Loftus Versfeld Stadium, Pretoria (Partai 55)

30 Juni 2010, 01:30
Juara Grup H v Peringkat Kedua Grup G, Cape Town Stadium, Cape Town (Partai 56)

Perempat-Final
2 Juli 2010, 21:00
Pemenang Partai 53 v Pemenang Partai 54, Nelson Mandela Bay Stadium, Port Elizabeth (Partai 57)

3 Juli 2010, 01:30
Pemenang Partai 49 v Pemenang Partai 50, Soccer City, Johannesburg (Partai 58)

3 Juli 2010, 21:00
Pemenang Partai 52 v Pemenang Partai 51, Cape Town Stadium, Cape Town (Partai 59)

4 Juli 2010, 01:30
Pemenang Partai 55 v Pemenang Partai 56, Ellis Park Stadium, Johannesburg (Partai 60)

Semi-final
7 Juli 2010, 01:30
Pemenang Partai 58 v Pemenang Partai 57, Cape Town Stadium, Cape Town (Partai 61)

8 Juli 2010, 01:30
Pemenang Partai 59 v Pemenang Partai 60, Moses Mabhida Stadium, Durban (Partai 62)

Perebutan Juara Ketiga
11 Juli 2010, 01:30
Tim Kalah Partai 61 v Tim Kalah Partai 62, Nelson Mandela Bay Stadium, Port Elizabeth (Partai 63)

Final
12 Juli 2010, 01:30
Pemenang Partai 61 v Pemenang Partai 62, Soccer City, Johannesburg (Partai 64)

Semoga Jadwal Piala Dunia 2010 yang saya berikan di atas bisa membantu para mania Piala Dunia bola 2010 nanti


Virus blog yang saya maksud bukan menyebarkan keinginan blogging kepada orang lain. Virus disini juga bukan virus layaknya avian influenza yang bisa bikin KO penderitanya. Virus disini adalah virus yang dibawa oleh blog (halaman blog) berupa script-script yang sudah terjangkit virus atau terdefinisi sebagai virus oleh antivirus tertentu, yang dalam hal ini saya mendefinisikan antivirus yang saya maksud adalah Kaspersky Internet Security 2010 dengan virus definition update (database release) 24/01/2010 3:27:00.

Jika antivirus mendeteksi adanya virus saat kita membuka halaman blog (dan web statik juga berlaku) akan muncul notifikasi mengenai virus yang terdeteksi. Dalam hal ini yang dilakukan antivirus adalah memblokir script (hanya script), bukan memblokir halaman web yang kita buka.



Saya memperoleh notofikasi ini ketika saya mengunjungi blog seorang kawan blogger yang memang sudah saya masukkan dalam agregasi blog, maksudnya agar saya bisa selalu ikut tahu update terbaru-nya. Sudah beberapa hari memang blog itu masuk dalam agregasi. Tapi ketika saya berkunjung disambut warning dari antivirus di laptop saya.


Ah terpaksa deh saya hapus dari agregasi. Tetapi saya sudah mencoba memberi tahu empunya blog kok mengenai apa saja yang mengandung virus. Dan kalau saya lihat dari object yang terdeteksi sepertinya itu dari iklan-iklan yang terpasang pada blog.


Apa akibatnya?
Halaman web tidak akan tertampil sempurna (bahkan bisa diblokir).
Pengunjung enggan mengunjungi blog anda (makanya demi menjaga nama baik, blog yang saya maksud tidak saya cantumkan).
Merugikan pengunjung yang tidak tahu, jelas karena artinya komputer jadi ikut-ikutan kena virus. Artinya tentu saja anda jadi agen penyevar virus walau pastinya anda tidak sengaja.
Bagaimana mengatasinya?
Kalau itu dari iklan yang dipasang, lihat link yang menuju alamat script yang terdeteksi virus, hapus jika memang itu perlu dihapus
Kalau itu dari theme, silahkan buka entah itu PHP, CSS, HTML, JAVA dari file theme. Cari link menuju scritpt, kalau perlu hapus saja.
Kalau itu berasal dari plugins yang anda pasang dalam blog, deactive pluginsnya.
Preventif? Ada baiknya juga….
Jangan memasang iklan sembarangan, pastikan script-script yang dimasukkan dalam kode (HTML, CSS, PHP, JAVA) bersih, ada baiknya test terlebih dahulu dengan download semua script yang digunakan oleh iklan.
Teliti memasang theme, sebelum memasang theme ada baiknya dicoba di local computer.
Hati-hati pasang plugins, ada baiknya dicoba offline terlebih dahulu. Selain untuk ngindhik virus, mencoba secara offline juga berguna siapa tahhu dalam plugins ada eror, bisa-bisa web anda suspended

Penampakan Ular Raksasa

Berita heboh, baru baru ini ada Penampakan Ular Raksasa di Kutai Barat yang kabarnya Penampakan Ular Raksasa di Kutai Barat ini merupakan Naga raksasa sebesar drum atau berdiameter sekitar 60 sentimeter dengan panjang sekitar 40 meter Berikut ini cerita selengkapnya.

Masyarakat Kutai Barat (Kubar), khususnya warga Mahakam Ulu, digemparkan kemunculan sepasang ular raksasa sebesar drum atau berdiameter sekitar 60 sentimeter dengan panjang sekitar 40 meter. Ular raksasa itu terlihat meliuk di permukaan air di Riam Haloq, Kampung Long Tuyoq, Kecamatan Long Pahangai.

Ular raksasa yang melintas di sungai itu diyakini masyarakat Suku Dayak sebagai naga. Berdasarkan informasi yang dihimpun Tribun, sebenarnya peristiwa kemunculan naga terjadi Jumat (29/1/2010).

Saat itu sebuah longboat berangkat dari Long Bagun menuju Long Pahangai. Longboat tiba siang hari di Kampung Long Tuyuq, hulunya Riam Haloq. Saat itulah motoris dan penumpang longboat melihat sepasang ular raksasa melintas di permukaan Sungai Mahakam dari arah berlawanan.

Begitu mengetahui sepasang naga lewat, motoris langsung menepikan longboat ke tepi sungai karena khawatir menjadi korban. "Ternyata kedua naga itu berjalan terus dan tidak merasa terganggu dengan kehadiran longboat," tutur Dodik, yang mendengar cerita dari keluarganya di Mahakam Ulu.

Setelah itu, motoris dan beberapa penumpang langsung mengambil gambar menggunakan ponsel berkamera karena menganggap itu sebuah momen langka. Di wilayah Kubar sendiri foto ular raksasa itu telah tersebar dan masyarakat menjadi heboh.

Menurut seorang warga Kampung Lutan, Kecamatan Long Hubung, sebenarnya ada dua naga yang terlihat. Satu naga diyakini berjenis jantan karena di kepalanya ada dua tanduk dan naga betina karena tidak ada tanduknya. Kedua binatang itu memiliki empat kaki, warna kulit hitam dengan panjang sekitar 40 meter dan diameter tubuh sekitar 60 sentimeter.

Ia menambahkan, sebelumnya di Long Tuyoq bahkan ada seorang warga dan anaknya yang sedang berburu babi melihat ular raksasa tersebut. Saking kagetnya, sang anak sampai tidak bisa berbicara hingga kini.

Menurut kepercayaan masyarakat setempat, kemunculan naga bagi Suku Dayak adalah sebuah pertanda, yakni pemberitahuan akan turun hujan lebat yang diiringi banjir yang terjadi tiga hari setelah kemunculan ular raksasa. Hal itu lebih meyakinkan karena sejak Senin (1/2/2010) hingga Rabu (3/2/2010), air Sungai Mahakam meluap dan mengakibatkan banjir yang melanda beberapa kecamatan di sepanjang Sungai Mahakam, di antaranya Long Bagun, Laham, Long Hubung, Long Iram, Tering, Melak, Muara Pahu, Penyinggahan, dan Mook Manaar Bulatn.

Sulit akses
Kampung Long Tuyoq terletak di Kecamatan Long Pahangai. Memiliki luas 126,95 kilometer persegi dan dihuni mayoritas Suku Dayak Bahau Busang. Mereka tinggal di sepanjang Sungai Mahakam dengan mata pencarian sebagai petani tadah hujan, karet, vanili, berburu, dan penambang emas tradisional.

Long Tuyoq merupakan daerah yang terpencil sehingga akses menuju ke sana cukup sulit. Dari Samarinda jika menggunakan pesawat kecil DAS, membutuhkan waktu 1 jam hingga di Datah Dawai. Setelah itu harus melanjutkan perjalanan dengan ketinting menuju hilir Sungai Mahakam, membutuhkan waktu sekitar 2 jam. Jika menggunakan longboat butuh waktu 1 jam.

Sementara jika menggunakan kapal motor (taksi air) dari Samarinda menuju Long Bagun membutuhkan waktu dua hari. Dari Long Bagun dilanjutkan dengan menggunakan speedboat, tarifnya Rp 500.000 per orang, sedangkan longboat Rp 400.000 per orang.

Butuh waktu 12 jam dari Long Bagun sampai di Long Tuyoq. Jalur sungai yang dilewati penuh tantangan dan risiko karena harus menghadapi keganasan riam-riam yang ada di sepanjang Sungai Mahakam. Riam yang dikenal paling ganas adalah Riam Panjang dan Riam Udang, di sana terdapat batu-batu karang yang tajam serta pusaran air yang siap menelan perahu jika tak berhati-hati melintas. Di kanan-kiri Sungai Mahakam menuju Kampung Long Tuyoq ditumbuhi pohon-pohon besar seukuran tubuh kerbau.

Ular 33 meter
Sebelumnya, pada Februari 2009, Kalimantan juga bikin heboh dunia saat muncul sebuah foto udara yang memperlihatkan ular raksasa tengah melintas di sebuah sungai di Sarawak, Malaysia. Ular raksasa itu berenang di Sungai Baleh, Sibu, Serawak, bagian utara Kalimantan.

Sebuah foto ular raksasa terlihat berenang melenggak-lenggok di sebuah sungai tropis yang dikelilingi oleh hutan gambut. Ular berwarna hitam itu sangat besar, hampir memenuhi sungai yang terletak di tengah-tengah hutan rawa yang rimbun. Air beriak di kiri kanannya. Kabarnya, foto itu diambil dari sebuah helikopter, 11 Februari 2009.

Foto itulah yang menjadi perdebatan. Kalimantan memang memiliki ular-ular raksasa. Namun, selama ini ular yang besar yang baru ditemukan adalah sejenis sanca atau piton atau masyarakat Kalimantan menyebutnya ular sawah, yang panjangnya belasan meter.

Namun, ular yang terlihat di foto dan beredar luas di internet, termasuk Youtube, itu jauh lebih panjang dan besar dibandingkan dengan temuan piton. Diperkirakan panjangnya 100 kaki atau sekitar 33 meter.

Gambar tersebut diambil oleh anggota tim wilayah bencana banjir yang kemudian diterbitkan oleh Utusan Sarawak, sebuah koran lokal. New Straits Times di Kuala Lumpur juga memuat foto tersebut, yang kemudian dirilis oleh The Telegraph, Inggris.

Ada juga yang tidak memercayai foto itu dan menganggapnya rekayasa semata. Hal itu karena terlalu jauhnya pengambilan gambar ular tersebut. Benar atau tidak, foto itu sudah membuat masyarakat di sekitar Serawak, khususnya Sibu, ketakutan sebab sungai itu merupakan urat nadi transportasi masyarakat selama ini.

Berdasarkan legenda yang hidup di masyarakat setempat, memang dipercaya tentang adanya ular besar di kawasan tersebut yang bernama Nabau. Menurut kepercayaan, Nabau merupakan ular dengan panjang 80 meter dengan kepala naga dan tujuh lubang hidung. Masyarakat desa yang tinggal di Sungai Baleh Borneo memercayai makhluk mistik tersebut. Selain itu, masyarakat memang sering melihat ular-ular besar di kawasan itu.

Nah, bila kedua foto itu asli, apakah ular yang terlihat itu sejenis piton atau anaconda? Hingga kini memang belum ditemukan adanya anaconda di Kalimantan.

Rekor ular terpanjang saat ini memang anaconda (eunectes) dari Amazon. Anaconda merupakan keluarga boa. Panjang anaconda yang terbaru ditemukan adalah 50 kaki, tetapi para ilmuwan percaya ada anaconda yang panjangnya 80 kaki, bahkan 100 kaki dari temuan kulit ular tersebut oleh sebuah ekspedisi ilmuwan Inggris tahun 1992. Dalam keluarga anaconda, menurut situs lingkungan Mongabay, yang terbesar adalah anaconda hijau (Eunectes murinus). Panjangnya mencapai 43 meter.

Piton Asia adalah ular terpanjang kedua. Ilmuwan menyebutnya Asiatic reticulated python (Python reticulatus). Piton terpanjang yang ditemukan di kawasan Kalimantan panjangnya 33 kaki dan merupakan rekor dunia sanca terpanjang saat ini. Para ilmuwan percaya panjang piton bisa mencapai 50 kaki atau sekitar 15 meter.

Bedanya, anaconda lebih langsing dan ahli berenang. Sementara piton lebih gemuk dan hanya suka kelembaban, bukan di air. Anaconda menggigit mangsanya sampai mati sebelum menelan, sementara piton menggunakan kekuatannya dengan membalut mangsa sampai tulang-belulangnya hancur atau tak bergerak lagi, kemudian ditelan bulat-bulat.

Awal Februari tahun lalu, para ilmuwan juga menemukan fosil ular seberat sebuah mobil kecil. Ular itu diperkirakan bisa melumat binatang seukuran sapi. Monster sepanjang 45 kaki bernama Titanoboa ini sangat besar dan hidup dengan memakan buaya dan kura-kura raksasa. Beratnya mencapai 1,25 ton. Ia biasa merayap di sekitar hutan-hutan tropis Amerika Selatan 60 tahun silam. Semoga berita Penampakan Ular Raksasa di Kutai Barat ini gak beneran ya kalo ia wah gawat tuh! http://www.tribunpekanbaru.com/read/artikel/13805

Facebook Comments

Related Posts Plugin for WordPress, Blogger...