Oleh: M.
Sayyidus Shaleh
Yep. Di tulisan sebelumnya
mungkin Pembaca sekalian pernah menemukan statemen yang menyatakan kalau, untuk
menjadi seorang Hacker, salah satu syaratnya adalah memahami setidaknya tiga
bahasa pemograman. Salah satu bahasa program yang paling mendunia sekarang
adalah bahasa C++. Pernah dengar? Ya, C++ adalah pengembangan dari bahasa C,
dengan perbedaan yang jelas kalau C++ itu Pemograman Berorientasi Objek.
Bingung dengan istilah barusan? Tulisan Penulis lainnya pernha menjelsakan
istilah ini. Sebelum melanjutkan membaca, harap digaris bawahi kalau tulisan
kali ini dikhususkan untuk Pembaca yang masih awam di dunia programming.
Bahasa C++ adalah bahasa pemograman
tingkat menengah. Maksudnya? Begini, setiap bahasa pemograman di dunia (yang
tentu sangat banyak) digolongkan berdasarkan kemudahan penggunaannya oleh
manusia dan pemahaman langsung dari komputer. Ada tiga tingkatan. Rendah,
Menengah, dan Tinggi. Mulai dari tingkatan Tinggi, adalah bahasa yang paling
mudah digunakan Programmer (apalagi untuk pemula). Dan bahasa tingkat Rendah,
adalah yang paling mudah dipahami oleh komputer untuk dieksekusi. Simpelnya, cara
manusia untuk berinterkasi dengan komputer sebagai seorang Programmer adalah
bahasa tingkat Tinggi. Sedangkan cara paling susah adalah dengan bahasa tingkat
Rendah.
Masih bingung? Nah, kalau begitu
mari kita intip sedikit tentang sejarah awal komputer, yang sekaligus mengawali
programming.
Di abad 20, saat para komputer
generasi pertama dioperasikan, keadaan mereka sangat jauh berbeda dengan yang
ada sekarang. MEmori seukuran kulkas, mesin cepat panas, boros ruang, dan
masalah lainnya. Komputer ini hanya bisa menerima instruksi dari manusia dengan
cara paling primitif, dengan bahasa yang disebut Machine Language alias bahasa
Mesin, yang hanya memuat angka nol dan satu sebagai parameter logika. Ya dan
Tidak. Masuk dan Keluar. Tentu hal yang bisa dilakukan amat terbatas. Karena
keterbatasannya, masih banyak yang mengatakan kalau bahasa Mesin belum masuk
kategori bahasa pemograman.
Teknologi pun berkembang,
begitupun komputer yang mulai berevolusi menjadi semakin efisien. Ditemukanlah
sebuah bahasa baru, yaitu Assembly. Bahasa ini sudah memulai penggunaan
kata-kata kunci agar Programmer lebih mudah berinteraksi dengan komputer, tapi
tetap saja masih sangat rumit dan kompleks. Inilah yang disebut dengan bahasa
tingkat Rendah. Assembly menggunakan kata kunci yang disebut mnemonic,
yang hanya berkisar 3-4 huruf seperti MOV, EAX, JMP, dan lainnya.
Di tahun 1969, laboratorium Bell
AT&T menggunakan bahasa Assembly untuk mengembangkan OS UNIX, nenek moyang
dari LINUX yang dibuat dengan bahasa C.
Tapi, pertanyaannya adalah, apa
yang terjadi dengan bahasa MEsin? Apakah menghilang begitu saja ketika muncul
Assembly? Dan apakah ketika bahasa C muncul, Assembly lenyap, dan seterusnya?
Ilustrasi berikut mungkin bisa membuat Pembaca mengerti.
reader@hacking:~/booksrc $ gcc -g firstprog.c reader@hacking:~/booksrc $ ls -l a.out
-rwxr-xr-x 1 matrix users 11977 Jul 4 17:29 a.out reader@hacking:~/booksrc $ gdb -q ./a.out
Using host libthread_db library "/lib/libthread_db.so.1". (gdb) list
1 #include <stdio.h> 2
3 int main()
4 {
5 int i;
6 for(i=0; i < 10; i++)
7 {
8 printf("Hello,
world!\n"); 9 }
10 }
(gdb) disassemble main
Dump of assembler code for function main():
0x08048384
|
<main+0>:
|
push
|
ebp
|
0x08048385
|
<main+1>:
|
mov
|
ebp,esp
|
0x08048387
|
<main+3>:
|
sub
|
esp,0x8
|
0x0804838a
|
<main+6>:
|
and
|
esp,0xfffffff0
|
0x0804838d
|
<main+9>:
|
mov
|
eax,0x0
|
0x08048392
|
<main+14>:
|
sub
|
esp,eax
|
0x08048394
|
<main+16>:
|
mov
|
DWORD PTR [ebp-4],0x0
|
0x0804839b
|
<main+23>:
|
cmp
|
DWORD PTR [ebp-4],0x9
|
0x0804839f
|
<main+27>:
|
jle
|
0x80483a3 <main+31>
|
0x080483a1
|
<main+29>:
|
jmp
|
0x80483b6 <main+50>
|
0x080483a3 <main+31>:
|
mov
|
DWORD PTR [esp],0x80484d4
|
0x080483aa <main+38>:
|
call
|
0x80482a8 <_init+56>
|
0x080483af <main+43>:
|
lea
|
eax,[ebp-4]
|
0x080483b2 <main+46>:
|
inc
|
DWORD PTR [eax]
|
0x080483b4 <main+48>:
|
jmp
|
0x804839b <main+23>
|
0x080483b6 <main+50>:
|
leave
|
|
0x080483b7 <main+51>:
|
ret
|
|
End of assembler dump.
|
||
(gdb) break main
|
Breakpoint 1 at 0x8048394: file firstprog.c, line 6. (gdb) run
Starting program: /hacking/a.out
Breakpoint 1, main() at firstprog.c:6 6 for(i=0; i < 10; i++) (gdb) info register
eip
eip 0x8048394 0x8048394
(gdb)
(Ilustrasi dari buku “Hacking: The Art of Exploitaion”)
Wow, jangan panik dulu!
Ilustrasi tadi terjadi di terminal OS Linux. Di baris yang diawali angka 1 s.d
10, berisi baris kode bahasa C. Lalu, yang terjadi di bawahnya adalah
penguraian baris bahasa C tersebut ke bentuk Assembly.
Eh!? Jadi apa yang sebenarnya
telah terjadi? Begini, bahasa Assembly dibuat bukan untuk semata-mata
menggantikan Machine Language, tapi membuatnya lebih sederhana untuk dipakai
Programmer. Jadi, komputer, sejak generasi awal sampai dengan sekarang, masih
menggunakan bahsasa ibu yang sama, Machine Language. Tapi, manusia terus
mengembangkannya sehingga menjadi jauh lebih sederhana, tapi di dalamnya,
tersimpan sesuatu yang sangat kompleks. Hal ini sengaja Penulis jabarkan, untuk
menekankan konsep yang selalu disalahpahami oleh hampir seluruh Programmer di
dunia. Banyak yang menganggap kalau kode yang telah mereka buat adalah
seluruhnya program yang akan berjalan. Padahal sebenarnya tidak seperti itu. Pemahaman
inilah yang menjadi kelemahan sistem pada umumnya. Inilah yang membedakan
seorang Programmer konvensional dan seorang Hacker.
Kenapa bisa begitu? Tenang saja.
Di kelanjutan seri ini, Penulis akan menjelaskan sebabnya lebih lanjut.
#Welcome to
the Amazing World of Programming!
Tulisan
yang dimuat adalah sepenuhnya milik penulis risalah-online, bukan merupakan
pernyataan dari risalah-online
No comments:
Post a Comment