#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
части, и, конечно, все эти цветы.