Ẩn mã ác - in các tệp có chứa một chuỗi đã cho ở bất kỳ đâu trong cây thư mục [đã đóng]


17

Điểm chính của câu đố này là tìm hiểu làm thế nào một mã độc có thể được ẩn và phát hiện trong một chương trình.

Một người đang đặt câu hỏi:

Xin vui lòng cho tôi một số mã rằng làm thế nào tôi có thể tìm kiếm một tệp có thể có trong Thư mục hiện tại hoặc trong Thư mục con của nó.

(Đây là một biến thể của một câu hỏi thực sự tôi đã thấy được đăng trên một trang web.)

Để cụ thể hơn: OP muốn bạn viết chương trình chấp nhận chuỗi và thư mục. Nó sẽ duyệt qua tất cả các tệp trong thư mục và đệ quy tất cả các thư mục con của nó. Đối với mỗi tệp, nó sẽ kiểm tra xem tệp có chứa chuỗi hay không và nếu có, sẽ in tên của tệp. (Chương trình có thể có các tính năng bổ sung miễn là chúng có liên quan đến mục tiêu chính, nếu bạn muốn.) Không có yêu cầu nào về thứ tự truyền tải.

Tuy nhiên, nhiệm vụ chính của câu đố này là ẩn vào mã bổ sung của chương trình sẽ khiến một người ngu ngốc yêu cầu chương trình trong mắt người dùng / đồng nghiệp / sếp / v.v. Ví dụ, in một văn bản nhục nhã tại một số điểm, chẳng hạn như: Tác giả của chương trình không biết cách lập trình, nên trả lại bằng tốt nghiệp của mình và bị đuổi việc. Sáng tạo.

Quy tắc:

  • Tất nhiên, giải pháp không được gây hại (ngoại trừ việc đánh lừa OP). Nó không được gây ra bất kỳ thiệt hại không thể đảo ngược cho người dùng cuối (không có nội dung như rm -rf)! Những giải pháp như vậy sẽ bị loại.
  • Các công cụ trolling nên được ẩn đi để OP không tìm thấy nó dễ dàng.
  • Không nên rõ ràng rằng bạn đang troll OP. Các mã nên nhìn chính hãng.
  • Giải pháp phải đi kèm với một lời giải thích phù hợp về cách nó troll OP để mọi người có thể học được điều gì đó từ giải pháp của bạn. Lời giải thích nên được ẩn trong một văn bản ẩn cho đến khi bạn nhấp (spoilers) . Khi phán xét, hãy cố gắng khám phá sự trolling mà không nhìn vào lời giải thích và bỏ phiếu cho những người khó khám phá.
  • Ngoài ra, hãy cố gắng che giấu sự trolling khỏi OP nếu anh ấy cố gắng chạy mã một vài lần. Có lẽ bắt đầu troll chỉ sau một ngày cụ thể hoặc trong một số điều kiện mà một lập trình viên cẩu thả sẽ không kiểm tra. Hãy sáng tạo và đừng quên giải thích mánh khóe.
  • Đừng chỉ tạo một tập lệnh bằng các công cụ hiện có như grephoặc find. Viết chương trình từ đầu. Tốt hơn nên tránh các thư viện và thích các cuộc gọi cấp thấp - điều này sẽ làm cho mã phức tạp hơn và cho bạn cơ hội để che giấu những thứ xấu xa ở đó.

Đây là một . Hãy đánh giá theo các điểm trên.


6
Làm thế nào "sẽ làm cho một người ngu ngốc yêu cầu chương trình trong mắt người dùng / đồng nghiệp / ông chủ của nó." và "nên trả lại bằng tốt nghiệp của mình và bị đuổi việc." vuông với "Giải pháp không được gây hại, không được gây thiệt hại cho người dùng"?
emory

Tôi đánh giá cao rằng bạn đã nỗ lực nhiều hơn hầu hết các câu hỏi "trolling", nhưng tất cả các câu hỏi trên trang web này phải có thông số rõ ràng và "làm cách nào tôi có thể tìm kiếm một tệp trong thư mục hiện tại" không thể đáp ứng tiêu chuẩn đó . (Cho dù bất kỳ câu hỏi troll mã nào có thể đáp ứng tiêu chuẩn đó là một vấn đề riêng biệt ).
Peter Taylor

@PeterTaylor Tôi đã cố gắng đưa ra một nhiệm vụ cụ thể hơn. Nếu bạn có đề xuất cụ thể hơn, tôi sẽ đánh giá cao chúng.
Petr Pudlák

2
@emory người viết mã không phải là người dùng. Làm nhục người lập trình trước mặt các lập trình viên đồng nghiệp của mình mà không ảnh hưởng đến khách hàng là điều có thể.
Cruncher

3
Tôi bỏ phiếu để đóng câu hỏi này như off-topic vì nó được lén lút .
Erik the Outgolfer

Câu trả lời:


42

Đây là giải pháp của tôi (bằng 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 : $!";
    }
}

Đối số đầu tiên của chương trình là thư mục và đối số thứ hai là chuỗi chúng ta đang tìm kiếm. Chương trình cũng hiển thị số lượng trận đấu trong mỗi tập tin.

Đây là cách tìm kiếm "VGA" trong / 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
$

Và bây giờ, đây là mẹo:

Chương trình hoạt động chính xác như được tư vấn miễn là nó không gặp phải trong các tệp. Ngay khi gặp chính nó, nó bắt đầu tiền tố mỗi tệp được tìm thấy với sự điên rồ. Hãy sao chép một số tệp trong thư mục hiện tại và thử lại:

$ 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 trận đấu
/tmp/mygrep/english.0: 1 trận đấu
Cố lên bạn /tmp/mygrep/mygrep.pl: 9 trận đấu
Cố lên bạn /tmp/mygrep/xorg.conf.nouveau: 2 trận đấu
Cố lên bạn /tmp/mygrep/xorg.conf.nvidia: 2 trận đấu
$
Điều này là do mã này:
$ F eq $ k && / y. ([F cy]) /
Nó kiểm tra xem tệp hiện tại có phải là chương trình đang chạy hay không và nếu có, nó sẽ trích xuất một phần của chương trình với biểu thức chính quy và ảnh hưởng đến $ c với
$ c = $ c. $ 1
Những gì được trích xuất bởi biểu thức chính là các khai báo biến (các biến được đặt tên $ F, @u, $ c, $ k, $ y, $ o, $ u) và hai khoảng trắng từ các bình luận. Tôi đã phải làm điều đó để giữ nó ẩn, ngay cả khi chương trình tương đối ngắn.


Haha, đây là sử thi.
Soham Chowdhury
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.