2012-03-06 17 views
14

Tuve algunos problemas de correo no deseado en mi servidor y, después de descubrir y eliminar algunos scripts de Perl y PHP, estoy pendiente de comprobar lo que realmente hacen, aunque soy un programador PHP con poca experiencia. Perl, ¿alguien puede darme una mano con la secuencia de comandos aquí:Desencriptar el script Perl ofuscado

http://pastebin.com/MKiN8ifp

(fue una larga línea de código, la escritura se llama list.pl)


el inicio de la secuencia de comandos es:

$??s:;s:s;;$?::s;(.*); ]="&\%[=.*.,-))'-,-#-*.).<.'.+-<-~-#,~-.-,.+,~-{-,.<'`.{'`'<-<--):)++,+#,-.{).+,,~+{+,,<)..})<.{.)-,.+.,.)-#):)++,+#,-.{).+,,~+{+,,<)..})<*{.}'`'<-<--):)++,+#,-.{).+:,+,+,',~+*+~+~+{+<+,)..})<'`'<.{'`'<'<-}.<)'+'.:*}.*.'-|-<.+):)~*{)~)|)++,+#,-.{).+:,+,+,',~+*+~+~+{+<+,)..}) 

Continúa con muy pocos caracteres que no sean de puntuación hasta el final:

0-9\;\\_rs}&a-h;;s;(.*);$_;see; 
+2

Parece normal Perl para mí ... ¿estás seguro de que este guión no está comercialmente autorizado y ofuscado? No estamos aquí para ayudarlo a violar los acuerdos de licencia. –

+0

Me interesaría saber si eso hace algo, pero realmente no quiero ejecutarlo en el trabajo. Me recuerda a uno de [estos] (http://www.cpan.org/misc/japh) – MattLBeck

+2

Incluso un programador de Perl bastante experimentado se avergonzaría frente a la basura de esa manera. No importa mucho lo que hace; es un código horrible –

Respuesta

25

Reemplace el s;(.*);$_;see; con print para obtener this. Reemplace s;(.*);$_;see; nuevamente con print en la primera mitad de la carga útil para obtener this, que es el código de descifrado. La segunda mitad de la carga útil es el código para descifrar, pero no puedo ir más allá, porque como puede ver, el código de descifrado busca una clave en un envvar o una cookie (para que solo el creador del script pueda controlarlo o decodificarlo, presumiblemente), y no tengo esa clave. Esto es bastante razonablemente hecho.

+3

y 'strict' obediente! – mob

+1

Un compañero de trabajo señala que si el código todavía se estaba ejecutando, uno podría hacer 'cat/proc//env' y probablemente descubrir cuál era la clave de cifrado (a través de' E_KEY' o 'HTTP_COOKIE'). – CanSpice

+1

@ The Coder: ¿esta secuencia de comandos estaba visible en la raíz del servidor? Si desea continuar con esto, tal vez quiera poner un nuevo script en su lugar para capturar la clave. – mob

6

Pregunte el módulo B::Deparse para que sea (un poco más) legible.

+0

Lo intenté con el código (que Perl dijo que estaba bien cuando lo revisé con 'perl -c list.pl'); DeParse no quería tener nada que ver conmigo, o tal vez era el código del que se quejaba. ('perl -MO = DeParse list.pl' y algunas variantes menores. El error fue' Subrutina indefinida & B :: DeParse :: compilación llamada en (eval 1) línea 24. CHECK failed - cola de llamadas cancelada.) –

+2

@JonathanLeffler eso es porque Deparse se deletrea Deparse, no DeParse. – hobbs

+1

Gracias - Soy un idiota por no ver eso. La salida Deparse'd no es mucho más fácil de entender, aunque algunas de las expresiones regulares se destacan más claramente. –

17

Para aquellos interesados ​​en la auténtica pétreas ... La primera parte, cuando las miradas de-enredada como esto:

$? ? s/;s/s;;$?/ : 
     s/(.*)/...lots of punctuation.../; 

El $? al comienzo de la línea es el predefinido variable de containing the child error, que sin duda sirve solo como ofuscación. No estará definido, ya que no puede haber ningún error infantil en este punto.

El signo de interrogación después de que es el inicio de un operador ternario

CONDITION ? IF_TRUE : IF_FALSE 

que también se añade simplemente para confundir. La expresión devuelta para verdadero es una expresión regular de sustitución, donde el delimitador de barra oblicua / se ha sustituido por dos puntos s:pattern:replacement:. Arriba, he retrocedido. La otra expresión, que es la que se ejecutará también es una expresión regular de sustitución, aunque increíblemente larga. El delimitador es punto y coma.

Esta sustitución reemplaza a .* en $_ - la entrada por defecto y el espacio de búsqueda de patrones - con una cantidad bastante grande de caracteres de puntuación, que representa la mayor parte del código. Desde .* coincide con cualquier cadena, incluso la cadena vacía, simplemente se conseguirá inserta en $_, y es para todos los efectos idénticos a simplemente asignar la cadena a $_, que es lo que hice:

$_ = q;]="&\%[=.*.,-))'-,-# .......;; 

La siguiente las líneas son un transliteration y otra sustitución.(Inserté comentarios señalar los delimitadores)

y; -"[%-.:<[email protected]]-`{-}#~\$\\;{\$()*.0-9\;\\_rs}&a-h;; 
#^      ^  ^  ^
#1      2      3 

(1,2,3 son delimitadores, el punto y coma entre 2 y 3 se escaparon)

La esencia básica de la misma es que varios caracteres y rangos -" (espacio para comillas dobles), y algo que se parece a las clases de caracteres (con rangos) [%-.:<[email protected]], pero no lo es, se transcribe en caracteres más legibles, por ejemplo llaves, signo de dólar, entre paréntesis, 0-9, etc.

s;(.*);$_;see; 

El siguiente sustitución es donde sucede la magia. También es una sustitución con delimitadores ofuscados, pero con tres modifers: see. s no hace nada en este caso, ya que solo permite que el carácter comodín . coincida con la línea nueva. ee significa evaluar la expresión dos veces, sin embargo.

Para ver lo que estaba evaluando, realicé la transliteración e imprimí el resultado. Sospecho que en algún lugar a lo largo de la línea Tengo algunos caracteres corrompidos, porque había errores sutiles, pero aquí está el corto (limpiado) Versión:

s;(.*);73756220656e6372797074696f6e5f6 .....;; # very long line of alphanumerics 
s;(..);chr(hex($1));eg; 
s;(.*);$_;see; 
s;(.*);704b652318371910023c761a3618265 .....;; # another long line 
s;(..);chr(hex($1));eg; 
&e_echr(\$_); 
s;(.*);$_;see; 

Las largas expresiones regulares son una vez más los contenedores de datos, e insertar datos en $_ para ser evaluado como código.

El s/(..)/chr(hex($1))/eg; está empezando a parecer bastante legible. Básicamente está leyendo dos caracteres en el momento desde $_ y convirtiéndolo de hexadecimal en el carácter correspondiente.

La siguiente a la última línea &e_echr(\$_); me dejó perplejo por un tiempo, pero es una subrutina que se define en algún lugar de este código evaluado, como Hobbs fue capaz de decodificar. El signo de dólar está precedido de una barra invertida, lo que significa que es una referencia al $_: I.e. que la subrutina puede cambiar la variable global.

Después de bastantes evaluaciones, $_ se ejecuta a través de esta subrutina, después de lo cual todo lo que está contenido en $_ se evalúa por última vez. Presumiblemente esta vez ejecutando el código. Como dijo Hobbs, se requiere una clave, que se toma del entorno %ENV de la máquina donde se ejecuta la secuencia de comandos. Que no tenemos

+2

Gracias por tomarse el tiempo para hacer todo esto. – hobbs

+1

De nada. Fue un proyecto divertido. – TLP

Cuestiones relacionadas