From: Nikolay Shaplov Date: Mon, 21 Jul 2025 18:32:18 +0000 (+0300) Subject: Вторая статья про Natch, про исследование Perl X-Git-Url: http://gitweb.nataraj.world/?a=commitdiff_plain;h=602e5a141dbd29ca2cca2495d79a69bc3785b43d;p=articles.git Вторая статья про Natch, про исследование Perl --- diff --git "a/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/eval_callgraph.png" "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/eval_callgraph.png" new file mode 100644 index 0000000..2b73f97 Binary files /dev/null and "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/eval_callgraph.png" differ diff --git "a/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/eval_resources_1.png" "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/eval_resources_1.png" new file mode 100644 index 0000000..5d4ca4f Binary files /dev/null and "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/eval_resources_1.png" differ diff --git "a/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/eval_resources_2.png" "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/eval_resources_2.png" new file mode 100644 index 0000000..2ccf93d Binary files /dev/null and "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/eval_resources_2.png" differ diff --git "a/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/eval_resources_3.png" "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/eval_resources_3.png" new file mode 100644 index 0000000..d7e731d Binary files /dev/null and "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/eval_resources_3.png" differ diff --git "a/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/scalar_callgraph.png" "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/scalar_callgraph.png" new file mode 100644 index 0000000..7d96b58 Binary files /dev/null and "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/scalar_callgraph.png" differ diff --git "a/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/scalar_resources_1.png" "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/scalar_resources_1.png" new file mode 100644 index 0000000..4bee348 Binary files /dev/null and "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/scalar_resources_1.png" differ diff --git "a/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/scalar_resources_2.png" "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/scalar_resources_2.png" new file mode 100644 index 0000000..476a5a3 Binary files /dev/null and "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/scalar_resources_2.png" differ diff --git "a/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/scalar_resources_3.png" "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/scalar_resources_3.png" new file mode 100644 index 0000000..4c3d201 Binary files /dev/null and "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.imgs/scalar_resources_3.png" differ diff --git "a/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.md" "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.md" new file mode 100644 index 0000000..d7cef94 --- /dev/null +++ "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/2. Perl.md" @@ -0,0 +1,342 @@ +## 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 = ; +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. + +#### Анализ результатов + +##### Ресурсы + +![...](2. Perl.imgs/scalar_resources_1.png) + +Если заглянуть в раздел "Ресурсы" можно увидеть, что в юзер-спейсе помеченные данные проходили только через бинарную программу perl и библиотеку libc. Данные были прочитаны из файла `/home/nataraj/perl/in1` + +![...](2. Perl.imgs/scalar_resources_2.png) + +И записаны в устройство виртуального терминала `/dev/tty1` + +![...](2. Perl.imgs/scalar_resources_3.png) + +что вполне отвечает нашим ожиданиям. + +##### Дерево вызовов + +![...](2. Perl.imgs/scalar_callgraph.png) + +Если посмотреть на дерево вызовов, анатомия интерпретатора Perl становится в общем и целом понятной + +`perl_run` и `Perl_runops_debug` очень похожи на вызовы оборачивающие все исполнение скрипта + +`Perl_do_readline` вероятнее всего реализация операции чтения из файла `$s = ;`. В вызове `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 = ; +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` + +#### Анализ результатов + +##### Ресурсы + +![...](2. Perl.imgs/eval_resources_1.png) + +Так же как и в предыдущем эксперименте мы видим что в юзер-спейсе помеченные данные проходят только через процесс perl и библиотеку libc + +Читаются помеченные данные из входного файла `in2` + +![...](2. Perl.imgs/eval_resources_2.png) + +И на устройство `/dev/tty1` из всех помеченных данных выводится только содержимое строкового литерала из программы из файла `in2`. + +![...](2. Perl.imgs/eval_resources_3.png) + +Все более или менее ожидаемо. + +##### Дерево вызовов + +![...](2. Perl.imgs/eval_callgraph.png) + +Дерево вызовов во втором эксперименте получается сильно более развесистое чем в первом. + +В начале мы видим все тот же `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 на этом этапе можно считать завершенной. + +