--- /dev/null
+## Perl
+
+Perl -- интерпретируемый язык предназначенный для работы с текстовой информацией.
+Во втором исследовании мне захотелось выяснить, можно ли использовать natch для быстрого нахождения точек входа для исследования незнакомого программного проекта.
+С внутренностями Perl'а я знаком крайне поверхностно, и стало интересно можно ли при помощи natch быстро найти что-то новое, например выяснить, какой вызов отвечает за первоначальный разбор синтаксических выражений, когда мы вызываем команду `eval` передавая ей строку содержащую фрагмент программы.
+Надо каким-то образом пометить содержимое этой строки и посмотреть как ее содержимое будет распространяться по графу вызовов.
+
+### План эксперемента
+
+* Собрать perl с отладочной информацией
+* На простом примере убедиться что отслеживание помеченных данных работает:
+ * Пометить данные в файле;
+ * В Perl-скрипте считать содержимое помеченного файла в переменную;
+ * В том же скрипте вывести значение переменной на стандартный вывод;
+ * Пронаблюдать движение данных через внутренние структуры и вызовы Perl.
+* Аналогичным способом отследить попадание помеченных данных в оператор языка Perl -- `eval`:
+ * В некий файл записать несколько perl-операторов выполняющих какое-либо осмысленное действие;
+ * Пометить данные в этом файле;
+ * В Perl-скрипте считать данные из помеченного файла в переменную;
+ * Выполнить операцию `eval` для содержимого вышеупомянутой переменной;
+ * Пронаблюдать стек вызовов по которому будут передаваться помеченные данные и найти вызов отвечающий за работу оператора `eval`.
+
+### Сборка и установка
+
+Для кастомной сборки интерпретатора Perl воспользуемся утилитой `perlbrew` специально предназначенной для организации одновременной работы с несколькими версиями интерпретатора Perl, включая возможность автоматической сборки нужной версии из исходников.
+
+Все инструкции по сборке приведены на примере дистрибутива Debian 12.
+
+#### Установка зависимостей
+
+Список зависимостей необходимых для сборки интерпретатора Perl естественным образом присутствует в мета-информации пакета исходников `perl` входящего в Debain. Для установки необходимых зависимостей воспользуемся штатным механизмом установки зависимостей необходимых для сборки пакета исходников:
+
+```bash
+$ sudo apt-get build-dep perl
+```
+
+#### Подготовка к сборке
+
+Установим пакет `perlbrew` из состава дистрибутива Debian
+
+```bash
+$ sudo apt-get install perlbrew
+```
+
+и проведем инициализацию его окружения
+
+```bash
+$ perlbrew init
+
+perlbrew root (~/perl5/perlbrew) is initialized.
+
+[....]
+
+Happy brewing!
+```
+
+#### Сборка
+
+Получим список доступных для сборки версий Perl
+
+```bash
+$ perlbrew available
+
+ perl-5.40.1
+ perl-5.38.3
+[......]
+ perl-5.10.1
+ perl-5.8.9
+ perl-5.6.2
+```
+
+Как мы видим на момент проведения эксперимента самой свежей версией была `perl-5.40.1`.
+Будем использовать именно ее в своей работе.
+
+Узнав номер желаемой версии даем команду на выполнение сборки
+
+```bash
+$ perlbrew install -DEBUGGING=both -v perl-5.40.1 --as=5.40.1-dbg
+```
+
+Здесь: опцией `-v perl-5.40.1` мы указываем какую версию Perl мы желаем собрать, опция `-DEBUGGING=both` будет передана программе конфигурации сборочной системе Perl и являет собой инструкцию провести сборку с отладочной информацией, которая будет нам необходима при проведении taint-анализа.
+Опцией `--as=5.40.1-dbg` мы задаем кастомное имя сборки, добавив суффикс `-dbg` к имени по умолчанию, чтобы было визуально отличить сборку с отладочной информацией от обычной сборки.
+
+Процесс сборки замет какое-то не нулевое время.
+
+Бинарные файлы получившиеся в результате сборки будут установлены в директорию `~/perl5/perlbrew/perls/perl-5.40.1-dbg/bin`.
+(Это знание нам пригодиться в дальнейшем при проведении taint-анализа
+
+#### Проверка
+
+После того как сбора успешно завершится, имя сборки появится в списке доступных для использования сборок Perl:
+
+```bash
+$ perlbrew list
+ 5.40.1-dbg
+```
+
+Проверим, что мы можем воспользоваться новой сборкой. Для начала убедимся, что по умолчанию нам доступен системный Perl:
+
+```bash
+$ perl -v
+
+This is perl 5, version 36, subversion 0 (v5.36.0) built for x86_64-linux-gnu-thread-multi
+[......]
+```
+
+Далее используя утилиту `perlbrew` переключимся на нашу кастомную сборку Perl
+
+```bash
+$ perlbrew use 5.40.1-dbg
+
+A sub-shell is launched with 5.40.1-dbg as the activated perl. Run 'exit' to finish it.
+```
+
+И убедимся, что теперь по умолчанию используется Perl другой версии
+
+```bash
+$ perl -v
+
+This is perl 5, version 40, subversion 1 (v5.40.1) built for x86_64-linux
+```
+
+### Эксперимент №1
+### Отслеживание помеченных данных проходящих через скаляр
+
+#### Подготовка эксперимента
+
+В домашней директории создадим директорию `perl` и в ней файл `in1` с содержимым `Hello, World!`
+
+```bash
+$ mkdir ~/perl
+$ echo Hello, World! >~/perl/in1
+```
+
+В той же директории создадим файл `test_scalar.pl` с содержимым:
+
+```perl
+#!/usr/bin/perl
+
+use strict;
+
+print "Perl is $]!\n";
+
+open F, "in1";
+my $s = <F>;
+close F;
+chomp $s;
+print "** $s **\n";
+```
+Сделать это можно например так:
+
+```bash
+$ editor ~/perl/test_scalar.pl
+# Вводим или вставляем из буфера программу программу
+
+$ chmod +x $ editor ~/perl/test_scalar.pl
+```
+
+Помимо содержимого файла `in1` приведенный выше скрипт выводит версию интерпретатора Perl на котором он исполняется, что позволит в процессе проведения эксперимента убедится, что используется нужная сборка интерпретатора Perl.
+
+Проверяем работоспособность созданного скрипта:
+
+```bash
+
+$ perlbrew use 5.40.1-dbg
+$ cd ~/perl
+$ perl test_scalar.pl
+```
+
+Скрипт должен вывести следующие:
+
+```
+Perl is 5.040001!
+** Hello, World! **
+```
+
+Обращаю внимание на необходимость явным образом запускать интепретатор и передавать ему имя файла со скриптом в качестве параметра, поскольку Ша-Банг (#!) по умолчанию указываемый в скрипте указывает на системный перл, perlbrew не в силах этого изменить, он может только добавить в пути поиска из переменной PATH путь к нужной сборке perl. Таким образом при явном вызове интерпретатора будет использоваться кастомная сборка Perl, a при запуске скрипта без указания интерпретатора -- системная.
+
+#### Создание проекта natch
+
+При создании проекта natch, уже на host-машине следуем штатной инструкции, в качестве источника помеченных данных указываем файл `in1` из домашней директории на виртуалке.
+В моем случае `/home/nataraj/perl/in1`. В качестве директории содержащий дополнительные модули с отладочной информацией указать место куда были установлены бинарные файлы собранные `perlbrew` (cм. выше).
+В моем случае это `/home/nataraj/perl5/perlbrew/perls/perl-5.40.1-dbg/bin`.
+
+#### Запись трассы
+
+- Запускаем штатным образом запись трассы используя команду `natch record`;
+- В появившемся окне виртуальной машины логинимся в виртуалку;
+- Переходим в директорию с подготовленными для исследования файлами: `cd perl`;
+- Используя `perlbrew` переключаем интерпретатор Perl на собранный нами: `perlbrew use 5.40.1-dbg`;
+- В консоли Natch делаем первый снапшот (см. штатный tutorial);
+- В окне виртуальной машины запускаем скрипт подготовленный для исследования `perl test_scalar.pl`;
+- В консоли Natch делаем второй снапшот;
+- Завершаем работу Natch.
+
+#### Генерация отчета
+
+Далее следуя штатной инструкции при помощи команды `natch replay` снимаем трассу между первым и вторым снепшотом и загружаем ее в snatch.
+
+#### Анализ результатов
+
+##### Ресурсы
+
+
+
+Если заглянуть в раздел "Ресурсы" можно увидеть, что в юзер-спейсе помеченные данные проходили только через бинарную программу perl и библиотеку libc. Данные были прочитаны из файла `/home/nataraj/perl/in1`
+
+
+
+И записаны в устройство виртуального терминала `/dev/tty1`
+
+
+
+что вполне отвечает нашим ожиданиям.
+
+##### Дерево вызовов
+
+
+
+Если посмотреть на дерево вызовов, анатомия интерпретатора Perl становится в общем и целом понятной
+
+`perl_run` и `Perl_runops_debug` очень похожи на вызовы оборачивающие все исполнение скрипта
+
+`Perl_do_readline` вероятнее всего реализация операции чтения из файла `$s = <F>;`. В вызове `Perl_sv_gets` префикс `sv_` по конвенции обозначает работу со скалярным значением, это я знаю...
+
+`Perl_pp_schop` -- реализация вызова `chomp $s;`
+
+`Perl_pp_multiconcat` вероятнее всего занимается подстановкой значений в строковой литерал, являющейся аргументом оператора `print`
+
+`Perl_pp_print` по всей видимости является реализацией оператора `print`
+
+##### Выводы
+
+В принципе Natch не является профильным инструментом для исследования архитектуры сложных проектов, однако может быть использован и для этой цели.
+Результат получается красивый и наглядный, и при наличии навыка его получение не требует больших усилий.
+
+### Эксперимент №2
+### Отслеживание помеченных данных передаваемых в оператор `eval`
+
+#### Подготовка эксперимента
+
+Для исследования перемещения помеченных данных через оператор `eval` запишем в файл `in2` небольшую perl-программу:
+
+```bash
+$ echo 'my $aaa = "Hello, World!";' >~/perl/in2
+$ echo 'print $aaa;' >>~/perl/in2
+```
+
+И так же создадим perl-скрипт `test_eval.pl` который будет читать содержимое файла `in2` и выполнять его при помощи оператора `eval`:
+
+```perl
+#!/usr/bin/perl
+
+use strict;
+
+print "Perl is $]!\n";
+
+open F, "in2";
+$/ = "";
+my $s = <F>;
+close F;
+
+print "** ";
+eval $s;
+print " **\n";
+
+```
+
+Сделать это можно например так:
+
+```bash
+$ editor ~/perl/test_eval.pl
+# Вводим или вставляем из буфера программу программу
+
+$ chmod +x $ editor ~/perl/test_eval.pl
+```
+
+Проверяем работоспособность созданного скрипта:
+
+```bash
+
+$ perlbrew use 5.40.1-dbg
+$ cd ~/perl
+$ perl test_eval.pl
+```
+
+Скрипт должен вывести следующие:
+
+```
+Perl is 5.040001!
+** Hello, World! **
+```
+
+#### Проведение эксперимента
+
+Проведение эксперимента для случая `eval` ни чем не отличается от предыдущего варианта эксперимента с загрузкой помеченных данных в скалярную переменную.
+В данном случае необходимо будет пометить данные в файле `in2` вместо `in1` и при записи трассы выполнить скрипт `test_eval.pl` вместо `test_scalar.pl`
+
+#### Анализ результатов
+
+##### Ресурсы
+
+
+
+Так же как и в предыдущем эксперименте мы видим что в юзер-спейсе помеченные данные проходят только через процесс perl и библиотеку libc
+
+Читаются помеченные данные из входного файла `in2`
+
+
+
+И на устройство `/dev/tty1` из всех помеченных данных выводится только содержимое строкового литерала из программы из файла `in2`.
+
+
+
+Все более или менее ожидаемо.
+
+##### Дерево вызовов
+
+
+
+Дерево вызовов во втором эксперименте получается сильно более развесистое чем в первом.
+
+В начале мы видим все тот же `Perl_do_readline` отвечающий за чтение данных из файла.
+
+Далее мы видим пару `Perl_pp_entereval`, `Perl_pp_leaveeval` и `Perl_pp_print` между ними.
+
+По всей видимости первые два обрамляют собой оный `eval` а вызов `print` является содержательной частью внутри `eval`'а исполняющейся.
+
+Так же интересным вызовом внутри `Perl_pp_entereval` является `S_doeval_compile` в котором судя по названию происходит компиляция строки в исполняемый байт-код Perl, и судя по префиксам `yy` в его внутренних вызовах разбор проводится при помощи Yacc-парсера.
+Префикс `yy` традиционно используется для Yacc-related кода.
+
+Функция `Perl_pp_entereval` так же выглядит крайне перспективно в смысле фаззинга.
+Вероятнее всего она сама по себе состояние интерпретатора не меняет.
+Главное корректно освободить все структуры которые она создала в процессе компиляции.
+
+##### Выводы
+
+Поставленная задача решена полностью, базовая анатомия работы оператора `eval` полностью установлена.
+Далее при реальном исследовании работы интерпретатора мы бы перешли к исследованию исходного кода интерпретатора и постановке натурных экспериментов.
+Часть касающаяся демонстрации возможностей Natch на этом этапе можно считать завершенной.
+
+