Cara bermain teman sekamar

Dari penerjemah


Mahasiswa Universitas Tufts menceritakan bagaimana cara menggoda teman sekamarnya. Dia bahkan menyematkan saya ketika dia memulai ceritanya dengan fakta bahwa mereka memiliki TV 4K di asrama.

Pendahuluan


Sebelum saya berbicara tentang bagaimana saya membawa Logan yang malang, saya harus menjelaskan sistem media di kamar kami. Segera Anda akan mengerti mengapa.

Logan, jika Anda membaca ini, saya harap Anda lebih senang daripada tidak.

Disposisi


Kami memiliki komputer dengan desktop Ubunt yang terhubung ke perangkat TV. Ia bertindak sebagai server media. Karena dia masih membutuhkan koneksi Internet permanen, server web dengan beberapa halaman, server SSH dan sejumlah layanan lainnya masih berputar di sana.

Karena kenyataan bahwa televisi 4K, dan komputer dirakit dari apa yang ada di tangan, kartu videonya tidak menarik. Logan memutuskan untuk membeli NVIDIA vidyuha lama, yang dirilis beberapa generasi yang lalu (yang masih jauh lebih baik daripada sebelumnya) untuk memutar video 4K secara normal.

Lahirnya sebuah ide


Tak lama setelah instalasi, kami keluar beberapa gangguan dengan driver. Pada saat itu, saya pikir akan menyenangkan untuk dapat menampilkan pesan kesalahan secara manual.

Setelah beberapa pencarian di Internet, menjadi jelas bahwa meminta pesan dari jarak jauh di televisi sesederhana:

  1. Masuk melalui SSH ke komputer saat pengguna menjalankan siaran
  2. DISPLAY=:0 zenity --info --text '!'

DISPLAY=:0 diperlukan, karena dalam sesi saya tidak ada tampilan, tetapi saya ingin menampilkan pesan di layar utama.

Karena kami memiliki masalah dengan NVIDIA vidyuha, saya memutuskan untuk memikirkan sesuatu seperti:

 DISPLAY=:0 zenity --warning --text '     .' 

Itu berhasil, tetapi setiap kali masuk ke server menggunakan klien SSH untuk mendapatkan Logan turun sangat menyenangkan. Jadi saya memutuskan untuk menipu. Saya memikirkan tugas di mahkota untuk membuat dia marah pada jadwal, tetapi ada beberapa masalah:

  1. Sebenarnya keteraturan
  2. Kami memiliki tugas-tugas lain di mahkota, yang meningkatkan risiko mengungkapkan tugas berbahaya saya

Opsi lain seperti skrip SysVInit dijatuhkan karena alasan yang sama. Karena itu, saya memutuskan untuk membuat halaman web publik dengan tombol "Have a Logan".

Persiapan menggambar


Saya pikir saya perlu beberapa hal untuk memulai:

  1. Sesuatu yang menangani input pengguna
  2. Sesuatu mengeksekusi perintah sewenang-wenang sebagai pengguna web

Jadi saya datang ke:

  1. Nginx
  2. Ekstensi FPM untuk NGINX
  3. Php
  4. Paket FPM untuk PHP

Akibatnya, saya membuat situs dengan halaman logan.html logan.html dan "halaman tindakan" zenity.php :

logan.html
 <!-- logan.html --> <html> <head> <style type="text/css"> form button { font-size: 20px; } div.explanation { width: 400px; } </style> <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="HandheldFriendly" content="true"> </head> <body> <form method="POST" action="/zenity.php"> <button> </button> </form> </body> </html> 

Ada sedikit omong kosong dalam meta tag untuk mengadaptasi halaman untuk ponsel (ingat bahwa saya membuatnya mudah digunakan saat bepergian?) Bagi mereka yang tidak tahu cara membuat HTML di kepala saya, saya tunjukkan bagaimana tampilannya:



Ketika tombol ditekan, permintaan POST terbang ke halaman lain, yang melakukan semua pekerjaan kotor:

zenity.php
 <?php /* zenity.php */ $messages = Array( " .", " .", " .", " .", " .", " .", "       .", "   .", "   .", "   .", "    and has recovered.", "     .", "     .", "     .", "     .", "     .", "     .", " NVIDIA  .", "NVIDIA    - . ( 43)", "    wlx10bef54d395c." ); $statuses = Array("error", "warning"); $msg = $messages[array_rand($messages)]; $status = $statuses[array_rand($statuses)]; $timeout = "--timeout 10"; exec("sudo -u thedisplayuser /usr/sbin/zenity --$status --display=:0 --text ': $msg' $timeout > /dev/null &"); include 'logan.html'; ?> <div class="explanation">                ,       .   ,        // .. </div> <br /> <img src='/logan.jpg' /> 

Halaman ini melakukan sejumlah hal:

  1. Memilih pesan kesalahan acak
  2. Memilih jenis kotak dialog.
  3. Memperagakan pesan untuk jangka waktu tertentu (10 detik)
  4. Dia menggambar sebuah tombol dan menjelaskan apa yang terjadi - semuanya disertai dengan gambar lucu Logan secara langsung

Bagi mereka yang masih tidak dapat membuat HTML di kepala mereka (sekali lagi, semoga, kebanyakan orang), halaman ini terlihat seperti ini:



Jika Anda bertanya-tanya mengapa halaman web diizinkan untuk mengeksekusi kode dengan cara ini, dan mengapa pemilik sesi server web ( www-data ) dapat mengeksekusi perintah sebagai pengguna thedisplayuser (pengguna layar), Anda mungkin senang mengetahui bahwa saya sangat membatasi ini untuk file sudoers :

 # /etc/sudoers www-data ALL=(thedisplayuser) NOPASSWD: /usr/bin/zenity 

Bagian spesifik dari konfigurasi ini memungkinkan www-data untuk hanya menjalankan / usr / bin / zenity sebagai pemain layar tanpa kata sandi. Saya melakukan ini setelah mengacaukan kesalahan bodoh dalam pengaturan PHP dan NGINX. Lalu saya mengirim URL ke beberapa teman di kampus yang tahu Logan.

Menarik hasil


Puji surga, Logan bereaksi sekeras yang dia bisa. Jika dia sedikit jengkel, pikiran bahwa usaha saya telah sia-sia akan mengganggu saya. Tapi tidak! Dia kehilangan kesabaran. Saya tidak bisa menghitung berapa banyak reboot, instalasi ulang driver, dan modifikasi kernel. Saya hanya menyesal bahwa saya tidak merekam video tentang bagaimana dia menjadi marah setelah memulai VLC, ketika seseorang membuang banyak jendela dengan pesan tentang kesalahan kartu video.

Tapi aku terlalu terbawa suasana, dan Chris, teman sekamar kami yang lain, memutuskan untuk campur tangan ...

Hunter berburu


Tahap pertama


Suatu hari, ketika Logan sedang tidur, saya melihat pesan kesalahan yang berbunyi: "Max ada di balik semua ini." Choooo? Saya mendapat kotak prank! Jadi, saya mulai mengerti dan menemukan bahwa seseorang (Chris) memperkenalkan frasa ini ke dalam serangkaian pesan acak di zenity.php . Saya segera menghapusnya (sampai Logan mendengar bahwa mereka memainkannya) dan memutuskan bahwa kesenangan itu sudah berakhir. Itu dia.

Tahap kedua


Setelah sekitar satu minggu, pesan itu muncul lagi. Saya pikir Chris membakar saya dan menambahkannya kembali ke daftar. Tidak apa-apa. Dia tidak ada di sana. Setelah mempelajari file dengan hati-hati, saya perhatikan bahwa file itu sekarang disebut /usr/sbin/zenity alih-alih /usr/bin/zenity (default sistem), dan sudoers memiliki entri permisif yang sesuai. Jadi apa itu /usr/sbin/zenity ? Script shell:

 #!/bin/bash echo '.' >> /tmp/log.txt if [ 0 -eq $((RANDOM % 100)) ]; then /usr/bin/zenity --error --display=:0 --text "   ." --timeout 10 > /dev/null & else /usr/bin/zenity "$@" fi 

Nah, itu level berikutnya, jika saya pernah bertemu hal seperti itu. 99% dari semuanya berjalan sebagaimana mestinya, dan dalam satu persen sisanya pesan "Max berdiri di belakang" muncul. Saya menghapus file (saya tahu, itu tidak layak) dan menulis ke para sudoers membawa zenity.php ke bentuk aslinya. Pesan berhenti muncul. Tapi kemudian mereka kembali.

Tahap ketiga


Saya memeriksa zenity.php . Tidak ada yang baru. /usr/sbin/zenity ? Hilang. Saya berkecil hati. Kemudian saya memutuskan untuk melihat ke dalam /usr/bin/zenity :

 #!/bin/bash # ---    --- # ---    --- # ---    --- # ---    --- # ---    --- if [ 0 -eq $((RANDOM % 70)) ]; then /usr/bin/rpmdb-client --error --display=:0 --text """"" """""" """""""""""" """"""""." --timeout 10 > /dev/null & else /usr/bin/rpmdb-client "$@" fi 

Bajingan licik licik. Dia memperbaiki binary zenity, menjadikannya bash script yang berfungsi sekali dan 70. Apa-apaan ini? Dan seperti apa rpmdb-client ? Jadi, saya melawan balik dengan mengubahnya:

 # <> if [ 0 -eq $((RANDOM % 70)) ]; then /usr/sbin/rpmdb-client --error --display=:0 --text """"" """""" """""""""""" """"""""." --timeout 10 > /dev/null & else /usr/bin/rpmdb-client "$@" fi 

Apakah Anda menangkap perbedaannya? Jika tidak, /usr/sbin/rpmdb-client disebut bukan /usr/bin/rpmdb-client , yang meluncurkan skrip bash yang tidak melakukan apa-apa. Dengan keberuntungan yang cukup, dia tidak akan melihat karakter tambahan dan pesannya tidak akan pernah muncul.

TODO: Memahami perbedaan antara executable /usr/sbin/zenity executable ELF dan /usr/bin/rpmdb-client yang dibuat oleh Chris. Ada beberapa perbedaan aneh dalam binari yang belum saya mengerti.

Tahap keempat


Saya memutuskan untuk memperkuat pertahanan, sampai Chris melihat perbedaan dalam satu surat yang dijelaskan di atas. Saya membatalkan semua perubahan saya dan memutuskan untuk menambal zenity . Terima kasih banyak kepada Tom Hebb (seperti dalam setiap pos teknis saya) karena membantu saya dengan ini. Inilah yang saya lakukan:

  1. Dikonfigurasi agar mengunduh sumber (dalam hal ini, menambahkan deb-src ke /etc/apt/sources.list )
  2. apt-get source zenity
  3. Membuat tambalan dengan quilt :
    1. quilt new myPatch.diff
    2. Patch untuk src/msg.c yang menentukan keberadaan kata "Max" di badan pesan:

      msg.c
       Index: zenity-3.18.1.1/src/msg.c =================================================================== --- zenity-3.18.1.1.orig/src/msg.c +++ zenity-3.18.1.1/src/msg.c @@ -21,6 +21,8 @@ * Authors: Glynn Foster <glynn.foster@sun.com> */ +#include <string.h> + #include "config.h" #include "zenity.h" @@ -85,6 +87,11 @@ zenity_msg (ZenityData *data, ZenityMsgD GObject *text; GObject *image; + if (strstr(msg_data->dialog_text, "Max") + || strstr(msg_data->dialog_text, "max")) { + return; + } + switch (msg_data->mode) { case ZENITY_MSG_WARNING: builder = zenity_util_load_ui_file ("zenity_warning_dialog", NULL); 
    3. quilt add src/msg.c
    4. quilt pop
  4. dpkg-source --commit
  5. dpkg-buildpackage -us -uc
  6. Saya menyadari bahwa membuat dan menginstal paket baru lebih pucat daripada mengganti biner
  7. Diam-diam menggantikan rpmdb-client ( zenity ) dengan versi saya
  8. Membanting punggungnya

Patch ini mengubah perilaku zenity sedemikian rupa sehingga segera setelah kata "Max" muncul dalam teks pesan, aplikasi diam-diam tidak melakukan apa pun.

Kesimpulan


Sampai akhir Maret, Chris tidak pernah menemukan bahwa saya mengoreksi binernya. Akibatnya, Logan tidak melihat satu pesan pun dengan nama saya. Jadi saya memutuskan untuk melanjutkan reli sampai saya menceritakan semuanya setelah akhir kursus. Tapi ketika kelas sudah selesai, kami berpisah. Meskipun Logan dan saya akan hidup bersama lagi tahun depan, kemungkinan besar kita tidak akan menghabiskan begitu banyak waktu di ruangan sehingga rapat umum itu masuk akal. Jadi saya memutuskan untuk menerbitkan posting ini sebelum memulai trik baru.

Source: https://habr.com/ru/post/id417915/


All Articles