У меня есть некоторые файлы perl, которые были «обесцвечены» (не знаю, было ли это из ACME :: Bleach , или что-то подобное). Не очень хорошо владея perl, я хотел бы понять, что делает однострочный файл, который запускает файл, для декодирования следующих пробелов:
$_=<<'';y;\r\n;;d;$_=pack'b*',$_;$_=eval;$@&&die$@;$_
Остальная часть файла - это символы пробелов, и файл сам по себе исполняется ( он находится в каталоге / bin).
[Решение], спасибо @JB.
Часть pack
кажется наиболее сложной, и мне потребовалось время, чтобы заметить, что происходит. Pack берет младший бит только из каждых 8 символов и распаковывает его как двоичный символ с прямым порядком байтов. Таким образом, табуляция становится нулем, а пробел - единицей.
'\t\t \t ' => '#'
in binary:
00001001 00001001 00100000 00100000 00100000 00001001 00100000 0100000
every LSB:
1 1 0 0 0 1 0 0
convert from from big-endian format:
0b00100011 == 35 == ord('#')