GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Cara Kerja Bom Garpu?

  • PERINGATAN JANGAN MENCOBA MENJALANKAN INI PADA MESIN PRODUKSI

Dalam membaca halaman Wikipedia tentang topik tersebut, saya biasanya mengikuti apa yang terjadi dengan kode berikut:

:(){ :|:& };:

kutipan deskripsi

Bom garpu berikut disajikan sebagai seni pada tahun 2002;56
asal pastinya tidak diketahui, tetapi ada di Usenet sebelum tahun 2002.
Bom dieksekusi dengan menempelkan 13 karakter berikut ke dalam
UNIX shell seperti bash atau zsh. Ini beroperasi dengan mendefinisikan
fungsi yang disebut ':', yang memanggil dirinya sendiri dua kali, sekali di
latar depan dan sekali di latar belakang.

Namun bit terakhir tidak sepenuhnya jelas bagi saya. Saya melihat definisi fungsi:

:(){ ... }

Tapi apa lagi yang terjadi? Juga lakukan shell lain seperti ksh , csh , dan tcsh juga mengalami nasib yang sama karena mampu membangun sesuatu yang serupa?

Jawaban yang Diterima:

Bom garpu ini selalu mengingatkan saya pada sesuatu yang dikatakan guru pemrograman AI pada salah satu pelajaran pertama yang saya hadiri “Untuk memahami rekursi, pertama-tama Anda harus memahami rekursi”.

Pada intinya, bom ini adalah fungsi rekursif. Intinya, Anda membuat fungsi, yang memanggil dirinya sendiri, yang memanggil dirinya sendiri, yang memanggil dirinya sendiri…. sampai sumber daya sistem dikonsumsi. Dalam contoh khusus ini, rekursi diperkuat dengan penggunaan pemipaan fungsi ke dirinya sendiri DAN membuat latar belakangnya.

Saya telah melihat ini dijawab di StackOverflow, dan saya pikir contoh yang diberikan di sana menggambarkannya dengan baik, hanya karena lebih mudah untuk melihat apa yang dilakukannya secara sekilas (dicuri dari tautan di atas…)

☃(){ ☃|☃& };☃

Tentukan fungsi bug ☃() { ... } , tubuh yang memanggil dirinya sendiri (fungsi bug), menyalurkan output ke dirinya sendiri (fungsi bug) ☃|☃ , dan latar belakang hasil & . Kemudian, setelah fungsi didefinisikan, panggil fungsi bug, ; ☃ .

Saya perhatikan bahwa setidaknya pada Arch VM saya, kebutuhan untuk melakukan proses background bukanlah persyaratan untuk memiliki hasil akhir yang sama, untuk menggunakan semua ruang proses yang tersedia dan membuat host rusak. Sebenarnya sekarang saya telah mengatakan bahwa tampaknya terkadang menghentikan proses pelarian dan setelah layar penuh -bash: fork: Resource temporarily unavailable itu akan berhenti dengan Terminated (dan journalctl menunjukkan pembuangan inti bash).

Terkait:Bagaimana cara membuat vim bekerja dengan tmux dengan benar?

Untuk menjawab pertanyaan Anda tentang csh/tcsh, tak satu pun dari shell tersebut mendukung fungsi, Anda hanya bisa alias. Jadi untuk shell tersebut Anda harus menulis skrip shell yang memanggil dirinya sendiri secara rekursif.

zsh tampaknya mengalami nasib yang sama (dengan kode yang sama), tidak membuang inti dan menyebabkan Arch memberikan Out of memory: Kill process 216 (zsh) score 0 or sacrifice child. , tapi masih terus bercabang. Setelah beberapa saat kemudian menyatakan Killed process 162 (systemd-logind) ... (dan masih terus memiliki forking zsh).

Arch sepertinya tidak memiliki pacman versi ksh, jadi saya harus mencobanya di debian. ksh objek ke : sebagai nama fungsi, tetapi menggunakan sesuatu – katakan b() malah tampaknya memiliki hasil yang diinginkan.


Linux
  1. Bagaimana Cara Kerja Awk ‘!a[$0]++’?

  2. Bagaimana Cara Kerja Sticky Bit?

  3. Bagaimana cara kerja debugger di Linux?

  1. Apa itu Makefile dan bagaimana cara kerjanya?

  2. Apa itu NGINX? Bagaimana cara kerjanya?

  3. Bagaimana cara kerja antarmuka loopback

  1. Apa itu Server Web, dan Bagaimana Cara Kerja Server Web?

  2. Ssh – Bagaimana Tcp-keepalive Bekerja Di Ssh?

  3. Apa itu DNS dan Bagaimana Cara Kerjanya?