Ini tidak berlaku untuk "hampir semua OS". Jenis area memori yang diwakili cukup tipikal, tetapi tidak ada alasan mengapa mereka harus dalam urutan tertentu, dan mungkin ada lebih dari satu bagian dari jenis yang diberikan.
Di Linux, Anda bisa melihat pada ruang alamat proses dengan cat /proc/$pid/maps
mana $pid
adalah ID proses, misalnya cat /proc/$$/maps
untuk melihat shell Anda menjalankan cat
dari, atau cat /proc/self/maps
untuk melihat pada cat
pemetaan proses sendiri. Perintah pmap
menghasilkan output yang sedikit lebih bagus.
08048000-08054000 r-xp 00000000 08:01 828061 /bin/cat
08054000-08055000 r--p 0000b000 08:01 828061 /bin/cat
08055000-08056000 rw-p 0000c000 08:01 828061 /bin/cat
08c7f000-08ca0000 rw-p 00000000 00:00 0 [heap]
b755a000-b7599000 r--p 00000000 08:01 273200 /usr/lib/locale/en_US.utf8/LC_CTYPE
b7599000-b759a000 rw-p 00000000 00:00 0
b759a000-b76ed000 r-xp 00000000 08:01 269273 /lib/tls/i686/cmov/libc-2.11.1.so
b76ed000-b76ee000 ---p 00153000 08:01 269273 /lib/tls/i686/cmov/libc-2.11.1.so
b76ee000-b76f0000 r--p 00153000 08:01 269273 /lib/tls/i686/cmov/libc-2.11.1.so
b76f0000-b76f1000 rw-p 00155000 08:01 269273 /lib/tls/i686/cmov/libc-2.11.1.so
b76f1000-b76f4000 rw-p 00000000 00:00 0
b770b000-b7712000 r--s 00000000 08:01 271618 /usr/lib/gconv/gconv-modules.cache
b7712000-b7714000 rw-p 00000000 00:00 0
b7714000-b7715000 r-xp 00000000 00:00 0 [vdso]
b7715000-b7730000 r-xp 00000000 08:01 263049 /lib/ld-2.11.1.so
b7730000-b7731000 r--p 0001a000 08:01 263049 /lib/ld-2.11.1.so
b7731000-b7732000 rw-p 0001b000 08:01 263049 /lib/ld-2.11.1.so
bfbec000-bfc01000 rw-p 00000000 00:00 0 [stack]
Anda dapat melihat kode dan data baca-tulis (teks dan BSS) dari executable, lalu heap, lalu file yang dipetakan memori, lalu sedikit lebih banyak baca-tulis data, lalu kode, data baca-saja dan baca- tulis data dari pustaka bersama (teks dan BSS lagi), lebih banyak baca-tulis data, pustaka bersama lainnya (lebih tepatnya, penghubung dinamis), dan akhirnya tumpukan utas satu-satunya.
Kode kernel menggunakan rentang alamatnya sendiri. Pada banyak platform, Linux menggunakan bagian atas ruang alamat untuk kernel, seringkali bagian atas 1GB. Idealnya, ruang ini cukup untuk memetakan kode kernel, data kernel, dan memori sistem (RAM) dan setiap perangkat yang dipetakan memori. Pada PC 32-bit biasa saat ini, ini tidak mungkin, yang memerlukan liuk yang hanya menarik bagi peretas kernel.
Ketika kode kernel menangani panggilan sistem, idealnya (ketika contortions yang disebutkan sebelumnya tidak ada di tempat) memori proses dipetakan pada alamat yang sama. Ini memungkinkan proses untuk mengirimkan data ke kernel, dan kernel dapat membaca dari pointer secara langsung. Ini bukan keuntungan besar, karena pointer tetap perlu divalidasi (sehingga proses tidak dapat menipu kernel untuk membaca dari memori yang proses tidak seharusnya memiliki akses ke).
Zona memori di dalam ruang kernel Linux cukup kompleks. Ada beberapa kumpulan memori yang berbeda, dan perbedaan utama bukan tentang dari mana memori itu berasal tetapi lebih kepada siapa itu dibagi. Jika Anda ingin tahu tentang mereka, mulailah dengan LDD3 .
where.c
, pada Ubuntu 11.04 menggunakangcc where.c -o where
; melaporkan "main di 0x80483c4".readelf -S where
Sudah mencoba , dan ini melaporkan, katakan "[13] .text PROGBITS 08048310 ..." yang terlihat benar? Meskipun saya juga mendapatkan "ac di 0xbfb035a0" dan "lokal di 0xbfb0358c", dan rentang alamat (0xbf ...) tampaknya tidak dilaporkan olehreadelf -S
.ac
danav
dan variabel otomatislocal
mungkin akan memiliki alamat yang berbeda pada setiap permintaan. Sebagian besar kernel Linux modern memiliki "Address Space Layout Randomization" untuk membuat eksploitasi buffer overflows lebih sulit.