Как работает этот запутанный Perl-скрипт?

#perl #obfuscation

#perl #запутывание

Вопрос:

Кто-то попросил меня помочь ему де-запутать следующий Perl-скрипт, который был отправлен ему, подозревая, что он подключался к каким-то внешним серверам и т.д. Однако я не эксперт по Perl, поэтому я не смог по-настоящему понять все, что здесь происходит.

По его словам, скрипт должен обрабатывать input.txt файл и сгенерируйте из него HTML-файл с некоторыми параметрами командной строки A, B, C, ... . Итак, вы можете запустить скрипт с:

 MAGIC_NO_JAVASCRIPT=1 perl ./179252S0 gghkla5673lju-magic input.txt 1 A B C > output.html
  

Запутанный Perl-скрипт 179252S0 содержит только следующую строку,
далее следует ~ 1 МБ строк с различным количеством пробелов и табуляций
в каждой строке. Я приведу только 1-ю строку, но вы можете скачать и
посмотрите на весь фрагмент здесь.

Первая строка выглядит следующим образом:

 $_=<<'';y;rn;;d;$_=pack'b*',$_;$_=eval;$@amp;amp;die$@;$_
  

Что это делает, и как я могу это понять?

Мне действительно удалось увидеть часть кода, заменив $_=eval на print $_ , но этот код также был запутан.

РЕДАКТИРОВАТЬ: Благодаря анализу Слейда и некоторой ручной работе я могу заключить, что остальная часть этого скрипта была запутана с помощью Acme:: Floral с использованием чего-то вроде:

 perl -MAcme::Floral my_script.pl > floral_script.pl
  

и сетевые вызовы выполняются для:

  • а) веб-инструментальный сайт для предоставления статистики и встроенного в результирующую *.html страницу счетчика страниц.
  • б) другой сайт для захвата файлов изображений для загрузки html.

Но из-за последнего запутывания мы не можем полностью исключить, что происходит что-то еще, без большого объема дополнительной работы.


PS. Я оставил исходное имя и загадочный аргумент «magic», поскольку я думаю, что алгоритм де-запутывания также зависит от этого.

Комментарии:

1. Вот он, с удаленным первым слоем запутывания: ссылка . Имена переменных и функций по-прежнему запутаны. Это кажется, по крайней мере, на первый взгляд, безвредным, но трудно сказать.

2. Спасибо, это выглядит намного лучше, чем то, что я получил. Этот код, должно быть, был создан механизмом запутывания. Кто-нибудь распознает, какой именно?

3. Похоже, что Acme:: Floral использовался для создания запутанных имен переменных и подпрограмм. Однако пробелы выглядят ad hoc, поскольку это не особенно надежное средство запутывания.

Ответ №1:

Давайте начнем с очистки запутанного синтаксиса первой строки. $_=<<''; становится

 $_ = <<'';
  

Это просто heredoc без разделителя; он считывает все, что находится под строкой, в переменную $_ .

y;rn;;d; становится

 tr/rn//d;
  

Это просто оператор транслитерации, использующий точки с запятой в качестве разделителей и sed-подобную y/// форму, что означает то же самое, что и tr/// . Флаг d означает, что символы без замен будут удалены, а tr по умолчанию работает с $ _ , поэтому этот оператор просто удаляет окончания строк в стиле DOS из содержимого $ _ .

$_=pack'b*',$_; становится

 $_ = pack('b*', $_);
  

Который принимает содержимое $ _ и обрабатывает его как битовую строку, превращая все эти пробелы в текстовую строку кода Perl.

$_=eval;$@amp;amp;die$@;$_ становится

 $_ = eval;
$@ amp;amp; die $@;
$_
  

В первой строке здесь используется форма «string eval» eval . Он возьмет код, который был транслитерирован и распакован, затем проанализирует и выполнит его.

$@ amp;amp; die $@; это просто глупый способ написания die $@ if $@; . $@ — переменная ошибки eval; если код не удалось разобрать и выполнить правильно, она будет содержать значение true, поэтому скрипт завершит работу с этой ошибкой, если она была.

Последнее $_ после этого будет последним выражением, которое увидит интерпретатор. Ему было присвоено возвращаемое значение инструкции eval, которое будет истинным тогда и только тогда, когда код, переданный eval , был успешно проанализирован. Модули Perl требуют, чтобы последним выражением в файле было некоторое истинное значение (обычно просто 1; ). Размещение $_ здесь будет указывать на сбой загрузки модуля, если что-то пошло не так с деобфускацией.

Был ли прав ваш друг насчет подключения к внешним серверам или нет, определить гораздо сложнее. Пара поисковых запросов по нему, похоже, указывает на то, что он не импортирует никаких сетевых модулей (единственными use инструкциями являются use strict 'refs'; , а их нет requires ), и, похоже, он не использует никаких подозрительных встроенных модулей (никаких eval s, кроме того, что в первой строке; никаких функций, которые взаимодействуют с файловой системой, кроме open , которая предположительно используется для обработки входного текстового файла; ни одна из встроенных сетевых функций Perl (все из которых начинаются с ‘set’, ‘get’ или ‘end’); и ни одна из функций сокета Perl.

Конечно, нет гарантии, что генерируемый им JavaScript является безопасным, но, похоже, что Perl-скрипт не обращается к сети. При условии, что скрипт не делает ничего явно вредоносного при выполнении, ваш друг может попробовать использовать инструмент, подобный Wireshark, для поиска любой вредоносной сети, для обнаружения которой в противном случае потребовался бы изнурительный аудит.

Комментарии:

1. Спасибо. Больше, чем я мог бы попросить. Больше всего меня смутили y/// форма и die части, и, конечно, все эти цветы.