Saya menyebutkan "buffer overflows" dalam komentar atas jawaban Pythagras, saya mungkin harus mengklarifikasi apa yang saya maksudkan sedikit. Dalam C, itu tidak cukup untuk mengetahui bahwa bekerja secara langsung dengan memori itu berbahaya - Anda juga harus memahami cara yang tepat di mana itu berbahaya. Saya tidak terlalu suka metafora "menembak diri sendiri" untuk semua kasus ini - sering kali, bukan Anda yang menarik pelatuknya, tetapi seringkali itu adalah aktor dengan minat yang bertentangan dengan Anda dan / atau pengguna Anda. .
Misalnya, dalam arsitektur dengan tumpukan menurun (arsitektur paling populer sesuai dengan tagihan ini - termasuk x86 dan ARM), saat Anda memanggil suatu fungsi, alamat pengirim untuk fungsi tersebut akan ditempatkan pada tumpukan setelah variabel lokal yang ditentukan dalam tubuh fungsi. Jadi jika Anda mendeklarasikan buffer sebagai variabel lokal, dan mengekspos variabel itu ke dunia luar tanpa memeriksa buffer overflow, seperti ini:
void myFn(void) {
char buf[256];
gets(buf);
}
pengguna eksternal dapat mengirim Anda string yang menimpa alamat pengirim dari stack - pada dasarnya, ia dapat mengubah ide run-time program Anda dari grafik panggilan yang mengarah ke fungsi saat ini. Jadi pengguna memberi Anda sebuah string yang merupakan representasi biner dari beberapa kode yang dapat dieksekusi untuk arsitektur Anda, cukup bantalan untuk melimpahi tumpukan myFn
, dan beberapa data tambahan untuk menimpa alamat pengirim untuk myFn
menunjukkan kode yang ia berikan kepada Anda. Jika ini terjadi, maka ketika myFn
biasanya akan kembali kontrol ke peneleponnya, ia akan bercabang ke kode yang disediakan pengguna jahat. Jika Anda menulis kode C (atau C ++) yang berpotensi diekspos ke pengguna yang tidak terpercaya, Anda perlu memahami vektor serangan ini. Anda harus memahami mengapa buffer overflow terhadap stack sering (tetapi tidak selalu) lebih mudah dieksploitasi daripada yang melawan heap, dan Anda harus memahami bagaimana memori di heap diletakkan (tidak terlalu banyak detail, tentu saja, tetapi Gagasan bahwa suatu malloc()
daerah memiliki struktur kontrol yang mengelilinginya dapat membantu memahami mengapa program Anda macet di tempat lain malloc()
, atau di free()
).
C memaparkan Anda ke detail tingkat rendah tentang cara kerja mesin Anda, dan itu memberi Anda kontrol lebih langsung atas mesin Anda daripada bahasa yang diedit pengguna lain yang digunakan secara luas saat ini. Dengan kekuatan besar datang tanggung jawab besar - Anda benar-benar perlu memahami detail tingkat rendah agar dapat bekerja dengan C dengan aman dan efektif.