Jenis-Jenis Buffer Overflow : Stack-Based

September 26th, 2008 | by admin |

Table of contents for Buffer Overflow

  1. Memahami Buffer Overflow
  2. Jenis-Jenis Buffer Overflow : Stack-Based

Mari kita tinjau kembali program yang mengandung resiko buffer overflow:

// program_name : overflow.c

void buffer_overflow (char *str) {
   char buffer[20];

   strcpy (buffer, str);   // Fungsi ini mengkopi str -> buffer
}

int main () {
   char mystring[128];
   int i;

   for (i=0; i<128; i++)
       mystring[i]=’A’;

   buffer_overflow(mystring);
}

Pada saat fungsi buffer_overflow() dipanggil dari fungsi main(), stack frame dibuat dan dimasukkan ke dalam Stack (lihat kembali penjelasan mengenai segmen memori).
Stack frame ini akan terlihat seperti gambar di bawah ini.

Ketika 128 byte data ini ditulis dalam 20-byte buffer, 108-byte dari data ini tidak tertampung di dalam buffer dan menimpa apa-apa yang ada di bawahnya: stack frame pointer, return address, dan parameter fungsi *str. Lalu setelah fungsi buffer_overflow() selesai dieksekusi, program akan kembali ke alamat yang ada di dalam return address tanpa mengetahui bahwa data di dalam memori ini sudah berubah menjadi 0×414141 (0×41 adalah nilai hexadecimal dari karakter ‘A’). EIP pergi ke 0×414141, yang merupakan sembarang alamat memuat instruksi yang invalid atau bahkan berada di luar ruang memori. Hal ini menyebabkan program error dan selesai. Inilah yang disebut dengan stack-based buffer overflow, karena overflownya terjadi di segmen stack dari memori.

Overflow juga dapat terjadi di segmen memori lainnya seperti heap dan bss. Tetapi, yang menyebabkan stack-based itu sangat menarik adalah karena di sini return address dapat ditulis ulang. Bayangkan bagaimana jika return address menunjuk pada suatu ruang dalam memori yang memuat program yang dibuat sebelumnya. Ceritanya semakin menarik bukan?

Pertanyaannya sekarang, bagaimana caranya memasukkan program khusus ke dalam memori untuk kemudian dieksekusi oleh EIP. Jawabannya adalah Injeksi Bytecode! Bytecode merupakan kumpulan dari kode assembly yang disusun sedemikian rupa sehingga dapat langsung dieksekusi dan dapat diinjeksikan ke dalam buffer. Ada beberapa batasan yang tidak boleh dilanggar oleh sebuah Bytecode, antara lain, tidak boleh ada null karena akan dianggap sebagai akhir dari buffer tempat program diinjeksikan tersebut.

Salah satu Bytecode yang terkenal adalah Shellcode. Shellcode adalah Bytecode yang meluncurkan shell. Jika program dengan suid root mengeksekusi shellcode ini, hacker dapat memiliki hak akses root. Bagaimana caranya? Itu akan kita bahas dalam artikel berikutnya.

Post a Comment