SECURE PROGRAMMING UNTUK MENCEGAH BUFFER (1)
SECURE PROGRAMMING UNTUK MENCEGAH BUFFER OVERFLOW SKRIPSI
Diajukan Untuk Memenuhi Salah Satu Syarat Meraih Gelar Sarjana Komputer Jurusan Teknik Informatika Pada Fakultas Sains dan Teknologi UIN Alauddin Makassar
Oleh SUHERMAN
NIM. 60200106067
JURUSAN TEKNIK INFORMATIKA FAKULTAS SAINS DAN TEKNOLOGI UNIVERSITAS ISLAM NEGERI (UIN) ALAUDDIN MAKASSAR
: Secure Programming untuk Mencegah Buffer Overflow
Salah satu masalah yang berkaitan dengan kesalahan dalam perangkat lunak yaitu Buffer overflow. Buffer overflow dapat dieksploitasi dengan mengirimkan input-input yang sengaja dirancang untuk memicu keadaan buffer overflow tersebut. Input-input tersebut juga dirancang sedemikian rupa sehingga saat terjadi buffer overflow, maka proses tersebut akan berkelakuan seperti yang diinginkan oleh penyerang. Bila keadaan ini telah terjadi maka bukan tidak mungkin informasi-informasi penting yang tersimpan di dalamnya bisa diambil, digunakan atau diubah sekehendak hati oleh penyerang. Pada penelitian ini dibahas metode pencegahan buffer overflow dengan pendekatan secure programming yang diterapkan dalam alat analisis kode sumber program ,analsis kode sumber program berbentuk teks editor yang dilengkapi dengan pendeteksi kemungkinan terjadinya buffer overflow. Buffer overflow terjadi karena beberapa fungsi dalam bahasa C C++ memiliki kerentanan untuk terjadinya buffer overflow serta C C++ tidak memeriksa batasan array dan referensi pointer secara otomatis, kerentanan tersebut dapat dicegah dengan review kode pada saat penulisan kode program yaitu membatasi input yang datangnya dari user. Kerentanan ini dapat dicegah dan perlindungan dapat ditingkatkan dengan menekankan solusi lebih pada saat penulisan kode program.
Kata Kunci : Secure Programming, Buffer Overflow
ii
PERSEETUJUAN PEMBIMBING
Pembimbing penulisan skripsi Saudara Suherman, Nim : 60200106067, Mahasiswa Jurusan Teknik Informatika pada Fakultas Sains dan Teknologi UIN Alauddin Makassar, setelah dengan seksama meneliti dan mengoreksi skripsi yang bersangkutan dengan judul “Secure Programming untuk Mencegah Buffer Overflow”, memandang bahwa skripsi tersebut telah memenuhi syarat-syarat ilmiah dan dapat disetujui untuk diajukan ke sidang munaqasyah.
Demikian persetujuan ini diberikan untuk proses selanjutnya.
Makassar, 11 April 2011
Pembimbing I
Pembimbing II
Faisal Akib, S.Kom., M.Kom.
Yusran Bobihu, S.Kom., M.Si.
iii
PERNYATAAN KEASLIAN SKRIPSI
Dengan penuh kesadaran, penyusun yang bertanda tangan di bawah ini menyatakan bahwa skripsi ini benar bahwa hasil karya penyusun sendiri. Jika di kemudian hari terbukti bahwa ia merupakan duplikat, tiruan, plagiat, atau dibuat oleh orang lain, sebagian atau seluruhnya, maka skripsi dan gelar yang diperoleh karenanya batal demi hukum.
Makassar, 21 April 2011 Penyusun,
SUHERMAN NIM : 60200106067
iv
PENGESAHAN SKRIPSI
Skripsi yang berjudul “Secure Programming untuk Mencegah Buffer Overflow” yang disusun oleh Suherman, NIM: 60200106067, telah diuji dan dipertahankan dalam sidang munaqasyah yang diselenggarakan pada hari Jum’at, 15 April 2011, dinyatakan telah dapat diterima sebagai salah satu syarat untuk memperoleh gelar Sarjana Komputer pada Jurusan Teknik Informatika Fakultas Sains dan Teknologi , dengan beberapa perbaikan.
21 April 2011 M Makassar,
17 Jumadil Awal 1432 H
DEWAN PENGUJI
Ketua
: Ridwan A.Kambau, S.T.,M.Kom
Sekretaris
: Nur Afif, S.T., M.T
Munaqisy I
: Mustikasari, S.Kom., M.Kom
Munaqisy II
: Abdul Wahid, S.T.,M.Kom
Munaqisy III : Drs. M. Arif Alim, M.Ag
Pembimbing I : Faisal, S.Kom., M.Kom
Pembimbing II : Yusran Bobihu, S.Kom., M.Si
Diketahui Oleh : Dekan Fakultas Sains dan Teknologi UIN Alauddin Makassar
Prof. Dr. H. Bahaking Rama, M.S
NIP: 150 202 136
v
KATA PENGANTAR
Alhamdulillahirobbil a’lamin penulis bersyukur kepada Allah SWT. Karena atas berkat, rahmat dan karunia yang telah diberikannya sehingga penulis bisa menyelesaikan tugas akhir ini.
Tugas akhir ini merupakan syarat wajib kelulusan pada program sarjana strata satu di Jurusan Teknik Informatika Fakultas Sains dan Teknologi Universitas Islam Negeri Alauddin Makassar. Berbagai kemudahan dan hambatan yang dihadapi penulis dalam proses pengerjaan tugas akhir ini semoga dapat memberikan pengalaman kepada penulis di masa mendatang.
Tugas akhir ini kupersembahkan kepada kedua orang tua penulis yang selalu mencintai dan mendidik penulis semenjak penulis lahir di dunia,dan selalu mendoakan penulis di dalam menyelesaikan tugas akhir ini.
Perkenankan penulis menyampaikan terima kasih kepada:
1. Rektor UIN Alauddin Makassar, Bapak Prof. Dr. H. A. Qadir Gassing, H. T, MS.
2. Dekan Fakultas Sains dan Teknologi, Bapak Prof. Dr.H. Bahaking Rama, M.S.
3. Pembantu Dekan I, II, dan III Fakultas Sains dan Teknologi.
4. Bapak Faisal, S.Kom.,M.Kom dan Ibu Mustikasari, S.Kom.,M.Kom selaku ketua Jurusan dan sekretaris Jurusan Teknik Informatika Fakultas Sains dan Teknologi Universitas Islam Negeri Alauddin Makassar beserta seluruh stafnya yang telah memberikan bimbingan selama masa pendidikan.
5. Seluruh pegawai dan staf akademik Fakultas Sains dan Teknologi yang telah memberikan bantuan selama proses perkuliahan.
vi
6. Bapak Faisal, S.Kom.,M.Kom dan Bapak Yusran Bobihu, S.Kom.,M.Si selaku dosen pembimbing yang dengan kerelaan dan keikhlasannya memberikan bimbingan dari awal hingga peyelesaian skripsi ini.
7. Semua dosen Teknik Informatika UIN Alauddin Makassar, terima kasih atas segala ilmunya.
8. Ibunda dan Ayahanda tercinta atas segala doa dan pengorbanannya kepada penulis.
9. Teman-teman Teknik Informatika Angkatan 2006, senior-senior angkatan 2004, 2005 dan adik-adik angkatan 2007 terima kasih atas bantuan dan dorongan semangatnya selama ini.
10. Dan Semua yang telah membantu penulis dalam menyelesaikan tugas akhir ini yang tidak bisa disebutkan satu persatu.
Semoga Allah SWT memberikan imbalan yang setimpal atas segala bantuan yang diberikan kepada penulis.
Penulis sadar bahwa tugas akhir ini masih jauh dari harapan dan masih terdapat banyak kekurangan, olehnya itu penulis butuh saran dan kritikan dari berbagai pihak demi kesempurnaan tugas akhir ini.. Wassalamualaikum warahmatullahi wabarakatuh
Makassar, 11 April 2011
Penulis
vii
DAFTAR TABEL
Tabel 2.1 Parameter yang umumnya digunakan untuk format string attack ......... 18 Tabel 5.1 Hasil pendeteksian buffer overflow ....................................................... 60
xi
BAB I PENDAHULUAN
A. Latar Belakang
Memori adalah pusat kegiatan pada sebuah komputer, karena setiap proses yang akan dijalankan harus melalui memori terlebih dahulu. CPU mengambil
instruksi dari memori sesuai yang ada pada program counter. 1 Pada saat program dijalankan, variabel datanya disimpan di dalam memori yang disebut buffer, buffer
ini jika terisi dengan data yang ukurannya melebihi kapasitasnya, akan mengisi alamat memori lain yang bukan milik variabel tersebut, keadaan inilah yang dinamakan buffer overflow.
Buffer overflow umumnya terjadi karena cacat pemrograman yang memungkinkan lebih banyak data ditulis kedalam buffer melebihi dari buffer yang didesain. Buffer overflow seringkali dieksploitasi dengan mengirimkan input-input yang sengaja dirancang untuk memicu keadaan buffer overflow tersebut. Akibatnya, memori disekitar buffer tertimpa, tetapi yang membuat ini merusak adalah input- input tersebut juga dirancang sedemikian rupa sehingga saat terjadi buffer overflow, maka proses tersebut akan berkelakuan seperti yang diinginkan oleh penyerang. Bila keadaan ini telah terjadi maka bukan tidak mungkin informasi-informasi penting yang tersimpan di dalamnya bisa diambil, digunakan atau diubah sekehendak hati oleh penyerang.
1 Masyarakat Digital Gotong Royong. 2006.Pengantar Sistem OperasiKomputerPlus Ilustrasi Kernel Linux. (Ed IV Masyarakat Digital Gotong Royong). h.233
Perkembangan perangkat lunak yang semakin pesat ternyata juga menimbulkan resiko keamanan yang besar, hal tersebut dapat dilihat dari kerentanan yang terus muncul dalam perangkat lunak. Menurut laporan CERTCC, buffer overflow merupakan penyebab dari 50 bug keamanan yang dilaporkan dan dijadikan advisori oleh CERTCC. Lebih jauh lagi, riset yang dilakukan oleh Crispin Cowan dan kawan-kawan, menemukan bahwa buffer overflow merupakan
vulnerability of the decade. 2
Bahasa pemrograman yang rentan dengan masalah ini adalah bahasa C C++, hal itu disebabkan karena C C++ mengakses memori secara langsung sehingga rentan terhadap buffer overflow dan serangan string. Dalam bahasa C C++ mekanisme cek batas buffer tidak dibuilt-in, sehingga tugas tersebut menjadi tugas dari programmer.
Dengan adanya kerentanan tersebut serta bahaya yang ditimbulkan maka seharusnya ada pencegahan sebelum terjadinya kerentanan tersebut, sebagaimana firman Allah dalam Al-qur’an surah Ali Imran ayat 104 :
Terjemahnya:
Dan hendaklah ada di antara kamu segolongan umat yang menyeru kepada kebajikan, menyuruh kepada yang ma'ruf dan mencegah dari yang
munkar, merekalah orang-orang yang beruntung (Q.S Ali Imran (3);104). 3
3 Janner Simarmata. 2006. Pengamanan Sistem Komputer. (Ed. I, Yogyakarta: ANDI), h. 162 Departemen Agama RI. Al-Qur’an Al Karim dan Terjemahannya. (Semarang: Toha Putra:).h. 50
Ayat tersebut menegaskan untuk menyeru kepada kebaikan dan mencegah dari kemungkaran atau kehancuran, Ayat tersebut berkaitan dengan tulisan ini untuk melakukan pencegahan terhadap kerentanan dalam kode program, serta memberikan alternatif untuk mencegah terjadinya buffer overflow.
Beberapa pendekatan telah dilakukan untuk mencegah masalah buffer overflow, salah satunya dengan menggunakan pendekatan dari sudut pandang kompiler yang merubah cara kompile program, sehingga perlindungan terhadap buffer overflow dilakukan secara otomatis yaitu kompiler menambahkan kode untuk melacak ukuran buffer dan memeriksa setiap akses buffer sesuai dengan ukuran yang dialokasikan, namun hal itu membuat ukuran kode dan waktu eksekusi meningkat.
Berdasarkan masalah tersebut diatas, tulisan ini akan membahas metode pencegahan buffer overflow dengan pendekatan secure programming yang diterapkan dalam alat analisis kode sumber program yang dirancang untuk mendeteksi kemungkinan terjadinya buffer overflow.
B. Rumusan Masalah
Berdasar latar belakang yang dimaksudkan di atas, maka dapat dirumuskan permasalahan yaitu bagaimana mencegah Buffer Overflow dengan menggunakan pendekatan secure programming ?
C. Batasan masalah
Pembahasan dalam penulisan ini memiliki batasan-batasan sebagai berikut:
1. Pada penelitian ini akan dibahas metode pendekatan secure programming yang meliputi metode penulisan kode program serta pemilihan fungsi library untuk mencegah terjadinya buffer overflow dalam level aplikasi.
2. File yang dianalisa dalam bentuk format .c, .cpp, dan .h
D. Pengertian judul
Untuk menghindari salah pengertian atas judul ataupun makna yang terkandung pada judul skripsi ini, maka dijelaskan beberapa istilah dalam judul skripsi ini.
1. Secure programming adalah praktek pengembangan software dimana perhatian dan perencanaan diberikan untuk memproduksi aplikasi handal dan kuat yang beroperasi dengan aman. 4
2. Mencegah adalah menegahkan; menahan (menolak dsb); merintangi (melarang dsb); mengikhtiarkan supaya jangan (terjadi dsb). 5
3. Buffer overflow adalah sebuah kondisi yang terjadi ketika sebuah program sedang dipaksa untuk menulis data di luar akhir alokasi buffer memori. 6
E. Tujuan dan Manfaat Penelitian
1. Tujuan penelitian
Mengembangkan sistem untuk menampilkan informasi mengenai kesalahan kode program yang memungkinkan terjadinya buffer overflow.
4 Secure Programming Techniques Workshop. 2002.
http:www.iaps.comsecure-
programming.html
5 W.J.S Poerwadarminta. 2003. Kamus Umum Bahasa Indonesia.(Ed. III Jakarta: Balai Pustaka).
h. 220
Anthony S. Clark. 2005. Finding and Exploiting Simple Local Buffer Overflows. h.2
2. Manfaat penelitian
Hasil dari penelitian ini diharapkan dapat bermanfaat bagi programmer agar lebih berhati-hati dalam menulis source code program serta memahami karakteristik bahasa pemrograman yang digunakan.
F. Sistematika Penulisan
1. BAB I PENDAHULUAN merupakan pendahuluan yang membahas latar belakang, tujuan, rumusan dan batasan masalah, pengertian judul serta sistematika penulisan.
2. BAB II TINJAUAN PUSTAKA berisi pembahasan yang memuat landasan teori dan tinjauan pustaka yang digunakan untuk membangun sistem ini.
3. BAB III METODE PENELITIAN membahas tentang gambaran umum penelitian, metode penelitian, jadwal penelitian.
4. BAB IV PERANCANGAN SISTEM membahas perancangan sistem. Pada bab ini dibahas tentang rancangan input, analisis, serta rancangan output.
5. BAB V IMPLEMENTASI Dan PENGUJIAN SISTEM berisi tentang implementasi dan pengujian program. Dalam hal ini akan dibahas metode pengujian program serta hasil dari pengujian sistem.
6. BAB VI PENUTUP berisi kesimpulan dan saran dari bab-bab sebelumnya.
BAB II TINJAUAN PUSTAKA
A. Memori
Memori merupakan bagian komputer yang bertugas untuk menyimpan data, memori komputer berisi milyaran sirkuit memori yang bertindak sebagai 0 dan 1, program dapat memerintahkan komputer untuk menyatakan 0 dan 1 pada sirkuit tersebut dan dapat pula meminta data yang berada di sirkuit-sirkuit tersebut. Dari sirkuit-sirkuit memori tersebut dikodekan menjadi beragam tipe data.
1. Model Memori
Prosesor dalam mengakses memori menggunakan salah satu dari tiga model memori berikut:
a. Flat Memory, dalam model ini, memori dilihat oleh program sebagai
alamat, yang disebut ruang alamat linier. Semua kode, data, dan stack yang terkandung dalam ruang alamat tunggal serta setiap lokasi beralamat di ruang memori yang disebut alamat linear.
b. Segmented Memory, memori dilihat oleh program sebagai kelompok
ruang alamat independen yang disebut segmen. Biasanya, kode, data dan stack yang terkandung dalam segmen terpisah. Untuk mengatasi byte dalam segmen, program akan menggunakan alamat logis. Alamat logis terdiri dari pemilih segmen dan offset. Pemilih segmen mengidentifikasi segmen yang akan diakses sementara mengidentifikasi offset byte dalam ruang alamat segmen. Semua segmen sebenarnya
c. Real-Address Memory Model, Ini adalah memori prosesor Intel
model 8086 disediakan untuk mendukung kompatibilitas dengan program yang ada yang ditulis untuk berjalan di prosesor Intel 8086.
Gambar 2.1 Tiga model manajemen memori 7
2. Memori dan Pengalamatan
Bahasa C menyediakan tiga cara yang berbeda dalam mengalokasikan memori untuk objek yaitu:
7 http:www.tenouk.comBufferoverflowcbufferoverflowvulexploitdemo2.html 7 http:www.tenouk.comBufferoverflowcbufferoverflowvulexploitdemo2.html
biner pada saat kompilasi program, objek tersimpan di dalam memori selama objek yang mengandung biner masih tersimpan di dalamnya.
b. Alokasi memori otomatis yaitu objek sementara dapat disimpan di
dalam stack, dan ruang ini secara otomatis dibebaskan sehingga dapat digunakan kembali setelah blok dimana objek dideklarasikan telah digunakan.
c. Alokasi memori dinamis yaitu blok memori dengan ukuran bebas
dapat diminta saat run time dengan menggunakan fungsi pustaka seperti malloc dari daerah memori yang disebut tumpukan, blok ini bertahan sampai dibebaskan untuk digunakan kembali dengan memanggil fungsi library free .
3. Segmentasi Memori Program
Proses dipandang dari sudut manajemen memori terbagi tiga yaitu:
a. Text, segmen ini sifatnya read only karena tidak digunakan untuk
menyimpan variabel tetapi kode program, Sehingga untuk menuliskan data ke bagian ini dapat menyebabkan kesalahan. Keuntungan dari segmen ini menjadi read only adalah bahwa hal itu dapat dibagi antara salinan yang berbeda dari program, yang memungkinkan eksekusi beberapa program pada saat yang sama tanpa masalah. Segmen memori ini memiliki ukuran tetap, karena tidak pernah ada perubahan di dalamnya.
b. Data, digunakan untuk menyimpan program variabel statis dan
variabel global, baik yang telah diinisialisasi maupun yang belum. Segmen data diisi dengan variabel global diinisialisasi, string, dan konstanta lain yang digunakan pada variabel global, baik yang telah diinisialisasi maupun yang belum. Segmen data diisi dengan variabel global diinisialisasi, string, dan konstanta lain yang digunakan pada
c. Stack, yang dapat dialokasikan secara dinamis, biasanya
dimanfaatkan untuk menyimpan variabel lokal maupun untuk melewatkan parameter fungsi. Pengaksesan data kebagian stack menggunakan metode LIFO (Last In First Out), buffer yang ada dalam bahasa C diimplementasikan sebagai array. Array dapat dibedakan kedalam dua jenis berdasarkan metode pengalokasiannya, yaitu array statis dan array dinamis. Array statis dialokasikan dibagian data saat program dimuat ke memori, sedangkan array dinamis dialokasikan di dalam stack saat runtime.
Beberapa hal yang berkaitan dengan stack pada prosesor Intel adalah :
Penggunaan metode big endian dalam mengorganisasikan sistem
memori. Di sini MSB (Most Significant Bit) terletak pada alamat memori yang lebih kecil dibandingkan LSB (Least Significant Bit).
Penambahan besar stack dilakukan kearah alamat memori yang lebih
kecil. Di sini posisi bawah dari stack mempunyai alamat yang tetap. Posisi atas stack yang alamat memorinya lebih kecil dari posisi bawah selalu berubah.
Register stack pointer (SP) selalu menunjuk ke posisi atas dari stack.
Untuk memindahkan data ke stack digunakan instruksi PUSH yang
secara otomatis akan menurunkan nilai SP sebesar 4 byte. Sedangkan untuk mengambil data dari stack digunakan instruksi POP yang secara otomatis juga akan menaikkan nilai SP sebesar 4 byte.
Low addresses
Text (code) segment
Data segment
bss segment Heap segment
the heap grows down toward higher memory addresses
the stack grows up toward lower memory
addresses
High addresses
Stack segment
Gambar 2.2 proses memori. 8
Stackframe merupakan kondisi yang terjadi jika prosedur dipanggil pada saat proses di memori. Stackframe ini dibuat ketika prosedur dipanggil dan akan dihapus dari stack setelah prosedur telah selesai, stackframe berisi variabel lokal dari prosedur dan semua informasi yang diperlukan untuk mengembalikan stackframe sebelumnya. Eksekusi program kedalam memori terlihat seperti gambar 2.3.
8 Jon Erickson. Hacking: The Art of Exploitation. (San Francisco: No Starch Press, Inc). h.7.
Physical Memory
Code for printf()
Source Code Program
int a[10]={0,1,2,3,4,5,6,7,8,9};
Code for top of for loop
int b[10]; void main() {
int i; static int k=3;
Code for call to printf()
for(i=0;i<10;i++) {
Code for b[i]=ka[i]
printf(“d\n”,a[i]); b[i]=ka[i];
Array a[]
Array b[] Variabel k
Gambar 2.3 penempatan source code kedalam memori pada waktu dieksekusi 9
4. Operasi Stack
Stack merupakan bagian memori yang digunakan sebagai tempat penyimpanan sementara sebuah nilai oleh register.
Tujuan utama stack adalah membuat penggunaan fungsi lebih efisien. Dari perspektif tingkat rendah, fungsi merubah aliran kontrol program, sehingga instruksi atau sekelompok instruksi dapat dieksekusi secara independen dari sisa program. Lebih penting lagi ketika sebuah fungsi telah selesai melaksanakan instruksi, fungsi
9 Fransitek Franek, Memory as a Programming Concept in C and C++ (Cambridge University Press, 2004), h. 2.
tersebut kembali ke kontrol fungsi asli pemanggilnya. Register yang terkait dalam operasi stack yaitu:
a. Stack segmen (SS), stack ini diimplementasikan dalam memori,
sebuah sistem dapat mempunyai sejumlah stack yang hanya dibatasi oleh jumlah maksimum segmen.
b. Stack pointer (SP), register ini berisi alamat data yang akan
dipindahkan dari stack, register ini menunjuk bagian teratas dari stack yang diproses dengan operasi push untuk memasukkan nilai kedalam stack dan pop untuk mengambil nilai dari stack, subrutin call dan return, serta operasi interupt.
c. Base pointer (BP), register ini digunakan untuk mengakses elemen
pada stack yang berhubungan dengan fixed point stack (point tertentu pada stack).
10 Gambar 2.4 stack layout
10 Aravind Aluri dan Mohit Kumar. Buffer Overflow Attacks. h.7.
B. Buffer Overflow
Salah satu masalah keamanan terbesar dalam program C+ adalah buffer overflow, masalah lain dengan C+ adalah bahwa programmer harus melakukan sendiri manajemen memori seperti penggunaan malloc(), alloc(), free(), new dan delete. Jika berhasil melakukan perbaikan cacat keamanan, masalah dapat bertambah serius ketika program tidak menentu yang menyebabkan penggunaan memori berlebih sehingga dapat terjadi crash atau eksploitasi.
Pada bulan November 1988, worm Morris menyerang mesin VAX dan Sun dan mencegah sejumlah besar pengguna untuk mengakses internet, pada bulan Juli 2001 worm Code Red berhasil mengeksploit lebih dari 300.000 komputer yang menggunakan Microsoft IIS Web Server. Pada bulan Januari 2003 worm lain yaitu Slammer menyerang Microsoft SQL Server 2000 melumpuhkan bagian internet di Korea Selatan dan Jepang, memutuskan sistem telepon di Finlandia, dan memperlambat jaringan AS untuk reservasi maskapai penerbangan, serta transaksi kartu kredit.
Masalah buffer overflow terjadi pada sejumlah besar aplikasi dan mempengaruhi semua sistem operasi. Satu-satunya cara untuk mengetahui dengan pasti apakah sebuah aplikasi akan bisa tahan terhadap serangan buffer overflow
adalah dengan melakukan review terhadap source code. 11
11 Chris brenton, cameron hunt. 2005. Diterjemahkan oleh Jhoni hidayat. Network Security. (Jakarta: Elex Media Komputindo). h. 669
1. Stack buffer overflow
Ketika sebuah program dijalankan, alamat instruksi selanjutnya disimpan di dalam stack. Stack buffer overflow terjadi ketika sebuah buffer yang dideklarasikan pada stack tertimpa oleh data yang lebih besar dari buffer, variabel yang dideklarasikan pada stack terletak di sebelah alamat kembali untuk fungsi yang di panggil.
Pada saat pemanggilan fungsi untuk pertama kali, stack frame akan terlihat seperti gambar 2.5.
Gambar 2.5 stack frame 12
Stack buffer overflow dieksploitasi oleh penyerang untuk mengeksekusi beberapa kode dalam proses yang berjalan di memori, hal itu dilakukan dengan menempatkan kode di buffer untuk memodifikasi return address (ret) agar menunjuk ke awal area dimana kode eksploit tersebut di letakkan, seperti yang terlihat pada gambar 2.6.
12 Jon Erickson. Op. Cit., h.9.
Pada saat return address dirubah penyerang, biasanya kode diarahkan untuk mengeksekusi shell di dalam memori, kode kemudian dieksekusi di dalam pemanggilan proses dan akan mewarisi seluruh struktur proses (pid,uid), inilah yang menjadi alasan mengapa program yang pemiliknya adalah root pengaturan set uid bit sangat penting, karena kode disisipkan kemudian akan dieksekusi dengan uid set ke root, maka penyerang akan mendapatkan root shell dan ini berarti bahwa penyerang akan mendapatkan kontrol penuh dari mesin target.
Gambar 2.6 stack buffer overflow untuk menjalankan shell code 13
13 Jun Xu dkk. Architecture Support for Defending Against Buffer Overflow Attacks. http:citeseer.nj.nec.com574758.html
2. Heap overflow
Ketika sebuah program mendapatkan jumlah data yang besar untuk diproses, bagian dari memori yaitu heap dialokasikan untuk menghandle data yang diload, jika data yang diload lebih besar dari heap memori, maka sistem dapat crash.
Heap overflow merupakan jenis buffer overflow yang terjadi pada tumpukan area data, heap overflow dieksploitasi dengan cara yang berbeda dengan stack buffer overflow. Memori di heap dialokasikan secara dinamis oleh aplikasi pada saat run- time.
Eksploitasi dilakukan dengan merusak data ini dalam cara yang spesifik untuk menyebabkan aplikasi untuk menimpa struktur internal seperti pointer linked list. Teknik tumpukan kanonik overflow menimpa keterkaitan alokasi memori dinamis (seperti metadata malloc) dan menggunakan pertukaran pointer untuk menimpa pointer fungsi program, gambar 2.7 dan gambar 2.8, merupakan contoh
sebelum dan sesudah terjadinya heap overflow. 14
Gambar 2.7 heap sebelum overflow
14 Robert vamosi, Ethical Hacking and Countermeasures, (E-Council, 2008), h. 18
Gambar 2.8 heap setelah overflow
3. Format string attack
Format string attack terjadi ketika input string dianggap perintah oleh program, dengan cara tersebut penyerang dapat mengeksekusi kode, membaca stack atau menyebabkan segmentation fault pada aplikasi yang dijalankan. Jika parameter format fungsi seperti x digunakan dengan tidak tepat, String dibaca dari sebuah sumber yang tidak dipercaya dan isinya dikendalikan oleh penyerang. Dengan termasuk format khusus seperti "n" dalam format string, penyerang dapat memodifikasi isi printf () untuk menulis ke lokasi memori sewenang-wenang.
Dibawah ini beberapa format parameter yang dapat digunakan dan konsekuensinya:
a. "x" membaca data dari stack
b. "s" membaca karakter string dari proses memori
c. "n" menulis sebuah integer ke lokasi di dalam proses memori Untuk menjaga aplikasi tersebut tidak rentan terhadap jenis serangan ini, maka perlu untuk memverifikasi format fungsi seperti pada tabel 2.1:
Tabel 2.1 Parameter yang umumnya digunakan untuk format string attack 15 Parameters
Output
Passed as
character (literal)
Reference
p
External representation of a pointer to void
Reference
d Decimal
Value
c Character
u
Unsigned decimal
Writes the number of characters into a pointer
References
Kerentanan ini berbeda dari kebanyakan yang ditemui, karena tidak diidentifikasi sebagai kerentanan sampai akhir 2000. Jenis kode ini sangat umum dalam program C, termasuk yang dengan catatan keamanan yang dinyatakan baik. Generasi programmer telah menggunakan sebagian kecil cara seperti ini, bukan yang tepat printf (" s", s). Ini dianggap sebuah trik berbahaya untuk menghindari mengetik l karakter tambahan.
Bug ini relatif mudah untuk ditemukan, bahkan melalui pemeriksaan manual pada kode sumber. Kasus yang membuat deteksi lebih rumit adalah ketika program menggunakan fungsi format kustom sebagai pembungkus sekitar printf(). Hal ini sering dilakukan dalam fungsi debugging dan logging, yang perlu mencetak
15 OWASP ASDR: The Application Security Desk Reference. (OWASP Foundation). H.84 15 OWASP ASDR: The Application Security Desk Reference. (OWASP Foundation). H.84
4. Array index error
Integer dibaca dari sebuah sumber yang tidak dipercaya dan nilainya dikendalikan oleh penyerang. Program ini memvalidasi integer dengan memastikan itu kurang dari ukuran array dan kemudian menggunakannya sebagai indeks array. Penyerang dapat memasukkan nilai negatif, sebuah indeks array negatif memberikan penyerang kemampuan untuk menulis ke lokasi memori yang sewenang-wenang, asalkan memiliki alamat memori lebih rendah dari array.
C. Secure Programming
Karena buffer overflow merupakan kerentanan yang serius dalam keamanan komputer, banyak ilmuwan komputer telah bekerja untuk memcahkan masalah tersebut. Beberapa cara untuk mengantisipasi kerentanan buffer overflow yaitu:
1. Menetapkan Gaya Pengkodean
Pada pengembangan perangkat lunak yang dikerjakan secara berkelompok, perlu adanya penetapan gaya koding untuk mendapatkan kode akhir yang konsisten dan sederhana, sehingga memudahkan pada saat pengecekan kesalahan koding.
2. Input Validation
Beberapa input datangnya dari user, sehingga input tersebut harus divalidasi sebelum digunakan yaitu menolak input yang tidak sesuai dengan yang didefinisikan. Berikut ini hal – hal yang dilakukan untuk memvalidasi: Beberapa input datangnya dari user, sehingga input tersebut harus divalidasi sebelum digunakan yaitu menolak input yang tidak sesuai dengan yang didefinisikan. Berikut ini hal – hal yang dilakukan untuk memvalidasi:
Input yang datang dari luar tidak dipercaya aman,sehingga perlu dilakukan otentikasi sebelum input diterima.
b. Membatasi Nilai Maksimum dan Minimum.
Ketika input data tidak dibatasi maksimum dan minimumnya, maka dapat menyebabkan kesalahan dalam proses nilai yang diinputkan, nilai yang didefinisikan sebagai bilangan bulat positif dapat menjadi negatif ketika melewati batas maksimum tipe datanya.
3. Buffer Non-Executable
Konsepnya adalah membuat segmen data sebuah program tidak dapat dieksekusi (non-executable). Dengan menjadikannya tidak dapat dieksekusi maka dapat menyulitkan bagi penyerang untuk mengeksekusi kode yang mereka masukkan ke buffer input program korban.
Cara ini digunakan pada sistem operasi komputer lama, tetapi pada sistem operasi UNIX dan MS Windows teknik ini tidak digunakan, karena keduanya tergantung pada kemampuan memasukkan kode dinamis ke dalam segemen data program untuk mendukung berbagai optimisasi kinerja.
4. Array Bounds Checking
Meskipun memasukkan kode adalah sebuah tindakan opsional bagi serangan buffer overflow, pengkorupsian aliran kendali merupakan hal yang penting. Dengan menggunkan metode array bound checking akan menghentikan vulnerability dan serangan buffer overflow. Jika sebuah array tidak dapat dioverflow, maka array Meskipun memasukkan kode adalah sebuah tindakan opsional bagi serangan buffer overflow, pengkorupsian aliran kendali merupakan hal yang penting. Dengan menggunkan metode array bound checking akan menghentikan vulnerability dan serangan buffer overflow. Jika sebuah array tidak dapat dioverflow, maka array
Untuk mengimplementasikan metode ini, semua pembacaan dan penulisan ke array harus diperiksa untuk memastikan bahwa mereka tidak melampaui batasan array.
5. Code Pointer Integrity Checking
Tujuan dari metode ini agak berbeda dengan bounds checking. Code pointer integrity checking berusaha mencegah perubahan kode pointer, metode tersebut berusaha mendeteksi bahwa sebuah kode pointer telah dirubah sebelum ia dideferensikan. Jadi meskipun penyerang sukses dalam merubah kode pointer, kode pointer yang terubah tidak akan digunakan karena perubahan terdeteksi setiap saat sebelum digunakan.
D. Kajian Pustaka
Pendeteksian buffer overflow dapat dilakukan dengan metode binary scanning yaitu dengan mengkompile kode program menjadi binary kemudian mendissassembler binary untuk selanjutnya memeriksa hasil dissassembler
tersebut 16 . Pendeteksian dengan metode tersebut melakukan pendeteksian pada kode biner dan digunakan pada saat kode program selesai dikompile.
Jiang Zheng dari Universitas Pittsburgh membahas teknik pencegahan buffer overflow dengan menggunakan analisis kode statis dan analisis kode dinamis melalui pendekatan automatic signature generation dan pendekatan automatic patch
16 Terry Bruce Gillette. 2002. A Unique Examination of the Buffer Overflow Condition. h.4 16 Terry Bruce Gillette. 2002. A Unique Examination of the Buffer Overflow Condition. h.4
memberikan informasi mengenai ukuran buffer tujuan, analisis perulangan digunakan untuk menginformasikan jumlah data yang diimplementasikan programmer kedalam prosedur, analisis input digunakan untuk mengetahui bagaimana keterkaitan antara input dari pengguna dengan ukuran buffer tujuan dan jumlah data yang ditulis.
Dalam penelitian ini dibahas pencegahan buffer overflow dengan menggunakan analisis kode statis, pendeteksi buffer overflow dalam bentuk text editor yang menampilkan informasi jika terdapat kerentanan yang memungkinkan terjadinya buffer overflow dalam kode program.
17 Jiang Zheng. 2008. Buffer Overflow Vulnerability Diagnosis for Commodity Software. h. 8
BAB III METODE PENELITIAN
A. Gambaran Umum Penelitian
Pada penelitian ini yang diteliti adalah kerentanan source code program yang dapat mengakibatkan terjadinya buffer overflow.
B. Metode Penelitian
1. Library research atau penelitian kepustakaan yaitu cara mengumpulkan data dengan jalan mempelajari literatur, artikel, buku ataupun kepustakaan lainnya serta mengutip pendapat-pendapat para ahli dari buku-buku bacaan yang ada kaitannya dengan pembahasan penelitian ini.
melakukan penelitian secara langsung untuk memperoleh data yang di butuhkan. Dalam hal ini penulis menggunakan metode observasi , yaitu pengamatan langsung ke objek penelitian guna memperoleh data atau gambaran serta keterangan yang terkait dengan penelitian ini.
C. Jenis Penelitian
Dalam penelitian ini, jenis penelitian yang digunakan adalah penelitian kualitatif. Penelitian kualitatif dilakukan untuk mengetahui apakah sistem yang didesain dapat digunakan untuk mencegah buffer overflow atau tidak.
D. Tahapan Penelitian
Tahapan yang dilakukan dalam kegiatan penelitian :
1. Pengumpulan Data Mengumpulkan data-data yang diperlukan untuk merancang dan membangun sistem dengan menggunakan teknik pengumpulan data yang telah dijelaskan sebelumnya.
2. Pengolahan dan analisis data
Pengolahan dan analisis data yang dilakukan dengan menggunakan data-data yang diperoleh dari proses pengumpulan data.
3. Perancangan
Dilakukan perancangan aplikasi, perancangan input, perancangan output.
4. Implementasi dan pengujian
kemudian dilakukan
pengimplementasian, kemudian program akan dicoba dengan teknik black box yaitu dengan menguji kebenaran sistem pendeteksi, cara pengujiannya yaitu memasukkan rancangan input yang terdiri dari source code aman dan source code yang rentan kedalam program kemudian akan ditampilkan informasi dari kode sumber yang rentan terhadap buffer overflow.
BAB IV PERANCANGAN SISTEM
A. Rancangan Pendeteksi Buffer Overflow
Dalam proses pembuatan perangkat lunak, perancangan ini menambahkan security knowledge di dalamnya yaitu metode untuk menghindari beberapa kesalahan dalam penulisan kode program serta penggunaan library, flowchart perancangan pendeteksi buffer overflow tersebut terlihat pada gambar 4.1.
start
Source code program
Peringatan buffer overflow
If terdeteksi memungkinkan buffer
overflow
Y
T stop
Gambar 4.1 Flowchart perancangan pendeteksi buffer overflow
Perancangan pendeteksi buffer overflow pada gambar 4.1 terdiri dari tiga bagian
yaitu:
1. Source code
Source code berupa kode program C+ yang dijadikan sebagai data untuk dideteksi dengan menggunakan pendeteksi ini, selanjutnya source code kemudian diproses oleh pendeteksi buffer overflow.
2. Pendeteksi Buffer Overflow
Pendeteksi ini bekerja dengan menggunakan metode analisis leksikal untuk mendeteksi buffer overflow yaitu dengan mencari fungsi-fungsi berbahaya yang terdapat dalam source code, pendeteksi ini juga mendeteksi kerentanan dalam penggunaan array yang dapat melewati batas ukuran array.
3. Peringatan Buffer Overflow
Peringatan ini merupakan hasil dari pendeteksi buffer overflow yang akan muncul jika kode program rentan terhadap buffer overflow, selain menampilkan peringatan letak kode program yang rawan buffer overflow, akan ditampilkan juga solusi yang berupa fungsi-fungsi alternatif yang tidak rentan buffer overflow dalam bahasa CC++.
B. Rancangan Aplikasi
Beberapa kompiler C+ menyediakan teks editor sebagai tempat untuk menulis kode program yang akan dikompile dan dieksekusi. Pada saat kode program dikompile, maka akan muncul peringatan jika di dalam kode program masih ada kesalahan sintaks, proses kompiler tersebut terlihat pada gambar 4.2 .
start
Source code program
Peringatan error
Kompiler (pendeteksi sintaks error) Y
Gambar 4.2 Proses kompilasi kode program
Perbandingan cara kerja pendeteksi buffer overflow dengan cara kerja kompiler yaitu kompiler mendeteksi kesalahan sintaks kemudian menampilkan pesan dan letak error dari source code, sedangkan pendeteksi buffer overflow bekerja dengan cara mendeteksi kerentanan yang memungkinkan terjadinya buffer overflow dengan menampilkan pesan atau solusi dari source code.
Flowchart aplikasi text editor yang dirancang terdiri dari beberapa menu dalam form utama. Form utama merupakan form yang pertama muncul pada saat aplikasi dibuka, rancangan form utama terlihat pada gambar 4.3, form utama terdiri dari:
1. Menubar Menu dalam menubar merupakan kumpulan perintah yang dapat digunakan untuk bekerja di editor.
2. Toolbar Toolbar berisi subset dari perintah yang ada dalam menubar
3. Display area Display area berisi file yang akan diedit
4. Statusbar Statusbar berisi tentang informasi serta posisi kursor dari file yang sedang aktif.
5. Side pane Side pane berisi list dari dokumen dalam direktori yang aktif.
6. Bottom pane Bottom pane berisi informasi hasil dari aksi terhadap file yang aktif.
Menubar yang merupakan kumpulan perintah terdiri dari beberapa menu
yaitu:
a. Menu file
Untuk membuat dokumen baru dipilih new, sehingga aplikasi menampilkan dokumen baru di window teks editor. Untuk membuka file dipilih open sehingga menampilkan open dialog yang berisi list file dalam path yang dibuka. Aplikasi merekam path dan nama file dari lima file yang terakhir dibuka untuk disimpan dalam recent document. Rancangan menu file terlihat pada gambar 4.4.
start
File Edit
View Search Tools Documents Help
If file
Menu file
YT
If edit
Menu edit
YT
If view
Menu view
If search
Menu search
If tools
Menu tools
Y
If documents
Menu documents
YT
If help
Menu help
YTT
If exit Y
Stop
Gambar 4.3 Flowchart form utama Gambar 4.3 Flowchart form utama
Menu file
If new
New file
T
If open
Open file
If save
Save
Y
If save as
Save as
T
Y
If revert
Revert
If print preview
Print preview
T
Y
If print
If recent document
Recent document
T
Y
If close
Gambar 4.4 Flowchart menu file Gambar 4.4 Flowchart menu file
Menu edit yaitu menu yang terdiri dari beberapa perintah yang berkaitan dengan perubahan file. Rancangan menu edit terlihat pada gambar
4.5 yang terdiri dari perintah undo, redo, cut, copy, paste, select all, dan preferences. Preferences merupakan perintah yang mengatur tab, auto save, dan auto indent.
start
Menu edit
If undo
Undo
T
If redo
If copy
If paste
Paste
If delete
If select all
Select all
T
Y
If preferences
Gambar 4.5 Flowchart menu edit Gambar 4.5 Flowchart menu edit
Menu view berisi perintah yang berkaitan dengan tampilan dalam aplikasi, yang terdiri dari toolbar, statusbar, sidepane, buttonpane, full screen, dan highlight mode. Sintaks dengan mode highlight membuat kode program lebih gampang dibaca yaitu dengan warna yang berbeda pada kode program yang terlihat berbeda antara komentar, variabel, dengan pemilihan warna yang dapat disesuaikan dengan daftar warna yang disediakan aplikasi. Rancangan menu view terlihat pada gambar 4.6.
start
Menu view
If toolbar
Toolbar
T
If statusbar
Statusbar
If sidepane
Sidepane
Y
If buttonpane
If fullscreen
fullscreen
If highlight mode
Highlight mode
Gambar 4.6 Flowchart menu view Gambar 4.6 Flowchart menu view
Menu search berisi perintah yang berkaitan dengan proses pencarian teks dalam dokumen, isi menu search yaitu: find, find next, find previous, incremental search, replace, clear highlight, dan goto line. Dalam menu ini terdapat dua cara untuk melakukan pencarian yaitu dengan mengetikkan teks yang akan dicari didalam form dialog, atau dengan melakukan pencarian incremental yang mencocokkan highlight teks yang diketikkan. Rancangan menu search terlihat pada gambar 4.7.
start
Menu search
If find
Find
T
If find next
Find next
If find previous
Find previous
Y
If incremental search
Incremental search
T
Y
If replace
Replace
highlight If clear
Clear highlight
T
Y
If goto line
Goto line
Gambar 4.7 Flowchart menu search Gambar 4.7 Flowchart menu search
Menu tools berisi perintah untuk mendeteksi kemungkinan terjadinya buffer overflow dalam kode program, pendeteksian dapat dilakukan pada file yang sedang aktif atau untuk mendeteksi seluruh isi directori dari file yang sedang aktif. Menu tools juga berisi perintah untuk mengkompile kode program dengan menggunakan gcc sebagai kompilernya. Rancangan menu tools terlihat pada gambar 4.8.
start
Menu tools
If external tools
current file If detect
Detect current file
If detect all file
Detect all file
Y
If compile
If manage
Manage external
external tools
Gambar 4.8 Flowchart menu tools Gambar 4.8 Flowchart menu tools
Dalam menu ini terdapat perintah yang dapat digunakan untuk menyimpan seluruh dokumen yang terbuka, ataupun dapat digunakan untuk menutup seluruh dokumen yang ada dalam editor. Rancangan menu documents terlihat pada gambar 4.9.
start
Menu documents
If save all
Save all
T
If close all
Close all
If previous
document
Previous document
Y
If next document
Next document
T
Y
If move to new
window
Move to new window
If opened document
Opened document
T
Y Return
Gambar 4.9 Flowchart menu documents Gambar 4.9 Flowchart menu documents
Menu help berisi perintah contents dan about, perintah contents merupakan perintah yang menampilkan perintah dasar bahasa C, rancangan menu help terlihat pada gambar 4.10.
start
Menu help
If contents
Contents
YT
If about
Gambar 4.10 flowchart menu help
Aplikasi yang dirancang berupa teks editor yang memiliki
fungsi untuk membaca source code yang diinput dan mendeteksi kemungkinan terjadinya buffer overflow, rancangan teks editor tersebut terlihat pada gambar 4.11.
Gambar 4.11 Rancangan teks editor pendeteksi buffer overflow
C. Rancangan Input
Input dirancang dengan menyiapkan source code yang rentan dan tidak rentan terhadap buffer overflow.
1. abo1.c
abo1.c
specially crafted to feed your brain by gera
Dumb example to let you get introduced...
int main(int argv,char argc) {
char buf[256];
strcpy(buf,argc[1]);
Pada kode program abo1.c dideklarasikan buffer sebesar 256 byte dengan tipe data char, kemudian perintah strcpy melakukan pengkopian string dari system kedalam buffer yang sebesar 256 byte.
2. abo2.c
abo2.c
specially crafted to feed your brain by geracore-sdi.com
This is a tricky example to make you think and give you some help on the next one
int main(int argv,char argc) {
char buf[256];
strcpy(buf,argc[1]); exit(1);
Pada kode program abo2.c dideklarasikan buffer sebesar 256 byte dengan tipe data char, kemudian perintah strcpy melakukan pengkopian string dari system kedalam buffer yang sebesar 256 byte, perintah selanjutnya yaitu exit(1), yang merupakan perintah untuk keluar dari program.
3. abo3.c
abo3.c
specially crafted to feed your brain by geracore-sdi.com
This'll prepare you for The Next Step
int main(int argv,char argc) {
extern system,puts; void (fn)(char)=(void()(char))system; char buf[256];
fn=(void()(char))puts; strcpy(buf,argc[1]); fn(argc[2]); exit(1);
Pada kode program abo3.c digunakan dua string sebagai argumen, string pertama mengkopi kedalam buffer sedangkan string kedua melakukan pencetakan ke standar output.
4. abo4.c
abo4.c
specially crafted to feed your brain by geracore-sdi.com
After this one, the next is just an Eureka! away
extern system,puts; void (fn)(char)=(void()(char))system;
int main(int argv,char argc) {
char pbuf=malloc(strlen(argc[2])+1); char buf[256];
fn=(void()(char))puts; strcpy(buf,argc[1]); strcpy(pbuf,argc[2]); fn(argc[3]); while(1);
Pada kode program abo4.c dideklarasikan fungsi system dan puts, kemudian pendeklarasian pbuf sebagai buffer dinamis, dan buf dengan data sebesar 256 byte. Selanjutnya dilakukan pengkopian data dari argc[1] ke variabel buf, kemudian pengkopian isi argc[2] ke variabel pbuf.
5. vulnerable_1.c
I am a vulnerable thing. include
Pada kode program vulnerable_1.c dideklarasikan buffer sebesar 1000 byte dengan tipe data char, kemudian perintah strcpy melakukan pengkopian string dari Pada kode program vulnerable_1.c dideklarasikan buffer sebesar 1000 byte dengan tipe data char, kemudian perintah strcpy melakukan pengkopian string dari
6. notvulnerable_1.c
I am a vulnerable thing. include
Pada kode program vulnerable_1.c dideklarasikan buffer sebesar 1000 byte dengan tipe data char, kemudian perintah strncpy melakukan pengkopian string dari variabel input yang disesuaikan dengan besar buffer kedalam buffer yang sebesar 1000 byte, selanjutnya pada fungsi main dilakukan pemanggilan fungsi evilfunction dengan parameter berupa input dari sistem.
D. Rancangan Output
Setelah penginputan, maka input akan diproses untuk menampilkan output berupa pesan peringatan yang akan menampilkan sebagai berikut:
1. Nomor kode program
2. Pesan peringatan
3. Solusi
4. Jumlah kode program
5. Waktu yang digunakan untuk pendeteksian
6. Level kerentanan (rentang nilai 1-5)
BAB V IMPLEMENTASI DAN PENGUJIAN SISTEM
Pada bab ini dibahas mengenai implementasi dan pengujian sistem, implementasi sistem dilakukan dengan memasukkan kode rentan untuk pendeteksian buffer overflow, setelah diimplementasikan, sistem akan diuji yaitu dengan melakukan tes terhadap source code yang diinputkan.
A. Implementasi Pendeteksi Buffer Overflow
Sistem diimplementasikan dengan menggunakan rancangan input yang telah di rancang pada bab IV.
1. abo1.c
Gambar 5.1 Tampilan pendeteksian untuk file abo1.c
Pada kode program abo1.c, kerentanan terletak pada baris kode ke 9 yaitu pada penggunaan fungsi strcpy, fungsi ini tidak membatasi input pengguna yaitu melewatkan semua data dari string sumber ke string tujuan. Jika data melebihi dari 256 maka akan menimpa register disebelahnya, bahkan bisa menimpa alamat kembali dari fungsi pada stack.
Gambar 5.2 Input data 264 byte ke abo1
Pada gambar 5.2 terlihat bahwa jika program diinputkan dengan data lebih besar 256 maka menyebabkan register disebelahnya tertimpa, dan pada saat diinputkan data sebesar 264, maka akan menimpa alamat kembali dari fungsi. Pada saat diinputkan A sebanyak 264, dan pada gambar 5.3 terlihat diregister karakter A (x41) menimpa alamat kembali (eip).
Gambar 5.3 Tampilan di register abo1
Gambar 5.4 Eksploit untuk abo1
Jadi penyerang dapat memasukkan shellcode kedalam program kemudian merubah alamat kembali untuk menunjuk kealamat shellcodenya Jadi penyerang dapat memasukkan shellcode kedalam program kemudian merubah alamat kembali untuk menunjuk kealamat shellcodenya
2. abo2.c
Gambar 5.5 Tampilan pendeteksian untuk file abo2.c
Ketika program diinput data sebesar 264 byte yang menimpa return address, tidak ada pesan segmentation fault yang muncul, hal itu disebabkan karena setelah fungsi strcpy ada fungsi exit yang dipanggil seperti terlihat pada gambar 5.6.
Gambar 5.6 Input data 264 byte ke abo2
walaupun tidak ada instruksi setelah fungsi exit dipanggil, namun penyerang dapat memasukkan panjang string yang dapat memenuhi seluruh stack.
Pada abo3.c terdapat 2 string sebagai argumen, yang pertama mengkopi kedalam buffer dan yang kedua menampilkan ke standar output. Pada program abo2 jika data lebih besar dari 256 byte, maka program tetap keluar karena adanya fungsi exit, namun pada program abo3 muncul pesan kesalahan segmentation fault seperti terlihat pada gambar 5.8.
3. abo3.c
Gambar 5.7 Tampilan pendeteksian untuk file abo3.c
Gambar 5.8 Input data 264 byte ke abo3
Gambar 5.9 Letak address fungsi fn()
Segementation fault muncul disebabkan karena alamat fungsi fn() dimasukkan kedalam stack sebelum buf[256] dapat ditimpa dan dieksekusi pada alamat 0x08048493 sebelum exit(). Seperti terlihat pada gambar 5.9 letak buf[256] yang berdekatan dengan letak alamat fungsi fn().
Program abo4 hampir sama dengan abo3, yang membedakan adalah alamat fungsi fn() tidak terletak pada stack, tetapi alamat terletak pada bagian .data, seperti terlihat pada gambar 5.11.
4. abo4.c