Saya berasumsi ada sejarah untuk itu, tetapi mengapa tumpukan tumbuh ke bawah?
Sepertinya saya seperti buffer overflows akan jauh lebih sulit untuk dieksploitasi jika tumpukan tumbuh ...
Saya berasumsi ada sejarah untuk itu, tetapi mengapa tumpukan tumbuh ke bawah?
Sepertinya saya seperti buffer overflows akan jauh lebih sulit untuk dieksploitasi jika tumpukan tumbuh ...
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.
memori program secara tradisional diatur sebagai
code
constants
heap (growing up)
...
stack (growing down)
heap dan stack bisa ditukar
tapi buffer overflows masih bisa dieksploitasi jika tumpukannya sebaliknya
mengambil klasik strcpy
sebagai 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 strcpy
adalah setelah buffer (bukan foo
alamat pengirim) dan dapat ditimpa oleh apa pun yang ada diin
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:
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?