partner

Selasa, 24 November 2009

Pointer,MEMORI LEAK dan Fungsi Manajemen Memori dengan C


Permainan Pointer dan Memory dengan C

Kembali lagi bersama mywisdom, kali ini adalah artikel tentang permainan pointer dg bahasa c.Mohon maaf jika ada kesalahan maklum ane dah lama gak make c ini.

Pada tiap sistem operasi linux x86 menggunakan vma ( virtual memory address ) yang terdiri dari user space addressing dan kernel space addressing. Apakah pointer? pointer merupakan suatu variabel yang berisi alamat memory. Salah satu fungsi pointer jika digunakan dengan benar adalah untuk pengalokasian memori secara dinamis mencegah terjadinya memory leak.(pemborosan memori komputer).

- CONTOH DEKLARASI POINTER

sintaks untuk deklarasi pointer:

tipe_data *pointer;

misal:

/* pointer.c */
#include
int main()
{
void *pointer;
}


keterangan :

void pointer merupakan deklarasi pointer tanpa tipe data. Misal kita ingin mendeklarasikan pointer dengan tipe data integer:

/* int_pointer.c */
#include
int main()
{
int *pointer;
}

Untuk tipe 2 data di c silahkan cari di tutorial dasar2 pemrograman dengan c.

- MELIHAT ALAMAT POINTER DI MEMORI (POINTER DEREFERENCE)

Sintaks untuk dereference pointer:
*((int *) pointer)

contoh untuk pointer dereference:

#include
int main()
{
int *pointer;
printf("\nNilai pointer di memori adalah: %d\n",*((int *) pointer));
}


atau bisa juga secara langsung:
#include
int main()
{
int *pointer;
printf("\nNilai pointer di memori adalah: %d\n",*pointer);
}


keterangan: DEREFERENCE POINTER TIDAK BISA DILAKUKAN TANPA TIPE DATA (pointer void)

- NULL POINTER
Null pointer adalah pointer yang tidak menunjuk ke lokasi acak di memori (pointer ini menunjuk ke alamat memori standar 0)

sintaks dari penggunaan null pointer:
int *pointer=NULL;

contoh dereference pointer null:
/*null_pointer.c*/
#include
int main()
{
int *pointer=NULL;
printf("\nNilai pointer di memori adalah: %d\n",*((int *) pointer));
}

setelah dieksekusi ternyata hasilnya adalah segmentation fault karena kita tidak bisa begitu saja mengakses lokasi memori standar 0

- FUNGSI MALLOC (Memory Alocator)

sintaks:
void *malloc(size_t size);

Fungsi ini untuk mengalokasikan memori secara dinamis sejumlah size (perhatikan sintaks: *malloc(size_t size)) dari lokasi di memori komputer yang belum terpakai.

Fungsi ini bertujuan agara program yang kita buat dapat menggunakan memori secara efisien. Penggunaan malloc ini harus selalu diikuti oleh fungsi free() (untuk dealokasi memori agara tidak terjadi kebocoran memori yang di dunia hacking dikenal istilah bekenya dg nama memory leak))

contoh penggunaan malloc diikuti oleh fungsi free() untuk dealokasi memori:


/*malloc.c*/
#include
int main()
{
int *pointer;
pointer=(int*) malloc(sizeof(int));
free(pointer);
}


keterangan : untuk menggunakan fungsi malloc anda harus mengincludekan header file stdlib.h

BASIC OF A MEMORY LEAK EXPLOIT

Anda pernah dengar memory leak exploit??? apa sih memory leak itu? ok memori leak adalah pemborosan penggunaan memori di komputer karena suatu rutin dari program dg alokasi memori tanpa adanya dealokasi memori yang menyebabkan suatu lokasi memori yang telah dialokasi tidak dapat digunakan lagi karena sudah digunakan oleh program tadi (memory leak).

Berikut ini adalah salah satu contoh memory leak exploit yang akan mengalokasikan mem

/* basic memory leak exploit by mywisdom */
#include
int main()
{
int *pointer;
int i=0;
for (;;)
{
pointer=(int*) malloc(sizeof(int));
pointer=&i;
i++;
}
}

warning!!!
Saya tidak bertanggung jawab jika anda menjalankan exploit di atas

program di atas akan mengalokasikan memori secara terus menerus terlihat pada perulangan (loop infinite) ini
for (;;)
{

yang diikuti dengan rutin malloc
lalu mengisi pointer malloc dengan nilai alamat memori dari variabel i

keterangan : &i berisi alamat memori dari variabel i (bukan nilainya)

pointer=&i; -> pointer p dibuat untuk menunjuk ke alamat memori dari variabel i.



- Fungsi MMAP (Map Pages of Memory) -> Pemetaan Memori

sintaks mmap:
void *mmap(void *addr, size_t len, int prot, int flags,
int fildes, off_t off);

mmap merupakan suatu syscall yang digunakan untuk melakukan pemetaan dari suatu .section dari suatu file atau program ke virtual memori address (vma address (virtual memory address))

misal untuk melakukan mapping suatu file kita pertama taman melakukan syscall open()

int fd;

fd = open("file_dimap", O_RDWR);


- MMAP

penggunaan mmap biasa kita temui di banyak exploit untuk rooting sebelum melakukkan trigger bug, di mana umumnya exploit2 itu perlu melakukan map ke zero page
yang merupakan suatu lokasi memori kernel space (zero page memory), jika terjadi di user space tidak terlalu berbahaya tapi jika terjadi di
kernel space maka akan memungkinkan attacker untuk melakukan trigger terhadap bug yang memungkinkan sistem bisa diambil alih

contoh penggunaan mmap :

#include
#include
#include
#include
#include
#include
#include
#include

int main()
{
char *mem=NULL;

mem = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC, \
MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
}

keterangan:

PROT_EXEC -> data yang disusupkan di lokasi zero page memory bisa dieksekusi
PROT_WRITE -> data yang disusupkan di lokasi zero page memory bisa ditulisi
PROT_READ -> data yang disusupkan di lokasi zero page memory bisa dibaca


-BRK() dan SBRK()

sintaks:
int brk(void *addr);
void *sbrk(intptr_t incr);

Fungsi brk() dan sbrk() digunakan untuk menambah alokasi memori dari suatu proses

header file yg dibutuhkan : unistd.h

ok sekian dan akan saya lanjutkan dengan tutor lainya lain kali maaf gak dilanjut krn udah pegel hiks...

bonus memory leak sploit:
/* basic memory leak exploit by mywisdom */

#include
int main()
{
int *pointer;
int i=0;
for (;;)
{
pointer=(int*) malloc(sizeof(int));
pointer=&i;
i++;
}
}