mungkin terjadi.
Jelaskan bagaimana overflow tumpukan penyangga bekerja secara
rinci
Mendefinisikan shellcode dan menjelaskan penggunaannya dalam
Dalam bab ini kita mengalihkan perhatian khusus untuk serangan buffer
overflow. Ini jenis serangan adalah salah satu serangan yang paling umum terlihat
dan hasil dari ceroboh pemrograman dalam aplikasi. J melihat daftar kerentanan
nasihat dari organisasi seperti CERT atau SANS terus menyertakan sejumlah
besar buffer overflow atau tumpukan melimpah eksploitasi, termasuk sejumlah
serius, jarak jauh kerentanan dieksploitasi. Demikian pula, beberapa item dalam
CWE / SANS Top Daftar 25 Most Dangerous Kesalahan Software, kategori
Manajemen Sumber Daya Risky, yang penyangga varian overflow. Ini dapat
mengakibatkan eksploitasi untuk kedua sistem operasi dan aplikasi umum. Namun
jenis serangan telah dikenal sejak pertama banyak digunakan oleh Internet Worm
Morris pada tahun 1988, dan teknik untuk mencegah kejadiannya sudah dikenal
dan didokumentasikan. Tabel 10.1 memberikan sejarah singkat dari beberapa
insiden yang lebih penting dalam sejarah eksploitasi buffer overflow. Sayangnya,
karena kedua warisan kode kereta di operasi banyak digunakan sistem dan
aplikasi dan terus praktek pemrograman ceroboh oleh programmer, masih
merupakan sumber utama yang menjadi perhatian praktisi keamanan. Bab ini
berfokus pada bagaimana buffer overflow terjadi dan metode apa yang dapat
digunakan untuk mencegah.
Kita mulai dengan pengenalan dasar-dasar buffer overflow. Lalu kita
Rincian hadir klasik tumpukan buffer overflow. Ini termasuk diskusi tentang
bagaimana fungsi menyimpan variabel lokal mereka pada stack dan konsekuensi
dari mencoba untuk menyimpan lebih banyak data di dalamnya dari ada ruang
yang tersedia. Kita lanjutkan dengan gambaran tentang tujuan dan desain
shellcode, yang merupakan kode kustom disuntikkan oleh penyerang dan mana
kendali dialihkan sebagai akibat dari buffer meluap. Berikutnya kita
mempertimbangkan cara-cara membela terhadap serangan buffer overflow. Kami
mulai dengan pendekatan yang jelas untuk mencegah mereka dengan tidak
menulis kode yang rentan untuk buffer overflows di tempat pertama. Namun,
mengingat besar, tubuh yang ada kode kereta, kita juga perlu mempertimbangkan
mekanisme hardware dan software yang dapat mendeteksi dan menggagalkan
serangan buffer overflow. Ini termasuk mekanisme untuk melindungi ruang
alamat executable, teknik untuk mendeteksi tumpukan modifikasi, dan pendekatan
yang mengacak tata letak ruang alamat untuk menghambat keberhasilan
pelaksanaan ini serangan.
Akhirnya, kita secara singkat survei beberapa teknik melimpah lainnya,
termasuk kembali ke system call dan tumpukan melimpah, dan menyebutkan
pertahanan terhadap ini.
menggambarkan
operasi
dasar
dari
buffer
overflow,
mempertimbangkan fungsi utama C diberikan pada Gambar 10.1a. Ini berisi tiga
variabel (valid, str1, and str2),1 nilai-nilai yang biasanya akan disimpan dalam
lokasi memori yang berdekatan. Perintah dan Lokasi ini akan tergantung pada
jenis variabel (lokal atau global), bahasa dan compiler yang digunakan, dan
arsitektur mesin target. Namun, untuk tujuan tersebut dari contoh ini kita akan
mengasumsikan bahwa mereka akan disimpan dalam lokasi memori berturutturut, dari tertinggi ke terendah, seperti yang ditunjukkan pada Gambar 10.2. 2 ini
biasanya akan menjadi kasus untuk variabel lokal dalam fungsi C pada arsitektur
prosesor yang umum seperti Intel Keluarga Pentium. Tujuan dari kode fragmen
adalah untuk memanggil fungsi next_tag (str1) untuk menyalin ke str1 beberapa
nilai tag yang diharapkan. Mari kita menganggap ini akan menjadi START tali.
Kemudian membaca baris berikutnya dari input standar untuk program
ditemukan, padahal sebenarnya tag baca adalah sesuatu yang sama sekali berbeda.
Ini akan hampir pasti menghasilkan Program perilaku yang tidak dimaksudkan.
Seberapa serius ini akan sangat tergantung pada logika dalam program
menyerang. Salah satu kemungkinan berbahaya terjadi jika bukannya tag, nilainilai dalam buffer tersebut yang diharapkan dan disediakan sandi yang diperlukan
untuk mengakses fitur istimewa. Jika demikian, buffer overflow memberikan
penyerang dengan berarti mengakses fitur ini tanpa benar-benar mengetahui
password yang benar. Untuk mengeksploitasi jenis buffer overflow, seperti yang
kita telah gambarkan di sini, kebutuhan penyerang :
1. Untuk mengidentifikasi kerentanan buffer overflow dalam beberapa program
yang bisa dipicu menggunakan data eksternal yang bersumber di bawah kendali
penyerang, dan
2. Untuk memahami bagaimana buffer yang akan disimpan dalam memori proses,
dan maka potensi lokasi memori yang berdekatan merusak dan berpotensi
mengubah aliran eksekusi program. Mengidentifikasi program rentan dapat
dilakukan dengan inspeksi program sumber, menelusuri pelaksanaan program
karena mereka memproses masukan besar, atau menggunakan alat seperti fuzzing,
yang kita bahas dalam Bab 11 0,2, untuk secara otomatis mengidentifikasi
program berpotensi rentan. Apa penyerang melakukan korupsi yang dihasilkan
memori bervariasi, tergantung pada nilai-nilai apa yang sedang ditimpa.
Stack Buffer Overflows
Sebuah stack overflow bufer terjadi ketika buffer ditargetkan terletak pada stack,
biasanya sebagai variabel lokal dalam fungsi ini stack frame. Bentuk serangan ini
juga disebut sebagai tumpukan menghancurkan. Stack serangan buffer overflow
telah dieksploitasi sejak yang pertama terlihat di alam liar di Internet Worm
Morris pada tahun 1988. eksploitasi itu digunakan termasuk sebuah buffer
overflow dicentang dihasilkan dari penggunaan C mendapat () fungsi dalam
daemon fingerd. Publikasi oleh Aleph One (Elias Levy) rincian dari serangan dan
bagaimana memanfaatkannya [LEVY96] mempercepat penggunaan lebih lanjut
dari teknik ini.
3. Dorong saat ini nilai frame pointer (yang menunjuk ke panggilan rutin ini
stack frame) ke stack
4. Mengatur frame pointer menjadi arus nilai stack pointer (yang adalah
alamat frame pointer tua), yang kini mengidentifikasi baru stack frame
lokasi untuk disebut fungsi
5. Alokasikan ruang untuk variabel lokal dengan memindahkan stack
pointer ke bawah untuk meninggalkan ruang yang cukup bagi mereka
6. Berjalan tubuh yang disebut fungsi
7. Seperti keluar terlebih dahulu menetapkan stack pointer kembali ke nilai
frame pointer (efektif membuang ruang yang digunakan oleh variabel lokal)
8. Pops tua nilai frame pointer (memulihkan link ke rutinitas panggilan itu
stack frame)
9. Menjalankan instruksi kembali yang muncul alamat disimpan dari
tumpukan dan kembali kontrol ke fungsi panggilan Terakhir, fungsi
panggilan
10. Pops parameter untuk fungsi yang disebut dari tumpukan
11. Terus eksekusi dengan instruksi mengikuti panggilan fungsi.
karakter yang dapat dicetak. Jadi beberapa cara yang diperlukan untuk
menghasilkan urutan biner yang tepat untuk masukan untuk program target.
Biasanya ini akan menjadi ditentukan dalam heksadesimal, yang kemudian harus
dikonversi ke biner, biasanya dengan beberapa program kecil. Untuk tujuan
demonstrasi ini, kita menggunakan sederhana satu baris Perl 8 Program, yang
pack () fungsi dapat dengan mudah digunakan untuk mengkonversi string
heksadesimal menjadi setara biner, seperti dapat dilihat pada ketiga contoh
program berjalan pada Gambar 10.5b. Menggabungkan semua elemen yang
tercantum
di
atas
hasil
dalam
heksadesimal
yang
String
41424344454647485152535455565758616263646566676808fcffbf948304080a4
e4e4e4e0a, yang dikonversi ke biner dan ditulis oleh Program perl. Output ini
kemudian disalurkan ke dalam program buffer2 yang ditargetkan, dengan hasil
seperti yang ditunjukkan pada Gambar 10.5b. Perhatikan bahwa cepat dan
tampilan nilai membaca diulang dua kali, menunjukkan bahwa fungsi halo
memang telah masuk kembali. Namun, seperti sekarang stack frame tidak berlaku
lagi, ketika ia mencoba untuk mengembalikan kedua kalinya itu melompat ke
lokasi memori ilegal, dan program crash. Tetapi telah melakukan apa penyerang
ingin pertama! Ada beberapa poin yang perlu diperhatikan dalam contoh ini.
Meskipun nilai tag disediakan adalah benar dalam prompt pertama, pada saat
respon ditampilkan, itu telah rusak. Hal ini disebabkan karakter NULL final
digunakan untuk mengakhiri string masukan yang ditulis dengan lokasi memori
hanya melewati alamat pengirim, di mana alamat dari parameter tag terletak. Jadi
beberapa byte memori acak yang digunakan bukan dari yang sebenarnya nilai.
Ketika fungsi halo dijalankan kedua kalinya, parameter tag adalah direferensikan
relatif terhadap sewenang-wenang, acak, ditimpa disimpan nilai pointer bingkai,
yang beberapa lokasi di memori atas, maka string sampah terlihat. Proses
serangan lebih lanjut diilustrasikan pada Gambar 10.6, yang menunjukkan nilainilai dari frame stack, termasuk INP penyangga lokal sebelum dan setelah
panggilan ke gets ().
MORE STACK OVERFLOW VULNERABILITIES
Sebelum melihat desain shellcode, ada beberapa hal yang perlu diperhatikan
tentang struktur fungsi ditargetkan dengan serangan buffer overflow. Dalam
semua contoh yang digunakan sejauh ini, buffer overflow sudah terjadi ketika
input dibacakan. Ini adalah pendekatan yang diambil dalam bufer serangan
overflow awal, seperti dalam Worm Morris. Namun, potensi untuk buffer
overflow ada di mana saja data yang akan disalin atau digabung ke dalam buffer,
di mana setidaknya beberapa data yang dibaca dari luar program. Jika program
tidak memeriksa untuk memastikan buffer cukup besar, atau data yang disalin
adalah dihentikan dengan benar, maka buffer overflow dapat terjadi.
Shellcode
Komponen penting dari banyak serangan buffer overflow adalah transfer
eksekusi kode yang diberikan oleh penyerang dan sering disimpan dalam buffer
yang meluap. Kode ini dikenal sebagai shellcode, karena secara tradisional
fungsinya adalah untuk mentransfer kontrol untuk baris perintah pengguna
interpreter, atau shell, yang memberikan akses ke program apapun tersedia pada
sistem dengan hak istimewa dari program menyerang. pada UNIX sistem ini
sering dicapai dengan menyusun kode untuk panggilan ke execve yang ("/ Bin /
sh") fungsi sistem, yang menggantikan kode program saat ini dengan yang dari
shell Bourne (atau mana shell lainnya penyerang disukai). pada Windows sistem,
biasanya melibatkan panggilan ke sistem ("command.exe") fungsi (atau
"cmd.exe" pada sistem yang lebih tua) untuk menjalankan shell DOS Command.
Ini adalah alasan utama mengapa serangan buffer overflow biasanya
ditargetkan pada bagian tertentu dari perangkat lunak yang berjalan pada sistem
operasi tertentu. Karena shellcode adalah kode mesin, menulis itu secara
tradisional diperlukan pemahaman yang baik tentang bahasa assembly dan
pengoperasian sistem target. Memang banyak panduan klasik untuk menulis
shellcode, termasuk asli [LEVY96], diasumsikan pengetahuan tersebut. Namun,
baru-baru ini nomor situs dan alat telah dikembangkan yang mengotomatisasi
proses ini (karena memang memiliki terjadi dalam pengembangan eksploitasi
keamanan umum), sehingga membuat pembangunan dari shellcode eksploitasi
tersedia untuk khalayak potensial yang jauh lebih besar.
SHELLCODE DEVELOPMENT
Untuk
menyoroti
struktur
dasar
shellcode,
kami
mengeksplorasi
Tumpukan frame ini diciptakan satu di bawah yang lain, bekerja turun dari
puncak stack sebagai aliran eksekusi dalam program target memiliki fungsi
memanggil fungsi lainnya. Jumlah frame dan lokasi maka akhir dari buffer akan
tergantung pada urutan yang tepat dari fungsi panggilan yang mengarah ke fungsi
yang ditargetkan.
Mengingat keterbatasan di atas, apa hasil dari proses desain ini adalah kode yang
sama dengan yang ditunjukkan pada Gambar 10.8b. Kode ini ditulis dalam bahasa
assembly x86, 10 seperti yang digunakan oleh prosesor Pentium. Untuk
membantu dalam membaca kode ini, Tabel 10.3 memberikan daftar x86 umum
instruksi bahasa assembly, dan Tabel 10.4 daftar beberapa mesin umum register
itu referensi. Lebih 11 Banyak detail pada x86 perakitan bahasa dan organisasi
mesin dapat ditemukan dalam [STAL10]. Secara umum, kode di Gambar 10.8b
mengimplementasikan fungsi yang ditetapkan dalam program asli C di Gambar
10.8a. Namun, dalam rangka untuk mengatasi keterbatasan yang disebutkan di
atas, ada adalah beberapa fitur unik.
Seperti yang disusun oleh default, ini akan diasumsikan bagian dari wilayah
data global program. Tapi untuk digunakan di shellcode itu harus disertakan
bersama dengan petunjuk, biasanya terletak hanya setelah mereka. Dalam rangka
untuk kemudian merujuk ke string ini, kode harus menentukan alamat di mana ia
berada, relatif terhadap alamat instruksi saat. Hal ini dapat dilakukan melalui
novel, penggunaan yang tidak standar dari instruksi PANGGILAN.
Dengan latar belakang ini, Anda sekarang harus mampu melacak melalui
dihasilkan tersebut assembler shellcode tercantum pada Gambar 10.8b. Secara
singkat, kode ini,
Menentukan alamat string konstan menggunakan JMP / PANGGILAN trik
nol isi% eax dan salinan nilai ini ke akhir dari string konstan
Menyimpan alamat string yang di args [0]
nol nilai args [1]
Marshals argumen untuk sistem panggilan yang
-The Nomor kode untuk sistem execve panggilan (11)
-The Alamat string sebagai nama program untuk memuat
-The Alamat array args sebagai daftar argumen
-The Alamat args [1], karena itu adalah NULL, sebagai (kosong) daftar
lingkungan
Menghasilkan interrupt software untuk menjalankan system call ini (yang
tidak pernah kembali)
Program ini ditargetkan tidak perlu menjadi sistem utilitas dipercaya. lain
mungkin Target adalah program menyediakan layanan jaringan; yaitu, daemon
yang pada batas penyangga. Kerugian ini jauh lebih signifikan daripada dulu
menjadi, karena peningkatan pesat dalam kinerja prosesor. Program yang semakin
yang ditulis dalam bahasa ini dan karenanya harus kebal terhadap buffer overflow
dalam kode mereka (meskipun jika mereka menggunakan sistem perpustakaan
yang ada atau run-waktu eksekusi lingkungan yang ditulis dalam bahasa kurang
aman, mereka mungkin masih rentan).
SAFE CODING TECHNIQUES
Jika bahasa seperti C yang digunakan, maka programmer perlu menyadari bahwa
kemampuan mereka untuk memanipulasi alamat pointer dan akses memori
langsung datang pada biaya. Telah dicatat bahwa C dirancang sebagai bahasa
pemrograman sistem, yang berjalan pada sistem yang jauh lebih kecil dan lebih
dibatasi dari sekarang kita gunakan. Dalam rangka mengeras sistem ini,
pemrogram perlu memeriksa kode dan menulis ulang setiap coding konstruksi
yang tidak aman dengan cara yang aman. Mengingat serapan cepat buffer
eksploitasi overflow, proses ini telah dimulai dalam beberapa kasus. Sebuah
contoh yang baik adalah proyek OpenBSD, yang menghasilkan berbasis 4.4BSDbebas, multiplatform Sistem operasi UNIX-like.
Sekali lagi masalahnya adalah bahwa kode berikut tidak diberikan informasi
tentang ukuran buffer dan karenanya tidak mampu untuk memeriksa kemungkinan
overflow. Contoh-contoh ini menekankan baik kebutuhan untuk selalu
memverifikasi jumlah ruang yang digunakan dan fakta bahwa masalah dapat
terjadi baik dengan kode C polos, serta dari memanggil rutinitas perpustakaan
standar.
untuk
memasukkan
batas
informasi
dan
penggunaan
rutinitas
Penyerang
menggunakan
alamat
diprediksi
ini
untuk
menangani
ini
berbagai
alamat.
Sekali
lagi
ini
menyediakan
tingkatperlindungan bagi program yang ada, dan sementara itu tidak dapat
menghentikan
serangan
melanjutkan,
yangProgram
hampir
pasti
akan
menggagalkankeberhasilan
tumpukan overflow.
pelaksanaan
beberapa
serangan
buffer
overflowvarian
mengeksploitasi
kode
di
perpustakaan standar yang ada . Ini biasanya dimuat padaalamat yang sama
dengan program yang sama . Untuk mengatasi bentuk serangan , kita dapat
menggunakanekstensi keamanan yang merandomisasi urutan perpustakaan
memuat standar olehProgram dan lokasi alamat memori virtual mereka . Hal ini
membuat alamat dari setiapfungsi tertentu cukup tak terduga untuk membuat
kesempatan serangan yang diberikanbenar memprediksi alamatnya , sangat rendah
.Sistem OpenBSD termasuk versi dari semua ekstensi ini di -teknik
yangdukungan nological untuk sistem yang aman .
GUARD PAGES
GUARDSebuah teknik runtime akhir yang dapat digunakan halaman tempat
penjagaantara daerah kritis memori dalam proses mengatasi ruang. Sekali lagi,
inimengeksploitasi fakta bahwa proses memiliki memori lebih virtual yang
tersedia dariitu biasanya membutuhkan. Kesenjangan ditempatkan antara rentang
alamat yang digunakan untuk setiapkomponen dari ruang alamat, seperti yang
diilustrasikan pada Gambar 10.4. Inikesenjangan, atau halaman penjaga, yang
ditandai di MMU sebagai alamat ilegal, dan setiap upayauntuk mengaksesnya
hasil dalam proses yang dibatalkan. Hal ini dapat mencegah bufferserangan
overflow, biasanya data global, yang mencoba untuk menimpa berdekatandaerah
dalam proses mengatasi ruang, seperti meja diimbangi global, seperti yang kita
bahasdalam Bagian 10.3.Sebuah perpanjangan menempatkan halaman guard
antara tumpukan frame atau antara-bedaalokasi di heap. Ini dapat memberikan
perlindungan lebih lanjut terhadap stack danmenimbun lebih serangan aliran,
tetapi dengan biaya di waktu eksekusi mendukung sejumlah besarpemetaan
halaman yang diperlukan.
Pada bagian ini , kita membahas beberapa serangan buffer overflow lain
yang memiliki dieksploitasi dan mempertimbangkan kemungkinan pertahanan.Ini
termasuk variasi pada stack overflows, seperti kembali ke system call , meluap
dari data yang disimpan dalam program tumpukan , dan limpahan data yang
disimpan dalam proses bagian data global . A lebih survei rinci dari berbagai
kemungkinan serangan dapat ditemukan di [ LHEE03 ] .
Replacement Stack Frame
Dalam klasik tumpukan buffer overflow , penyerang menimpa penyangga
yang terletak di daerah variabel lokal dari stack frame dan kemudian menimpa
frame pointer disimpan dan kembali alamat.Varian dari serangan ini menimpa
buffer dan disimpan bingkaialamat pointer . Disimpan nilai pointer frame berubah
untuk merujuk ke lokasidekat bagian atas buffer ditimpa , di mana tumpukan
bingkai boneka telah diciptakan dengan alamat kembali menunjuk ke shellcode
yang lebih rendah dalam buffer . Berikut
perubahan ini , fungsi saat kembali ke pemanggilan fungsi sebagai normal, sejak
alamat pengirim belum berubah.Namun, fungsi panggilan sekarang menggunakan
penggantian bingkai boneka , dan saat kembali , kontrol ditransfer ke shellcode
dalam buffer ditimpa
Hal ini mungkin tampak serangan yang agak tidak langsung, tetapi bisa
digunakan ketika hanyaterbatas buffer overflow adalah mungkin, salah satu yang
memungkinkan perubahan ke frame disimpanpointer tetapi tidak alamat pengirim.
Anda mungkin ingat program contoh yang ditunjukkanpada Gambar 10.7 hanya
diizinkan cukup konten penyangga tambahan untuk menimpabingkai pointer
tetapi tidak kembali alamat. Contoh ini mungkin tidak bisa menggunakan
iniserangan, karena NULL Trailing akhir, yang berakhir string dibaca ke
dalampenyangga, akan mengubah baik frame pointer disimpan atau kembali
alamat dengan cara yangbiasanya akan menggagalkan serangan. Namun, ada
kategori lain dari tumpukanbuffer overflows dikenal sebagai off-per-satu
serangan. Ini dapat terjadi dalam buffer binercopy kode ketika programmer sudah
kembali
ke
sistem
yangSerangan
panggilan
kami
akan
pengirim,
dengan parameter
di atas
itu
ruang putih dan diabaikan oleh shell, sehingga allowing beberapa kelonggaran
dalam keakuratan menebak alamat . Lain rantai varian dua perpustakaan
panggilan satu demi satu. Ini bekerja dengan membuat nilai placeholder (yang
fungsi perpustakaan pertama disebut sebagai yang memperlakukan alamat pulang)
menjadi alamat dari fungsi kedua. Maka parameter untuk masing-masing telah
menjadi sesuai terletak di stack, yang umumnya membatasi fungsi apa bisa
disebut, dan dalam rangka apa. Penggunaan umum dari teknik ini membuat
pertama mengatasi bahwa dari strcpy () fungsi perpustakaan. Parameter yang
ditentukan menyebabkan itu untuk menyalin beberapa shellcode dari buffer
menyerang ke wilayah lain memori yang tidak ditandai nonexecutable. Alamat
poin kedua ke alamat tujuan untuk yang shellcode disalin. Hal ini memungkinkan
penyerang untuk menyuntikkan kode mereka sendiri tetapi memilikinya
menghindari tumpukan keterbatasan nonexecutable.
Sekali lagi, pertahanan terhadap ini termasuk salah satu mekanisme
perlindungan stack untuk mendeteksi modifikasi stack frame atau kembali alamat
dengan kode fungsi keluar.Demikian juga, pengacakan dari tumpukan dalam
memori, dan perpustakaan sistem, merintangikeberhasilan pelaksanaan serangan
tersebut.
Heap Overflows
Dengan meningkatnya kesadaran masalah dengan buffer overflows pada
stack dan pengembangan pertahanan melawan mereka , penyerang telah
mengalihkan perhatian mereka kemengeksploitasi overflows di buffer terletak di
tempat lain di ruang alamat proses. SatuTarget yang mungkin adalah buffer
terletak di memori dinamis dialokasikan dari tumpukan .Tumpukan biasanya
terletak di atas kode program dan data global dan tumbuhdalam memori
(sementara tumpukan tumbuh ke arah itu ) . Memori diminta daritumpukan oleh
program untuk digunakan dalam struktur data dinamis, seperti daftar link dari
catatan
.Jika
catatan
tersebut
berisi
buffer
rentan
meluap,
memori
daftar
catatan
untuk
memegang
potongan
data
sementarapengolahan input / output atau decoding gambar atau video yang file
terkompresi . Sebaikmemegang sepotong saat data , catatan ini mungkin berisi
pointer ke fungsipengolahan kelas ini masukan ( sehingga memungkinkan
berbagai kategori potongan data yang akandiproses oleh satu fungsi generik ) .
Kode tersebut digunakan dan telah berhasilterserang.
Sebagai contoh, perhatikan kode program yang ditunjukkan pada Gambar
10.11a . Ini menyatakan struktur yang mengandung buffer dan fungsi pointer.14
Pertimbangkan baris kode yang ditunjukkan di main () rutin . Ini menggunakan
malloc standar ( ) fungsi perpustakaan untuk mengalokasikan ruang untuk contoh
baru dari struktur di heap dan kemudian menempatkan referensi ke fungsi
showlen ( ) dalam fungsi pointer untuk memproses buffer . Sekali lagi, tidak aman
mendapat ( ) perpustakaan rutin digunakan untuk menggambarkan salinan
penyangga tidak aman . Berikut ini , fungsi pointer dipanggil untuk memproses
buffer .
Seorang penyerang , setelah diidentifikasi program yang berisi tumpukan
seperti berlebihan mengalir kerentanan , akan membangun urutan serangan
sebagai berikut. memeriksaprogram ketika berjalan akan mengidentifikasi bahwa
itu biasanya terletak di alamat0x080497a8 dan bahwa struktur hanya berisi buffer
64 - byte dan kemudianfungsi pointer. Asumsikan penyerang akan menggunakan
shellcode kita dirancang sebelumnya ,ditunjukkan pada Gambar 10.8 . Penyerang
akan pad shellcode ini persis 64 byte olehmemperluas kereta luncur NOP di depan
dan kemudian tambahkan alamat target yang cocok dibuffer untuk menimpa
fungsi pointer . Ini bisa 0x080497b8 ( dengan byteterbalik karena x86 adalah
little-endian seperti yang dibahas sebelumnya ) . Gambar 10.11b menunjukkanIsi
serangan script yang dihasilkan dan hasil itu diarahkan terhadapProgram rentan
( lagi diasumsikan setuid root ) dengan keberhasilan pelaksanaandari yang
diinginkan , perintah shell istimewa . Bahkan jika struktur rentan di heap tidak
yang
paling
umum
kesalahan
pemrograman
yang
bagaimana
mereka
terjadi
dan
bagaimana
untuk
menghindari mereka .
Metasploit : The Metasploit Project memberikan informasi yang
berguna mengenai eksploitasi shellcode kepada orang-orang yang
melakukan pengujian penetrasi , pengembangan signature IDS , dan
mengeksploitasi penelitian.
OpenBSD Keamanan : Proyek OpenBSD menghasilkan gratis ,
4.4BSD- multiplatform berdasarkan sistem operasi UNIX -like .
Daerah keamanan Rincian tujuan dan pendekatan mereka untuk
menyediakan keamanan yang proaktif , termasuk audit ekstensif
dari basis kode yang sudah ada dan masuknya teknologi untuk
mendeteksi dan mencegah sukses buffer overflow serangan .
Syarat utama
Pertanyaan ulasan
10.1
10.2
Daftar tiga jenis yang berbeda dari lokasi dalam ruang alamat
proses yang berlebihan penyangga serangan aliran biasanya
menargetkan .
10.3
10.4
10.5
Apa jenis
bahasa pemrograman
rentan terhadap
buffer
overflow ?
10,6
Jelaskan bagaimana
setumpuk
diimplementasikan
10,7
Mendefinisikan shellcode .
10,8
10.9
10.10
10.11
10.12
10.13
overflows
yang
dapat
diimplementasikan
ketika
sistem panggilan
10,16
Masalah
10.1
10.2
10.3
10.4
10.5
10.7
10.8
10.9
10.10
10.11
10.12
10.13
10.14