Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 · Pelajaran

Limpahan Penimbal dan Kod Cangkerang

Terokai mekanisme kerentanan limpahan penimbal dan cara kerentanan tersebut boleh dieksploitasi untuk menyuntik serta melaksanakan kod cangkerang berniat jahat.

Pelajaran 3 daripada 412 langkah

Limpahan Penimbal dan Kod Cangkerang ialah pelajaran Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 merangkumi sejumlah 4 pelajaran.

Pengenalan: Limpahan Penimbal

Selamat datang ke topik penting dalam keselamatan peringkat rendah: Limpahan Penimbal. Ini ialah sejenis kerentanan perisian yang boleh membolehkan penyerang mengawal atur cara.

Pada asasnya, limpahan penimbal berlaku apabila atur cara cuba menulis lebih banyak data ke dalam penimbal memori bersaiz tetap daripada kapasiti yang direka untuk ditampungnya. Data berlebihan ini 'melimpah' ke kawasan memori bersebelahan.

Apakah Itu Penimbal?

Dalam pengaturcaraan, khususnya dalam bahasa seperti C atau bahasa himpunan, penimbal ialah blok memori yang dikhaskan untuk menyimpan data. Anggaplah ia sebagai bekas dengan kapasiti tertentu.

  • Penimbal sering digunakan untuk storan sementara, seperti menyimpan input pengguna atau data rangkaian.
  • Penimbal boleh diisytiharkan sebagai tatasusunan aksara (rentetan) atau jenis data lain.
  • Contohnya, char username[32]; mengisytiharkan penimbal yang boleh menyimpan sehingga 31 aksara serta penamat nol.

Kod: Penimbal yang Rentan

Mari lihat atur cara C ringkas yang sengaja mengandungi kerentanan limpahan penimbal. Berikan perhatian khusus kepada fungsi strcpy.

strcpy menyalin rentetan daripada sumber ke destinasi, tetapi tidak memeriksa saiz penimbal destinasi. Ini ialah punca limpahan yang lazim.

/* buffer_example.c */
#include <stdio.h>
#include <string.h>

// This function is intentionally vulnerable
void vulnerable_greet(char *name_input) {
  char buffer[16]; // A small buffer, 16 bytes
  
  // This is the vulnerability! strcpy doesn't check size.
  // If name_input is longer than 15 chars (+ null terminator),
  // it will overflow 'buffer'.
  strcpy(buffer, name_input); 
  
  printf("Hello, %s!\n", buffer);
}

int main() {
  // Let's call the vulnerable function with a safe input
  vulnerable_greet("CoddyKit User"); 
  
  printf("Program finished normally.\n");
  
  return 0;
}

Bingkai Tindanan

Untuk memahami cara limpahan boleh dieksploitasi, kita perlu mengimbas kembali tindanan panggilan. Apabila fungsi dipanggil, bingkai tindanan baharu dicipta.

Bingkai tindanan ini biasanya mengandungi:

  • Pemboleh ubah setempat untuk fungsi tersebut.
  • Penunjuk Asas yang disimpan (EBP/RBP).
  • Paling penting: Alamat Kembali, yang memberitahu CPU tempat untuk menyambung semula pelaksanaan selepas fungsi selesai.

Menulis Ganti Alamat Kembali

Apabila limpahan penimbal berlaku pada tindanan, data berlebihan bukan sekadar merosakkan pemboleh ubah setempat yang bersebelahan. Jika data yang mencukupi diberikan, data itu boleh menulis ganti EBP yang disimpan dan kemudian alamat kembali itu sendiri.

Dengan mengubah alamat kembali, penyerang boleh memperdaya atur cara supaya melompat ke lokasi memori sewenang-wenangnya dan bukannya kembali kepada pemanggil yang sah. Inilah mekanisme teras bagi banyak eksploit limpahan penimbal.

Memperkenalkan Kod Shell

Jadi, ke manakah penyerang mahu atur cara itu melompat? Biasanya, ke sekeping kod yang dikawalnya, yang dikenali sebagai kod shell.

  • Kod shell ialah sekeping kecil kod mesin yang kendiri.
  • Tujuan utamanya selalunya adalah untuk melaksanakan 'shell' (gesaan arahan) pada sistem sasaran.
  • Kod ini juga boleh melakukan tindakan berniat jahat yang lain, seperti mencipta pengguna baharu, memuat turun fail atau menyambung ke pelayan jauh.

Anatomi Kod Shell Ringkas

Kod shell biasanya ditulis dalam bahasa himpunan supaya padat dan cekap sebaik mungkin. Kod ini mengelakkan bait nol (\x00) kerana banyak fungsi rentetan berhenti menyalin pada bait nol pertama.

Matlamat lazimnya adalah untuk memanggil panggilan sistem execve (dalam Linux) bagi melancarkan /bin/sh.

; Example (conceptual) Linux x86 shellcode snippet: ; mov eax, 0x0b ; Syscall number for execve ; mov ebx, addr_of_sh ; Pointer to '/bin/sh' string ; mov ecx, 0 ; Arg 2 (argv) = NULL ; mov edx, 0 ; Arg 3 (envp) = NULL ; int 0x80 ; Invoke kernel (syscall)

Menyuntik Kod Shell

Bagaimanakah kod shell masuk ke dalam atur cara? Penyerang menyertakannya sebagai sebahagian daripada input berniat jahat yang menyebabkan limpahan penimbal.

Apabila penimbal melimpah, kod shell ditulis ke dalam memori atur cara, biasanya pada tindanan, bersama alamat kembali yang telah ditulis ganti.

Struktur Eksploit: Gelongsoran NOP

Penyerang sering menggunakan gelongsoran NOP (gelongsoran Tiada Operasi) untuk meningkatkan kebolehpercayaan eksploit mereka.

  • Gelongsoran NOP ialah jujukan arahan 'Tiada Operasi' (NOP) (contohnya, \x90 dalam x86).
  • Jika penyerang menulis ganti alamat kembali supaya menunjuk ke mana-mana tempat dalam gelongsoran NOP, CPU hanya akan melaksanakan NOP sehingga 'meluncur' ke kod shell sebenar.
  • Ini mengimbangi ketidaktepatan kecil ketika mengagak alamat memori tepat kod shell.

Pertahanan dan Langkah Pengurangan Risiko

Sistem pengendalian dan penyusun telah membangunkan beberapa pertahanan terhadap limpahan penimbal:

  • ASLR (Rawakan Susun Atur Ruang Alamat): Merawakkan alamat memori untuk menyukarkan tekaan alamat kembali atau lokasi kod shell.
  • DEP/NX Bit (Pencegahan Pelaksanaan Data/Tiada Pelaksanaan): Menandakan kawasan memori (seperti tindanan) sebagai tidak boleh dilaksanakan, lalu menghalang kod shell daripada berjalan di situ.
  • Canary Tindanan: Nilai rawak yang dijana penyusun dan diletakkan pada tindanan; jika ditulis ganti, atur cara mengesan pengusikan dan dihentikan.
  • Fungsi Selamat: Menggunakan fungsi seperti strncpy, snprintf, fgets atau rentetan C++ yang melakukan pemeriksaan sempadan.

Uji Pemahaman Anda

Limpahan penimbal tindanan membolehkan penyerang menulis melepasi penghujung penimbal. Apakah matlamat utama yang ingin dicapai oleh penyerang dengan mereka bentuk input secara teliti untuk menulis ganti alamat kembali?

Imbas Kembali: Limpahan dan Kod Shell

Dalam pelajaran ini, kita meneroka dunia limpahan penimbal yang berbahaya. Kita mempelajari bahawa keadaan ini berlaku apabila terlalu banyak data ditulis ke dalam penimbal bersaiz tetap, lalu merosakkan memori bersebelahan.

Yang penting, jika limpahan ini mencapai alamat kembali pada tindanan, penyerang boleh merampas kawalan program. Mereka melakukannya dengan menyuntik kod shell—kod mesin kecil yang berniat jahat—dan mengubah hala pelaksanaan kepadanya, sering kali dengan bantuan gelongsoran NOP. Kita juga menyentuh teknik pengurangan risiko penting seperti ASLR, DEP dan pengawal tindanan.

Percuma untuk bermula

Pelajari Assembly dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
12
Pelajaran
48

Soalan Lazim

Adakah pelajaran “Limpahan Penimbal dan Kod Cangkerang” percuma?

Ya — teks penuh “Limpahan Penimbal dan Kod Cangkerang” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86, tingkat taraf kepada CoddyKit PRO. Kursus Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Limpahan Penimbal dan Kod Cangkerang”?

Terokai mekanisme kerentanan limpahan penimbal dan cara kerentanan tersebut boleh dieksploitasi untuk menyuntik serta melaksanakan kod cangkerang berniat jahat. Anda berlatih Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Limpahan Penimbal dan Kod Cangkerang” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 ini?

Ya. Setiap pelajaran Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Kekoherenan Cache dan Prestasi
  2. Pengoptimuman Manual Bahagian Kritikal
  3. Limpahan Penimbal dan Kod Cangkerang
  4. Ramalan Cabang dan Pelaksanaan Spekulatif
← Kembali ke Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86