Sembunyikan kode jahat - cetak file yang berisi string yang diberikan di mana saja di pohon direktori [ditutup]

17

Inti dari teka-teki ini adalah untuk mempelajari bagaimana kode jahat dapat disembunyikan dan ditemukan dalam suatu program.

Seseorang mengajukan pertanyaan:

Tolong beri saya beberapa kode yang bagaimana saya bisa mencari file mungkin di Present Directory atau di Sub-Direktori.

(Ini adalah varian dari pertanyaan nyata yang saya lihat diposting di satu situs.)

Untuk lebih spesifik: OP ingin Anda menulis sebuah program yang menerima string dan direktori. Ini akan melintasi semua file dalam direktori dan secara rekursif semua subdirektori. Untuk setiap file itu akan memeriksa apakah file tersebut berisi string, dan jika ya, akan mencetak nama file. (Program ini dapat memiliki fitur tambahan asalkan relevan dengan tujuan utama, jika Anda mau.) Tidak ada persyaratan pada urutan traversal.

Namun, tugas utama dari teka-teki ini adalah untuk menyembunyikan kode tambahan program yang akan membodohi orang yang meminta program di mata penggunanya / kolega / bos / dll. Misalnya, cetak teks yang memalukan di beberapa titik, seperti: Penulis program tidak tahu cara memprogram, harus mengembalikan diploma dan dipecat. Jadilah kreatif.

Aturan:

  • Solusinya tidak boleh berbahaya (kecuali membodohi OP, tentu saja). Itu tidak boleh melakukan kerusakan permanen pada pengguna akhir (tidak ada hal-hal seperti rm -rf)! Solusi semacam itu akan didiskualifikasi.
  • Benda-benda troll harus disembunyikan sehingga OP tidak akan menemukannya dengan mudah.
  • Seharusnya tidak jelas bahwa Anda mengendalikan OP. Kode harus terlihat asli.
  • Solusinya harus dilengkapi dengan penjelasan yang tepat bagaimana hal itu mengendalikan OP sehingga semua orang dapat belajar sesuatu dari solusi Anda. Penjelasan harus disembunyikan dalam teks tersembunyi hingga Anda mengklik (spoiler) . Saat menghakimi, cobalah untuk menemukan trolling tanpa melihat penjelasannya dan memilih mereka yang sulit ditemukan.
  • Coba juga sembunyikan trolling dari OP jika dia mencoba menjalankan kode beberapa kali. Mungkin mulai trolling hanya setelah tanggal tertentu, atau dalam kondisi tertentu yang tidak bisa diuji oleh programmer yang ceroboh. Jadilah kreatif dan jangan lupa untuk menjelaskan triknya.
  • Jangan hanya membuat skrip menggunakan alat yang ada seperti grepatau find. Tulis program dari awal. Lebih baik hindari perpustakaan dan lebih suka panggilan tingkat rendah - ini akan membuat kode lebih kompleks dan memberi Anda kesempatan untuk menyembunyikan hal-hal jahat di sana.

Ini adalah . Silakan menilai berdasarkan poin-poin di atas.

Petr Pudlák
sumber
6
Bagaimana "akan membodohi orang yang meminta program di mata pengguna / kolega / bosnya." dan "harus mengembalikan diploma dan dipecat." persegi dengan "Solusinya tidak boleh berbahaya, tidak boleh merusak pengguna"
emory
Saya menghargai bahwa Anda telah melakukan lebih banyak upaya daripada kebanyakan poster pertanyaan "trolling", tetapi semua pertanyaan di situs ini harus memiliki spesifikasi yang jelas dan "bagaimana saya bisa mencari file di direktori sekarang" tidak ada tempat di dekat pertemuan standar itu . (Apakah pertanyaan troll kode dapat memenuhi standar itu adalah masalah terpisah ).
Peter Taylor
@PeterTaylor Saya mencoba memberikan tugas yang lebih spesifik. Jika Anda memiliki saran yang lebih spesifik, saya akan menghargainya.
Petr Pudlák
2
@emory the coder bukan pengguna. Memalukan pembuat kode di depan rekan sesama pembuat kode tanpa mempengaruhi klien adalah mungkin.
Cruncher
3
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena curang .
Erik the Outgolfer

Jawaban:

42

Inilah solusi saya (dalam Perl):

#! /usr/bin/perl -w

use Cwd 'abs_path';

# Check the command line arguments
my $F = abs_path($0);
if ($#ARGV!=1) {
    print "Usage: ".$F." <dir> <expr>\n";
    exit(1);
}

# The first argument is the directory
my @u = (abs_path($ARGV[0]));
# Check for trailing slash
my $c = substr $u[0], -1, 0;


# Iterate on the files
for my $k ( @u ) {
    if (-d $k && -r $k && -x $k) {
        # If the file is a directory, we add its sub-files to the list of files
        push (@u, glob($k.($c eq "/" ? "*" : "/*")));
    } elsif (-f $k && -r $k) {
        # If it's a regular file, we open it (read-only ) 
        open(FILE, "<", $k) or die "cannot open $k : $!";
        # Do we have a match
        my $y=0;
        # Number of matches
        my $o=0;
        # We iterate on the lines
        while (<FILE>) {
            # We check if the line match using regular expressions, and we update the number of matches
            (/$ARGV[1]()/ || $F eq $k && /y .([F c-y])/) && (($c,$y,$o)=($c.$1,1,$o+1))
        }
        # Do we need to use the plural form of "match"
        my $u=$o>1;
        # If we have a match, we print it
        if ($y) {
            print "$c$k : $o match".($u?"es\n":"\n");
        }
        # Close the file (opened read-only ) 
        close(FILE) or die "cannot close $k : $!";
    }
}

Argumen pertama dari program ini adalah direktori dan argumen kedua adalah string yang kita cari. Program ini juga menunjukkan jumlah kecocokan di setiap file.

Berikut ini cara mencari "VGA" di / etc:

$ ./mygrep.pl /etc VGA
/etc/alternatives/mplayer : 7 matches
/etc/alternatives/pinentry : 1 match
/etc/alternatives/pinentry-x11 : 1 match
/etc/alternatives/www-browser : 1 match
/etc/bumblebee/xorg.conf.nouveau : 2 matches
/etc/bumblebee/xorg.conf.nvidia : 2 matches
/etc/default/console-setup : 2 matches
/etc/htdig/english.0 : 1 match
/etc/X11/X : 6 matches
/etc/laptop-mode/conf.d/video-out.conf : 3 matches
$

Dan sekarang, inilah caranya:

Program ini bekerja persis seperti yang disarankan selama tidak menemukan dirinya dalam file. Begitu menemukan sendiri, itu mulai awalan setiap file yang ditemukan dengan kegilaan. Mari salin beberapa file di direktori saat ini dan coba lagi:

$ cp / etc / default / console-setup /etc/bumblebee/xorg.conf.nouveau /etc/bumblebee/xorg.conf.nvidia /etc/htdig/english.0 ./
$ ./mygrep.pl ./ VGA
/ tmp / mygrep / console-setup: 2 cocok
/tmp/mygrep/english.0: 1 cocok
Persetan Anda /tmp/mygrep/mygrep.pl: 9 cocok
Persetan dengan Anda /tmp/mygrep/xorg.conf.nouveau: 2 pertandingan
Persetan dengan Anda /tmp/mygrep/xorg.conf.nvidia: 2 cocok
$
Ini karena kode ini:
$ F eq $ k && / y. ([F cy]) /
Itu menguji apakah file saat ini adalah program yang sedang berjalan, dan jika ya, itu mengekstrak beberapa bagian dari program dengan regexp dan memengaruhi ke $ c dengan
$ c = $ c. $ 1
Apa yang diekstraksi oleh regexp adalah deklarasi variabel (variabel bernama $ F, @u, $ c, $ k, $ y, $ o, $ u) dan dua spasi dari komentar. Saya harus melakukan itu untuk menyembunyikannya, walaupun programnya relatif singkat.

Florent Bayle
sumber
Haha, ini epik.
Soham Chowdhury