Mengapa tumpukan tumbuh ke bawah?

31

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 ...

Mehrdad
sumber
3
stackoverflow.com/questions/1677415/... mencatat bahwa stack dapat tumbuh dengan cara apa pun hingga tingkat tertentu.
JB King
6
Ada pertanyaan seperti ini: stackoverflow.com/questions/2035568/… . Sebenarnya ada pertanyaan dan jawaban yang jauh lebih baik mengenai hal ini di sini: stackoverflow.com/questions/664744/…
Karlson
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.

Mike Nakis
sumber
8
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.
tehnyit
7

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 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

ratchet freak
sumber
4

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?

Bruce Ediger
sumber
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.
Greg A. Woods