У меня есть некоторые perl-файлы, которые были "отбелены" (не знаю, было ли это из ACME :: Bleach или что-то подобное). Не очень хорошо разбираясь в perl, я хотел бы понять, что делает однострочный файл, запускающий файл, для декодирования следующих пробелов:
$_=<<'';y;\r\n;;d;$_=pack'b*',$_;$_=eval;$@&&die$@;$_
Остальная часть файла состоит из пробельных символов, и файл является исполняемым сам по себе (он помещается в каталог / bin).
[Решение], спасибо @ JB.
Эта часть pack
кажется наиболее сложной, и мне потребовалось некоторое время, чтобы заметить, что происходит. Пак берет LSB только из каждых 8 символов и распаковывает его как двоичный символ с прямым порядком байтов. Следовательно, табуляция становится «0», а пробелы - «1».
'\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('#')