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:
- Masuk melalui SSH ke komputer saat pengguna menjalankan siaran
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:
- Sebenarnya keteraturan
- 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:
- Sesuatu yang menangani input pengguna
- Sesuatu mengeksekusi perintah sewenang-wenang sebagai pengguna web
Jadi saya datang ke:
- Nginx
- Ekstensi FPM untuk NGINX
- Php
- Paket FPM untuk PHP
Akibatnya, saya membuat situs dengan halaman
logan.html
logan.html dan "halaman tindakan"
zenity.php
:
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 $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:
- Memilih pesan kesalahan acak
- Memilih jenis kotak dialog.
- Memperagakan pesan untuk jangka waktu tertentu (10 detik)
- 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
:
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:
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
:
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:
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:
- Dikonfigurasi agar mengunduh sumber (dalam hal ini, menambahkan
deb-src
ke /etc/apt/sources.list
) apt-get source zenity
- Membuat tambalan dengan
quilt
:
quilt new myPatch.diff
- Patch untuk
src/msg.c
yang menentukan keberadaan kata "Max" di badan pesan:
quilt add src/msg.c
quilt pop
dpkg-source --commit
dpkg-buildpackage -us -uc
- Saya menyadari bahwa membuat dan menginstal paket baru lebih pucat daripada mengganti biner
- Diam-diam menggantikan
rpmdb-client
( zenity
) dengan versi saya - 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.