Pertanyaan yang ditautkan tidak cukup mencakup masalah buffer overflow.
deadalnix
1
karena tumpukan tumbuh ke atas.
tylerl
2
Apakah lokasi memori 0 di bagian atas atau bawah?
Jawaban:
21
Saya percaya itu berasal dari hari-hari awal komputasi, ketika memori sangat terbatas, dan tidak bijaksana untuk mengalokasikan sebagian besar memori untuk digunakan secara eksklusif oleh stack. Jadi, dengan mengalokasikan memori tumpukan dari alamat nol ke atas, dan menumpuk memori dari ujung memori ke bawah, Anda bisa memiliki tumpukan dan tumpukan berbagi area memori yang sama.
Jika Anda membutuhkan sedikit lebih banyak tumpukan, Anda bisa berhati-hati dengan penggunaan tumpukan Anda; jika Anda membutuhkan lebih banyak tumpukan, Anda dapat mencoba mengosongkan memori tumpukan. Hasilnya, tentu saja, sebagian besar, tabrakan spektakuler, karena tumpukan kadang-kadang akan menumpuk tumpukan dan sebaliknya.
Kembali pada masa itu tidak ada interwebz, jadi tidak ada masalah eksploitasi buffer overrun. (Atau setidaknya sejauh interwebz ada, itu semua dalam fasilitas keamanan tinggi dari departemen pertahanan negara-negara bersatu, sehingga kemungkinan data berbahaya tidak perlu terlalu dipikirkan.)
Setelah itu, dengan sebagian besar arsitektur itu semua masalah menjaga kompatibilitas dengan versi sebelumnya dari arsitektur yang sama. Itu sebabnya tumpukan terbalik masih bersama kita hari ini.
Kembalilah lebih jauh dalam sejarah dan tidak ada tumpukan, bahkan hari ini, banyak pengontrol mikro 8 dan 16 bit tidak memiliki tumpukan. Tumpukan bertambah sehingga program dapat diinstal di alamat memori rendah, dan tumpukan adalah memori yang tersisa. Inisialisasi tumpukan dapat dilakukan sebelum memuat program, menyederhanakan program.
mattnz
1
Sebagian besar mikrokontroler kecil memiliki tumpukan, hanya saja tidak ada tumpukan yang tumbuh. Sulit dibenarkan untuk menggunakan alokasi memori dinamis pada heap ketika Anda memiliki sejumlah kecil RAM (<1Kbytes) untuk bekerja dengannya. Biasanya ukuran satu-satunya bagian memori yang berubah adalah tumpukan.
tapi buffer overflows masih bisa dieksploitasi jika tumpukannya sebaliknya
mengambil klasik strcpysebagai contoh
foo(char* in){
char[100] buff;
strcpy(buff,in);
}
dengan memori tumpukan sebagai
ret foo
arg in
buff array
ret strcpy
buf pointer
in
ini berarti bahwa ketika penyalinan dilakukan alamat pengirim strcpyadalah setelah buffer (bukan fooalamat pengirim) dan dapat ditimpa oleh apa pun yang ada diin
Sistem Operasi Multics terhormat berjalan pada perangkat keras yang memiliki (salah satu dari banyak kemungkinan) tumpukan tumbuh: lihat http://www.acsac.org/2002/papers/classic-multics.pdf , akhir bagian 2.3.2:
Ketiga, tumpukan pada prosesor Multics tumbuh ke arah positif, bukan ke arah negatif. Ini berarti bahwa jika Anda benar-benar mencapai buffer overflow, Anda akan menimpa frame stack yang tidak digunakan, daripada pointer kembali Anda sendiri, membuat eksploitasi jauh lebih sulit.
Itu pernyataan yang agak menarik. Apakah buffer overflows menjadi masalah yang sangat besar hanya karena pengaturan "custom" procedure-call-stack-frame? Juga, berapa banyak reputasi Multics sebagai Totally Invulnerable hanya kebetulan desain perangkat keras?
Yah, tidak memiliki stack yang dapat dieksekusi mungkin membantu Multics sebanyak arah stack yang cerdas, dan tentu saja dengan banyak program yang ditulis dalam PL / 1, string overflows juga tidak terlalu menjadi masalah.
Jawaban:
Saya percaya itu berasal dari hari-hari awal komputasi, ketika memori sangat terbatas, dan tidak bijaksana untuk mengalokasikan sebagian besar memori untuk digunakan secara eksklusif oleh stack. Jadi, dengan mengalokasikan memori tumpukan dari alamat nol ke atas, dan menumpuk memori dari ujung memori ke bawah, Anda bisa memiliki tumpukan dan tumpukan berbagi area memori yang sama.
Jika Anda membutuhkan sedikit lebih banyak tumpukan, Anda bisa berhati-hati dengan penggunaan tumpukan Anda; jika Anda membutuhkan lebih banyak tumpukan, Anda dapat mencoba mengosongkan memori tumpukan. Hasilnya, tentu saja, sebagian besar, tabrakan spektakuler, karena tumpukan kadang-kadang akan menumpuk tumpukan dan sebaliknya.
Kembali pada masa itu tidak ada interwebz, jadi tidak ada masalah eksploitasi buffer overrun. (Atau setidaknya sejauh interwebz ada, itu semua dalam fasilitas keamanan tinggi dari departemen pertahanan negara-negara bersatu, sehingga kemungkinan data berbahaya tidak perlu terlalu dipikirkan.)
Setelah itu, dengan sebagian besar arsitektur itu semua masalah menjaga kompatibilitas dengan versi sebelumnya dari arsitektur yang sama. Itu sebabnya tumpukan terbalik masih bersama kita hari ini.
sumber
memori program secara tradisional diatur sebagai
heap dan stack bisa ditukar
tapi buffer overflows masih bisa dieksploitasi jika tumpukannya sebaliknya
mengambil klasik
strcpy
sebagai contohdengan memori tumpukan sebagai
ini berarti bahwa ketika penyalinan dilakukan alamat pengirim
strcpy
adalah setelah buffer (bukanfoo
alamat pengirim) dan dapat ditimpa oleh apa pun yang ada diin
sumber
Beberapa perangkat keras memiliki tumpukan mulai dari memori tinggi, tumbuh turun, sedangkan tumpukan dimulai pada memori rendah tumbuh.
Perangkat keras PA-RISC HP, antara lain, melakukan ini: http://www.embeddedrelated.com/usenet/embedded/show/68749-1.php
Sistem Operasi Multics terhormat berjalan pada perangkat keras yang memiliki (salah satu dari banyak kemungkinan) tumpukan tumbuh: lihat http://www.acsac.org/2002/papers/classic-multics.pdf , akhir bagian 2.3.2:
Itu pernyataan yang agak menarik. Apakah buffer overflows menjadi masalah yang sangat besar hanya karena pengaturan "custom" procedure-call-stack-frame? Juga, berapa banyak reputasi Multics sebagai Totally Invulnerable hanya kebetulan desain perangkat keras?
sumber