Wednesday 23 December 2009

memory

A Note Book in Computer Security

* Home
* About
* Book List
* Hacker Indonesia
* Tools List

Memahami Cara Kerja Memori Komputer Sebagai Dasar Memahami Teknik Eksploitasi 2/2
September 14th, 2008 | by admin |
Table of contents for Cara Kerja Memori

1. Memahami Cara Kerja Memori Komputer Sebagai Dasar Memahami Teknik Eksploitasi 1/2
2. Memahami Cara Kerja Memori Komputer Sebagai Dasar Memahami Teknik Eksploitasi 2/2

Kita akan melanjutkan pembahasan mengenai memori. Kali ini pembahasan akan lebih difokuskan kepada segmentasi dalam memori terutama pada bagian stack.

Segmen Dalam Memory

Memori program terbagi atas 5 segmen: text, data, bss, heap, dan stack. Masing-masing segmen mempunyai tempat yang khusus dalam memori untuk mencapai tujuan yang khusus.

Segmen Text

Segmen text juga disebut segmen code. Di segmen ini disimpan instruksi bahasa mesin hasil kompilasi dari bahasa asembli. Eksekusi instruksi dalam segmen ini dilakukan secara non-linear. Pada saat program dieksekusi, EIP diset ke instruksi pertama pada segmen text. Processor kemudian mengikuti aturan loop seperti di bawah ini dalam mengeksekusi program:

1. Baca instruksi di alamat yang ditunjukkan oleh EIP (instruksi pertama pada awal eksekusi)
2. Tambahkan sejumlah byte instruksi yang dibaca ke EIP (defaultnya adalah EIP adalah linear walaupun dalam kenyataan tidak selalu demikian )
3. Eksekusi instruksi yang dibaca pada step 1
4. Kembali ke step 1

Kadang, instruksi yang dieksekusi merupakan instruksi “jump” atau “call” yang mengubah EIP ke alamat memori yang berbeda. Jadi jika EIP berubah pada step 3, processor tetap akan kembali ke step 1 dan membaca apa pun instruksi yang ada di alamat baru tersebut.

Segmen ini tidak dapat ditulisi karena hanya berisi kode-kode program. Hal ini mencegah orang mengubah kode program selama program berjalan. Ketika segmen ini dicoba untuk ditulisi, maka program akan memberikan peringatan kepada user dan program akan berhenti. Perlu dicatat juga bahwa segmen memori ini mempunyai ukuran yang tetap.

Segmen Data dan BSS

Segmen data dan bss digunakan untuk menyimpan variabel program yang bersifat global atau statis. Segmen data diisi dengan variabel global, string, dan konstanta lain yang sudah diinisialisasi yang digunakan di keseluruhan program. Sedangkan segmen bss diisi dengan variabel yang belum diinisialisasi. Walaupun segmen ini dapat ditulisi, pada dasarnya ukurannya juga tidak berubah.

Segmen Heap

Segmen heap digunakan untuk variabel program lainnya. Satu hal yang perlu dicatat adalah ukuran segmen heap ini dapat berubah sesuai dengan kebutuhan. Heap akan bertambah atau menyusut sesuai dengan jumlah memori yang dipergunakan di dalam program yang sedang berjalan. Pertumbuhan heap bergerak dari alamat memori yang kecil menuju yang besar.

Segmen Stack

Sama seperti heap, stack juga mempunyai ukuran memori yang berubah-ubah sesuai dengan jumlah ruang yang dipergunakan. Stack dipergunakan untuk menyimpan konteks sementara pada saat pemanggilan fungsi (function calls). Pada saat program memanggil fungsi lain, fungsi tersebut akan diberikan satu set variabel yang diperlukan. Fungsi itu sendiri berada di lokasi yang berbeda pada segmen text/code. Karena konteks dan nilai EIP berubah pada saat fungsi dipanggil, stack digunakan untuk mengingat semua variabel yang diserahkan kepada fungsi, dan juga ke mana EIP akan dikembalikan setelah fungsi selesai dieksekusi.

Segmen stack pada memori memiliki struktur FILO (First In Last Out), yang berarti data yang pertama kali dimasukkan ke dalam memori ini akan menjadi data yang terakhir kali dikeluarkan. Seperti dijelaskan sebelumnya, register ESP digunakan untuk menjajaki ujung akhir (data yang terakhir masuk) dari alamat memori pada Stack. Pada saat fungsi dipanggil, beberapa hal dimasukkan ke dalam stack bersama-sama dalam suatu struktur yang dinamakan stack frame. EBP register dipergunakan untuk membuat referensi terhadap Stack Frame yang sedang dipergunakan. Setiap Stack Frame berisi parameter-parameter terhadap fungsi tersebut, variabel lokal fungsi tersebut, serta dua pointer yang diperlukan untuk mengembalikan segala sesuatunya seperti semula setelah fungsi selesai dijalankan. Kedua pointer ini adalah Saved Frame Pointer (SFP) dan Return Address (RA). SFP berguna untuk mengembalikan nilai EBP ke kondisi awal sebelum fungsi dijalankan. Sedangkan RA digunakan untuk mengembalikan EIP ke instruksi berikutnya setelah fungsi dijalankan.

Ada baiknya kita menggunakan 2 fungsi berikut untuk menjelaskan cara kerja Stack:

void test_function (int a, int b, char c){
char flag;
char buffer[10];
}

void main () {
test_function(1,2,’a');
}

Di permulaan program ini, fungsi test_function yang memerlukan 3 parameter yang dideklarasikan sebagai integer (a dan b) serta satu character (c). Kemudian, fungsi ini juga memiliki variabel lokal yang dideklarasikan sebagai character (flag) dan satu larik character (buffer). Pada saat program berjalan pertama kali, maka fungsi main akan dieksekusi yang kemudian akan memanggil fungsi test_function.

Pada saat fungsi test_function dipanggil, ada beberapa nilai yang dimasukkan ke dalam Stack untuk membuat Stack Frame. Dalam Stack, data dimasukkan secara terbalik. Data 1,2, dan ‘a’ akan dimasukkan dengan posisi ‘a’, 2, 1. Parameter ini dinyatakan dengan variabel c, b, dan a pada test_function.

Ketika instruksi “call” dari bahasa assembly dieksekusi, konteks eksekusi program akan berpindah dari fungsi main ke fungsi test_function, karena itu alamat si pemanggil (main) perlu dimasukkan ke dalam stack. Alamat ini merupakan alamat berikutnya dari EIP, atau alamat yang ditemukan pada step 3 dari eksekusi loop pada segmen text yang sudah dijelaskan di atas. Setelah memasukkan alamat pemanggil (return address) ini, maka dimasukkan nilai Saved Frame Pointer (SFP) yaitu nilai EBP pada saat ini. Ini dilakukan untuk mengembalikan posisi stack ke kondisi sebelumnya setelah eksekusi test_function selesai. Kemudian nilai EBP diperbaharui dengan nilai Frame Pointer yang terbaru. Setelah itu, barulah variabel lokal pada fungsi test_function dimasukkan ke dalam Stack dengan menggunakan nilai ESP (Extended Stack Pointer) sebagai patokan.

stack position

Pada saat fungsi dipanggil, EIP akan berpindah menunjukkan ke alamat permulaan dari instruksi dari fungsi tersebut yang tersimpan di segmen Text. Memori pada Stackdigunakan untuk menyimpan variabel lokal dan argumen atau parameter fungsi tersebut. Ketika program sudah selesai dieksekusi, seluruh Frame Stack akan dikeluarkan dari Stack dan EIP diset kepada alamat pemanggil (return address) agar program dapat melanjutkan kerjanya. Jika dalam fungsi tersebut dipanggil fungsi lain, maka Frame Stack yang baru akan dimasukkan ke dalam Stack dan begitu seterusnya. Dan begitu fungsi ini selesai, maka Frame Stacknya dikeluarkan dari Stack dan pengeksekusian dikembalikan ke fungsi sebelumnya. Inilah mengapa segmen dalam memori ini diorganisasikan sebagai FILO (First In Last Out) struktur data.

0 comments:

Blog oleh : endrayudi yoecos computer