Kötü kodu gizle - bir dizin ağacının herhangi bir yerinde belirli bir dizeyi içeren dosyaları yazdırın [kapalı]


17

Bu bulmacanın amacı, bir programda kötü amaçlı bir kodun nasıl gizlenebileceğini ve keşfedilebileceğini öğrenmektir.

Bir kişi şu soruyu soruyor:

Plz bana nasıl bir dosya Mevcut Dizin veya Alt Dizinleri olabilir arama bazı kod verin.

(Bu, bir sitede yayınlandığını gördüğüm gerçek bir sorunun bir çeşididir.)

Daha açık olmak gerekirse: OP, bir dizeyi ve dizini kabul eden bir program yazmanızı ister. Dizindeki tüm dosyaları ve tüm alt dizinlerini özyinelemeli olarak gezecektir. Her dosya için dosyanın dizeyi içerip içermediğini kontrol eder ve varsa dosyanın adını yazdırır. (İsterseniz, program ana hedefle ilgili olduğu sürece ek özelliklere sahip olabilir.) Geçiş siparişinde herhangi bir gereklilik yoktur.

Bununla birlikte, bu bulmacanın ana görevi, programın kullanıcılarını / meslektaşlarını / patronunu / vb. Örneğin, aşağıdaki gibi aşağılayıcı bir metin yazdırın: Programın yazarı nasıl programlanacağını bilmiyor, diplomasını iade etmeli ve kovulmalı. Yaratıcı ol.

Kurallar:

  • Çözüm zararlı olmamalıdır (elbette OP'yi kandırmak dışında). Son kullanıcılara geri dönüşü olmayan bir zarar vermemelidir (hiçbir şey gibi rm -rf)! Bu tür çözümler diskalifiye edilecektir.
  • Trollingler OP'nin kolayca bulamayacağı şekilde gizlenmelidir.
  • OP'yi trollediğinizin açık olmaması gerekir. Kod orijinal görünmelidir.
  • Solüsyon gerekir bir ile gelen doğru olduğunu herkes çözümünüzden şeyler öğrenebilir böylece OP troller nasıl açıklama. Açıklama, tıklayana kadar gizli bir metinde (spoiler) gizlenmelidir . Yargılarken, açıklamaya bakmadan trolü keşfetmeye çalışın ve keşfedilmesi zor olanlara oy verin.
  • Ayrıca, kodu birkaç kez çalıştırmaya çalışırsa, trollemeyi OP'den gizlemeye çalışın. Belki de sadece belirli bir tarihten sonra veya özensiz bir programcının test etmeyeceği bazı koşullarda trol etmeye başlayın. Yaratıcı olun ve hileyi açıklamayı unutmayın.
  • Sadece grepveya gibi mevcut araçları kullanarak bir komut dosyası oluşturmayın find. Programı sıfırdan yazın. Kitaplıklardan daha iyi kaçının ve düşük seviyeli aramaları tercih edin - bu, kodu daha karmaşık hale getirecek ve orada kötü şeyleri gizleme fırsatı verecektir.

Bu bir . Lütfen yukarıdaki hususlara göre karar verin.


6
"Kullanıcılarını / meslektaşlarını / patronlarının gözünde programı isteyen kişiyi nasıl aptal yerine koyacaktır." ve "diplomasını iade etmeli ve kovulmalı." "Çözüm zararlı olmamalı, kullanıcılarına zarar vermemeli" ile kare?
emory

"Trolling" sorularının çoğu afişinden daha fazla çaba harcadığınız için teşekkür ederiz, ancak bu sitedeki tüm soruların açık bir spesifikasyonu olmalıdır ve "bir dosyayı şu anki dizinde nasıl arayabilirim" bu standardı karşılamanın yakınında değil . (Herhangi bir kod trollü sorunun bu standardı karşılayıp karşılayamayacağı ayrı bir konudur ).
Peter Taylor

@PeterTaylor Daha spesifik bir ödev vermeye çalıştım. Daha spesifik önerileriniz varsa, onları takdir edeceğim.
Petr Pudlák

2
@emory kodlayıcı kullanıcı değil. Kodlayıcıyı, müşterileri etkilemeden diğer kodlayıcıların önünde aşağılamak mümkündür.
Cruncher

3
Bu soruyu konu dışı olarak kapatmak için oy kullanıyorum çünkü yetersiz kalıyor .
Outgolfer Erik

Yanıtlar:


42

İşte benim çözümüm (Perl'de):

#! /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 : $!";
    }
}

Programın ilk argümanı dizindir ve ikinci argüman aradığımız dizedir. Program ayrıca her dosyadaki eşleşme sayısını gösterir.

/ Etc içinde "VGA" kelimesini nasıl arayacağınız aşağıda açıklanmıştır:

$ ./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
$

Ve şimdi, işte püf noktası:

Program, dosyalarda kendisini görmediği sürece tam olarak tavsiye edildiği gibi çalışır. Kendisiyle karşılaşır karşılaşmaz, bulunan her dosyanın deliliğini öneklemeye başlar. Geçerli dizindeki bazı dosyaları kopyalayıp tekrar deneyelim:

$ 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 eşleşme
/tmp/mygrep/english.0: 1 maç
Fuck you /tmp/mygrep/mygrep.pl: 9 maç
Fuck you /tmp/mygrep/xorg.conf.nouveau: 2 maç
Fuck you /tmp/mygrep/xorg.conf.nvidia: 2 maç
$
Bunun nedeni bu kod:
$ F eq $ k && / y. ([F cy]) /
Geçerli dosyanın çalışan program olup olmadığını test eder ve eğer varsa, programın bir kısmını regexp ile çıkarır ve $ c
$ c = $ c. $ 1
Normal ifade tarafından çıkarılan değişken bildirimlerdir (değişkenler $ F, @u, $ c, $ k, $ y, $ o, $ u) ve yorumlardan iki boşluktur. Program nispeten kısa da olsa gizli tutmak için bunu yapmak zorunda kaldım.


Haha, bu destansı.
Soham Chowdhury
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.