Ocultar código malicioso - imprima arquivos contendo uma determinada sequência em qualquer lugar da árvore de diretórios [fechado]

17

O objetivo deste quebra-cabeça é aprender como um código malicioso pode ser oculto e descoberto em um programa.

Uma pessoa está fazendo a pergunta:

Por favor, forneça-me algum código de como posso pesquisar um arquivo no Diretório Atual ou em seus Sub-Diretórios.

(Essa é uma variante de uma pergunta real que eu vi postada em um site.)

Para ser mais específico: O OP deseja que você escreva um programa que aceite uma string e um diretório. Ele percorrerá todos os arquivos no diretório e recursivamente todos os seus subdiretórios. Para cada arquivo, ele verificará se o arquivo contém a sequência e, se existir, imprimirá o nome do arquivo. (O programa pode ter recursos adicionais, desde que sejam relevantes para a meta principal, se você desejar.) Não há requisitos na ordem de deslocamento.

No entanto, a principal tarefa deste quebra-cabeça é ocultar no código adicional do programa que fará de bobo a pessoa que pede o programa aos olhos de seus usuários / colegas / chefe / etc. Por exemplo, imprima um texto humilhante em algum momento, como: O autor do programa não sabe como programar, deve devolver seu diploma e ser demitido. Seja criativo.

Regras:

  • A solução não deve ser prejudicial (exceto ridicularizar o OP, é claro). Não deve causar danos irreversíveis aos usuários finais (nada disso rm -rf)! Tais soluções serão desqualificadas.
  • O material de pesca à linha deve estar oculto para que o OP não o encontre facilmente.
  • Não deve ser óbvio que você está vasculhando o OP. O código deve parecer genuíno.
  • A solução deve vir com uma explicação adequada sobre como controlar o OP para que todos possam aprender algo com sua solução. A explicação deve estar oculta em um texto oculto até você clicar (spoilers) . Ao julgar, tente descobrir os trolls sem olhar para a explicação e vote naqueles que são difíceis de descobrir.
  • Tente também ocultar o trolling do OP se ele tentar executar o código algumas vezes. Talvez comece a trollar somente depois de uma data específica ou sob algumas condições que um programador desleixado não testará. Seja criativo e não se esqueça de explicar o truque.
  • Não basta criar um script usando ferramentas existentes, como grepou find. Escreva o programa do zero. Melhor evitar bibliotecas e preferir chamadas de baixo nível - isso tornará o código mais complexo e lhe dará a oportunidade de ocultar as coisas ruins lá.

Este é um . Por favor, julgue de acordo com os pontos acima.

Petr Pudlák
fonte
6
Como "enganará a pessoa que pede o programa aos olhos de seus usuários / colegas / chefe". e "deve devolver seu diploma e ser demitido". quadrado com "A solução não deve ser prejudicial, não deve causar nenhum dano aos seus usuários"?
Emory
Compreendo que você se esforçou mais do que a maioria dos pôsteres de perguntas sobre "trolling", mas todas as perguntas neste site devem ter uma especificação clara e "como posso pesquisar um arquivo no diretório atual" está longe de atender a esse padrão . (Se qualquer pergunta de trollagem de código pode atender a esse padrão é uma questão separada ).
Peter Taylor
@ PeterTaylor Tentei dar uma tarefa mais específica. Se você tiver sugestões mais específicas, eu as aprecio.
Petr Pudlák 01/01
2
@emory o codificador não é o usuário. É possível humilhar o codificador na frente de seus colegas codificadores sem afetar os clientes.
Cruncher
3
Estou votando para encerrar esta questão como fora de tópico, porque ela é oculta .
Erik the Outgolfer,

Respostas:

42

Aqui está a minha solução (em 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 : $!";
    }
}

O primeiro argumento do programa é o diretório e o segundo argumento é a string que estamos procurando. O programa também mostra o número de correspondências em cada arquivo.

Aqui está como pesquisar "VGA" em / 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
$

E agora, aqui está o truque:

O programa funciona exatamente como recomendado, desde que não se encontre nos arquivos. Assim que se encontra, ele começa a prefixar cada arquivo encontrado com loucura. Vamos copiar alguns arquivos no diretório atual e tentar novamente:

$ cp / etc / default / setup-console /etc/bumblebee/xorg.conf.nouveau /etc/bumblebee/xorg.conf.nvidia /etc/htdig/english.0 ./
$ ./mygrep.pl ./ VGA
/ tmp / mygrep / console-setup: 2 correspondências
/tmp/mygrep/english.0: 1 correspondência
Fuck you /tmp/mygrep/mygrep.pl: 9 correspondências
Fuck you /tmp/mygrep/xorg.conf.nouveau: 2 correspondências
Fuck you /tmp/mygrep/xorg.conf.nvidia: 2 correspondências
$
Isto é devido a este código:
$ F eq $ k && / a. ([F cy]) /
Ele testa se o arquivo atual é o programa em execução e, se for, extrai uma parte do programa com um regexp e o afeta para $ c com
$ c = $ c. $ 1
O que é extraído pelo regexp são as declarações de variáveis ​​(as variáveis ​​são nomeadas $ F, @u, $ c, $ k, $ y, $ o, $ u) e dois espaços dos comentários. Eu tive que fazer isso para mantê-lo oculto, mesmo que o programa seja relativamente curto.

Florent Bayle
fonte
Haha, isso é épico.
Soham Chowdhury