ซ่อนรหัสความชั่วร้าย - ไฟล์พิมพ์ที่มีสตริงที่กำหนดที่ใดก็ได้ในแผนผังไดเรกทอรี [ปิด]


17

จุดประสงค์ของปริศนานี้คือการเรียนรู้วิธีซ่อนรหัสอันตรายและค้นพบในโปรแกรม

บุคคลกำลังถามคำถาม:

ได้โปรดให้รหัสแก่ฉันเพื่อที่ฉันจะค้นหาไฟล์อาจอยู่ในไดเรกทอรีปัจจุบันหรือในไดเรกทอรีย่อย

(นี่เป็นคำถามที่แตกต่างจากคำถามจริงที่ฉันเคยเห็นโพสต์ในเว็บไซต์เดียว)

จะเจาะจงมากขึ้น: OP ต้องการให้คุณเขียนโปรแกรมที่ยอมรับสตริงและไดเรกทอรี มันจะข้ามไฟล์ทั้งหมดในไดเรกทอรีและไดเรกทอรีย่อยทั้งหมดซ้ำ สำหรับแต่ละไฟล์มันจะตรวจสอบว่าไฟล์มีสตริงอยู่หรือไม่และหากเป็นเช่นนั้นจะพิมพ์ชื่อของไฟล์ (โปรแกรมสามารถมีคุณสมบัติเพิ่มเติมได้ตราบใดที่เกี่ยวข้องกับเป้าหมายหลักหากคุณต้องการ) ไม่มีข้อกำหนดในการส่งผ่าน

อย่างไรก็ตามภารกิจหลักของจิ๊กซอว์นี้คือการซ่อนรหัสเพิ่มเติมของโปรแกรมที่จะทำให้คนโง่ของคนที่ขอโปรแกรมในสายตาของผู้ใช้ / เพื่อนร่วมงาน / เจ้านาย / ฯลฯ ตัวอย่างเช่นพิมพ์ข้อความที่น่าอับอายในบางประเด็นเช่น: ผู้เขียนโปรแกรมไม่ทราบวิธีการเขียนโปรแกรมควรส่งคืนประกาศนียบัตรของเขา / เธอและถูกไล่ออก มีความคิดสร้างสรรค์.

กฎ:

  • วิธีการแก้ปัญหาจะต้องไม่เป็นอันตราย (ยกเว้นการหลอกของ OP แน่นอน) มันจะต้องไม่ทำความเสียหายใด ๆ ที่ไม่สามารถย้อนกลับได้ให้กับผู้ใช้ (ไม่เหมือนrm -rf)! การแก้ปัญหาดังกล่าวจะถูกตัดสิทธิ์
  • ควรซ่อนสิ่งที่หมุนรอบเพื่อให้ OP ไม่สามารถหาได้ง่าย
  • ไม่ควรชัดเจนว่าคุณกำลังหลอกโอพี รหัสควรดูเป็นของแท้
  • การแก้ปัญหาต้องมาพร้อมกับคำอธิบายที่ถูกต้องว่ามันหมุนรอบ OP ได้อย่างไรเพื่อให้ทุกคนสามารถเรียนรู้บางอย่างจากการแก้ปัญหา คำอธิบายควรจะซ่อนอยู่ในข้อความที่ซ่อนไว้จนกว่าคุณคลิก (สปอยเลอร์) เมื่อตัดสินให้ลองค้นหาการหมุนรอบโดยไม่ดูคำอธิบายและออกเสียงลงคะแนนสำหรับผู้ที่ยากที่จะค้นพบ
  • และพยายามซ่อนการหมุนรอบจาก OP หากเขาพยายามเรียกใช้รหัสสองสามครั้ง อาจเริ่มต้นหมุนรอบหลังจากวันที่ระบุหรือภายใต้เงื่อนไขที่โปรแกรมเมอร์เลอะเทอะจะไม่ทดสอบ มีความคิดสร้างสรรค์และอย่าลืมอธิบายเคล็ดลับ
  • ไม่เพียงแค่สร้างสคริปต์โดยใช้เครื่องมือที่มีอยู่เช่นหรือgrep findเขียนโปรแกรมตั้งแต่เริ่มต้น หลีกเลี่ยงไลบรารีที่ดีกว่าและต้องการการโทรในระดับต่ำ - นี่จะทำให้โค้ดมีความซับซ้อนมากขึ้นและให้โอกาสคุณในการซ่อนสิ่งชั่วร้ายที่นั่น

นี่คือความนิยมประกวดโปรดตัดสินตามประเด็นข้างต้น


6
"จะทำให้คนโง่ที่ถามโปรแกรมในสายตาของผู้ใช้ / เพื่อนร่วมงาน / เจ้านายได้อย่างไร" และ "ควรส่งคืนประกาศนียบัตรของเขา / เธอและถูกไล่ออก" กำลังสองที่มี "การแก้ปัญหาต้องไม่เป็นอันตรายต้องไม่ทำความเสียหายใด ๆ ต่อผู้ใช้"?
emory

ฉันขอขอบคุณที่คุณใช้ความพยายามมากกว่าผู้โพสต์คำถาม "หลอกหลอน" ส่วนใหญ่ แต่คำถามทั้งหมดในเว็บไซต์นี้ควรมีข้อกำหนดที่ชัดเจนและ "ฉันจะค้นหาไฟล์อาจอยู่ในไดเรกทอรีปัจจุบันได้อย่างไร" อยู่ใกล้กับมาตรฐานดังกล่าวแล้ว . (ไม่ว่าคำถามการหมุนรหัสใด ๆ สามารถเป็นไปตามมาตรฐานนั้นเป็นปัญหาแยกต่างหาก )
Peter Taylor

@PeterTaylor ฉันพยายามมอบหมายให้เฉพาะเจาะจงมากขึ้น หากคุณมีข้อเสนอแนะที่เฉพาะเจาะจงมากขึ้นฉันจะขอบคุณพวกเขา
Petr Pudlák

2
@emory coder ไม่ใช่ผู้ใช้ ความอัปยศอดสูหน้ารหัสเพื่อนของเขาโดยไม่ส่งผลกระทบต่อลูกค้าเป็นไปได้
Cruncher

3
ฉันลงคะแนนให้ปิดคำถามนี้เป็นนอกหัวข้อเพราะมีการใช้งานไม่ได้
Erik the Outgolfer

คำตอบ:


42

นี่คือทางออกของฉัน (ใน 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 : $!";
    }
}

อาร์กิวเมนต์แรกของโปรแกรมคือไดเรกทอรีและอาร์กิวเมนต์ที่สองคือสตริงที่เรากำลังมองหา โปรแกรมยังแสดงจำนวนการแข่งขันในแต่ละไฟล์

นี่คือวิธีการค้นหา "VGA" ใน / 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
$

และตอนนี้นี่คือเคล็ดลับ:

โปรแกรมทำงานตรงตามคำแนะนำตราบใดที่ไม่พบตัวเองในไฟล์ ทันทีที่พบตัวเองมันจะเริ่มนำหน้าแต่ละไฟล์ที่พบด้วยความวิกลจริต ลองคัดลอกไฟล์บางไฟล์ในไดเรกทอรีปัจจุบันแล้วลองอีกครั้ง:

$ 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 ตรงกัน
/tmp/mygrep/english.0: 1 ตรงกัน
มีเพศสัมพันธ์กับคุณ /tmp/mygrep/mygrep.pl: 9 ตรงกัน
มีเพศสัมพันธ์กับคุณ /tmp/mygrep/xorg.conf.nouveau: 2 แมทช์
มีเพศสัมพันธ์กับคุณ /tmp/mygrep/xorg.conf.nvidia: 2 แมทช์
$
นี่เป็นเพราะรหัสนี้:
$ F eq $ k && / y. ([F cy]) /
มันจะทดสอบว่าไฟล์ปัจจุบันคือโปรแกรมที่กำลังรันหรือไม่และถ้าเป็นมันจะแยกบางส่วนของโปรแกรมด้วย regexp และส่งผลกระทบต่อ $ c ด้วย
$ c = $ c. $ 1
สิ่งที่สกัดโดย regexp คือการประกาศตัวแปร (ตัวแปรมีชื่อว่า $ F, @u, $ c, $ k, $ y, $ o, $ u) และช่องว่างสองช่องจากความคิดเห็น ฉันต้องทำเช่นนั้นเพื่อซ่อนไว้แม้ว่าโปรแกรมจะค่อนข้างสั้น


ฮ่าฮ่านี่เป็นมหากาพย์
Soham Chowdhury
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.