악의적 인 코드 숨기기-디렉토리 트리의 어느 곳에서든 주어진 문자열을 포함하는 파일을 인쇄하십시오.


17

이 퍼즐의 요점은 프로그램에서 악성 코드를 숨기고 발견하는 방법을 배우는 것입니다.

사람이 질문을하고 있습니다 :

Plz는 파일을 검색하는 방법이 Present Directory 또는 해당 하위 디렉토리에있을 수있는 코드를 제공합니다.

(이것은 한 사이트에 게시 된 실제 질문의 변형입니다.)

보다 구체적으로 말하면 : OP는 문자열과 디렉토리를 허용하는 프로그램을 작성하려고합니다. 디렉토리의 모든 파일과 재귀 적으로 모든 서브 디렉토리를 순회합니다. 각 파일마다 파일에 문자열이 포함되어 있는지 확인하고 포함되어 있으면 파일 이름을 인쇄합니다. (원하는 경우 프로그램이 주요 목표와 관련이있는 한 추가 기능을 가질 수 있습니다.) 순회 순서에 대한 요구 사항은 없습니다.

그러나이 퍼즐의 주요 임무는 사용자 / 동료 / 보스 등의 눈에 프로그램을 요청하는 사람을 속이는 추가 코드를 프로그램에 숨기는 것입니다. 예를 들어, 다음과 같은 시점에 굴욕적인 텍스트를 인쇄 하십시오. 프로그램 작성자는 프로그래밍 방법을 모르고 졸업장을 반환하여 해고를 당해야합니다. 창의력을 발휘하십시오.

규칙 :

  • 솔루션 은 해롭지 않아야합니다 (물론 OP를 바보로 만드는 것을 제외하고). 최종 사용자에게 돌이킬 수없는 피해를 입히지 않아야합니다 (와 같은 물건 없음 rm -rf)! 이러한 솔루션은 실격 처리됩니다.
  • OP가 쉽게 찾을 수 없도록 트롤링 항목을 숨겨야합니다.
  • OP를 트롤링하고 있다는 것은 분명하지 않습니다. 코드는 진짜처럼 보일 것입니다.
  • 솔루션 에는 모든 사람이 솔루션에서 무언가를 배울 수 있도록 OP를 조정하는 방법에 대한 적절한 설명 이 제공 되어야합니다 . 설명은 클릭 할 때까지 숨겨진 텍스트 (스포일러)에 숨겨져 야합니다 . 심사 할 때 설명을 보지 않고 트롤링을 발견하고 발견하기 어려운 사람들에 투표하십시오.
  • 또한 코드를 몇 번 실행하려고하면 OP에서 트롤링을 숨기십시오. 아마도 특정 날짜 이후 또는 조잡한 프로그래머가 테스트하지 않는 일부 조건에서만 트롤링을 시작합니다. 창의력을 발휘하고 트릭을 설명하는 것을 잊지 마십시오.
  • grep또는 과 같은 기존 도구를 사용하여 스크립트를 만들지 마십시오 find. 처음부터 프로그램을 작성하십시오. 라이브러리를 피하는 것이 좋으며 저수준 호출을 선호합니다. 이렇게하면 코드가 더 복잡해지고 악의적 인 것을 숨길 수 있습니다.

이것은 입니다. 위의 사항에 따라 판단하십시오.


6
"사용자 / 동료 / 보스의 눈에 프로그램을 요청하는 사람을 속이는 방법" "그의 졸업장을 돌려줘야 해." "솔루션은 유해하지 않아야합니다. 사용자에게 피해를 입히지 말아야합니다"로 표시하십시오
emory

대부분의 "트롤링"질문 포스터보다 더 많은 노력을 기울여 주셔서 감사하지만이 사이트의 모든 질문에는 명확한 사양이 있어야하며 "파일을 현재 디렉토리에있을 수있는 파일을 검색하는 방법"은 그 표준을 충족하지 못합니다. . (코드 트롤링 질문이 해당 표준을 충족시킬 수 있는지 여부는 별도의 문제입니다 ).
피터 테일러

@PeterTaylor 더 구체적인 과제를 주려고했습니다. 더 구체적인 제안이 있으시면 감사하겠습니다.
Petr Pudlák 2012 년

2
@emory 코더는 사용자가 아닙니다. 클라이언트에 영향을주지 않고 동료 코더 앞에서 코더를 굴욕시키는 것이 가능합니다.
Cruncher

3
나는 그것이 있기 때문에 오프 주제로이 질문을 닫습니다 투표를하고있어 불공정 .
아웃 골퍼 에릭

답변:


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

프로그램의 첫 번째 인수는 디렉토리이고 두 번째 인수는 찾고있는 문자열입니다. 이 프로그램은 또한 각 파일에서 일치하는 횟수를 보여줍니다.

/ etc에서 "VGA"를 검색하는 방법은 다음과 같습니다.

$ ./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 일치
Fuck you /tmp/mygrep/mygrep.pl : 9 일치
Fuck you /tmp/mygrep/xorg.conf.nouveau : 2 일치
Fuck you /tmp/mygrep/xorg.conf.nvidia : 2 일치
$
이것은 다음 코드 때문입니다.
$ F eq $ k && / y. ([Fcy]) /
현재 파일이 실행중인 프로그램인지 테스트하고, 존재하면 정규 표현식으로 프로그램의 일부를 추출하여 $ c에 영향을 미칩니다.
$ c = $ c. $ 1
정규 표현식에 의해 추출되는 것은 변수 선언 (변수는 $ F, @u, $ c, $ k, $ y, $ o, $ u)과 주석에서 두 공백입니다. 프로그램이 비교적 짧은 경우에도 숨겨두기 위해 그렇게해야했습니다.


하하, 이것은 서사시입니다.
Soham Chowdhury
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.