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

книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_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

 

-xchПримерыa

 

 

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

 

 

 

# Автор: Syngress

Имя файла: example.nasl #

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Синтаксис языка NASL 111

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

port = get_kb_item # читать порт из базы знаний # ("Services/http")

Переменные

Работать с переменными в NASL очень просто. Их не надо объявлять заранее, и о преобразовании типов, выделении и освобождении памяти заботится сам интерпретатор. Как и в C, имена переменных в NASL чувствительны к регистру.

NASL поддерживает следующие типы данных: целые числа, строки, массивы и NULL. Булевские величины реализованы, но не как отдельный тип данных. Числа с плавающей точкой NASL не поддерживает.

Целые числа

Есть три вида целых чисел: десятичные, восьмеричные и шестнадцатеричные. Восьмеричные числа записываются с начальным нулем, а шестнадцатерич- ным предшествует префикс 0x. Таким образом, 0x10 = 020 = 16. Целые числа реализованы с помощью типа int (из языка C), так что для большинства систем занимают 32 бита, а для некоторых – 64 бита.

Строки

Есть два вида строк: чистые (pure) è неочищенные (impure). Неочищенные строки заключаются в двойные кавычки, escape-последовательности в них не обрабатываются. Внутренняя функция string преобразует неочищенные строки в чистые, интерпретируя escape-последовательности внутри строки, заключенной в одинарные кавычки. Например, неочищенную строку City\tState функция string преобразовала бы в City State.

NASL поддерживает следующие escape-последовательности:

\n – символ перехода на новую строку;

\t – горизонтальная табуляция;

\v – вертикальная табуляция;

\r – возврат каретки;

\f – переход на новую страницу;

\’ – одиночная кавычка;

\” – двойная кавычка;

\x41 – ýòî A, \x42 – ýòî B и т.д. Последовательность \x00 недопустима.

Массивы

В NASL поддерживаются массивы двух видов: стандартные è ассоциативные. Стандартные массивы индексируются целыми числами, начиная с нуля.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

112 Глава 2. Язык сценариев NASL

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

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Советы и уловки

Чем кончаются строки?

Много лет назад был сконструирован компьютер «Teletype Model 33», в котором использовались только рычаги, пружины, перфокарты и ро торы. Машина могла выводить информацию со скоростью 10 симво лов в секунду, но для перевода печатающей головки в начало следую щей строки требовалось примерно две десятых секунды. Все симво лы, выводимые в течение этого интервала, терялись. Для решения проблемы конструкторы решили для обозначения конца строки ис пользовать последовательность из двух символов: «возврат каретки» для возврата головки в начало текущей строки и «перевод строки» для продвижения бумаги на одну строку.

Конструкторы первых компьютеров решили, что два символа для обо значения конца строка – это пустой расход памяти. Некоторые пред почли ограничиться единственным символом возврата каретки (\r или \x0d), другие символом перевода строки (\n или \x0a). Были и такие, кто решил сохранить оба символа.

Так и получилось, что в разных операционных системах строки текста завершаются по разному:

В Microsoft Windows применяется комбинация возврата каретки и перевода строки (\r\n);

В UNIX используется только символ перевода строки (\n);

В Macintosh OS 9 и более ранних версиях используется символ возврата каретки (\r).

Система Macintosh OS X – это помесь традиционной системы Mac OS и UNIX. В ней используется то \r, то \n в зависимости от ситуации. В большинстве командных утилит, заимствованных из UNIX, применя ется символ \n, тогда как графические приложения, унаследованные от OS 9, продолжают завершать строки символом \r.

Ассоциативные же массивы или хэши позволяют в качестве ключа использовать строки, но при этом не сохраняется порядок элементов. В обоих случа- ях для взятия индекса применяется оператор [ ].

Важно отметить, что когда вы указываете большое число в качестве индекса, NASL вынужден выделить память для всех промежуточных элементов массива, что может привести к чрезмерному расходованию памяти. В таких случаях луч- ше преобразовать число в строку и прибегнуть к ассоциативному массиву.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

-xchNULLa

 

 

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Синтаксис языка NASL 113

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

NULL – это «значение», которое имеет переменная, пока ей не присвоили другое значение явно. Иногда его возвращают внутренние функции, чтобы сообщить об ошибке.

Чтобы проверить, равна переменная NULL или нет, пользуйтесь функцией isnull(). Прямое сравнение с константой NULL (var == NULL) небезопасно, поскольку NULL автоматически преобразуется в 0 или «» (пустую строку) в зависимости от типа переменной var.

Взаимодействие между значением NULL и массивами нетривиально. После попытки прочитать элемент массива из переменной, равной NULL, эта переменная начинает ссылаться на пустой массив. Вот пример из руководства по языку NASL:

v = NULL;

#isnull(v) возвращает TRUE, а typeof(v) возвращает "undef" x = v(2);

#isnull(x) возвращает TRUE, а typeof(x) возвращает "undef"

#Но теперь isnull(v) возвращает FALSE, typeof(v) возвращает "array"

Булевские величины

Для булевских величин нет специального типа. Просто константа TRUE определяется как 1, а константа FALSE – как 0. Прочие типы преобразуются

âTRUE или FALSE согласно следующим правилам:

Целое число интерпретируется как TRUE, если оно не равно ни 0, ни NULL;

Строка интерпретируется как TRUE, если она не пуста, иными словами «0» равно TRUE в отличие от Perl и NASL1;

Массив всегда интерпретируется как TRUE, даже если он пуст;

NULL (или неопределенная переменная) интерпретируется как FALSE.

Операторы

NASL не поддерживает перегрузки операторов. Ниже обсуждаются все операторы, имеющиеся в этом языке.

Операторы вне категории

Êтаковым относятся операторы присваивания и индексирования массива:

Оператор присваивания обозначается знаком =. Выражение x = y озна- чает, что значение y копируется в x. В данном примере, если переменная y не определена, то неопределенной становится и x. Оператор присваивания применим ко всем четырем встроенным типам;

Оператор индексирования массива обозначается квадратными скобка-

ми [ ]. Индексировать можно, в частности, строки. Так, после присва-

114 Глава 2. Язык сценариев NASL

 

 

 

 

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

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

ивания name = Nessus значение name[1] равно e. В отличие от NASL1,

n

e

 

 

 

 

df

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

язык NASL2 не позволяет записывать символы в строку с помощью оператора индексирования (то есть запись name[1] = «E» некорректна).

Операторы сравнения

Следующие операторы служат для сравнения значений в условных выражениях и возвращают TRUE или FALSE. Все они применимы к любому из четырех типов данных:

== – это оператор сравнения на равенство. Он возвращает TRUE, если значения аргументов одинаковы, иначе FALSE;

!= – это оператор сравнения на неравенство. Он возвращает TRUE, если значения аргументов различны, иначе FALSE;

> – это оператор «больше». При сравнении целых чисел он работает как и ожидается. Строки сравниваются на основе кода ASCII. Например, (a < b), (A < b) è (A < B) – истинные выражения, тогда как (a < B) – ложное. Следовательно, для сравнения в алфавитном порядке без учета регистра нужно предварительно преобразовать обе строки в верхний или нижний регистр. Применение операторов «больше» и «меньше» к операндам, одним из которых является число, а другим – строка, дает неопределенные результаты;

>= – это оператор «больше или равно»;

< – это оператор «меньше»;

<= – это оператор «меньше или равно».

Арифметические операторы

Следующие операторы выполняют стандартные арифметические операции над целыми числами. Ниже мы еще скажем, что некоторые из них ведут себя по-разному в зависимости от типов операндов. Например, для целых чисел + обозначает обычное сложение, а для строк – конкатенацию:

+ обозначает операцию сложения, если операнды – целые числа;

- обозначает операцию вычитания, если операнды – целые числа;

* обозначает умножение;

/ обозначает деление, при этом остаток отбрасывается (т.е. 20 / 6 == 3);

NASL не поддерживает арифметики с плавающей точкой;

деление на 0 дает результат 0, а не приводит к завершению интерпретатора;

% обозначает операцию взятия остатка от деления (т.е. 20 % 6 == 2). Если второй операнд равен 0, то возвращается 0;

** обозначает возведение в степень (например, 2 ** 3 == 8).

 

 

 

 

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

 

 

Синтаксис языка NASL 115

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Строковые операторы обеспечивают более высокий уровень работы со строками. Они позволяют конкатенировать строки, вычитать одну строку из другой, выполнять сравнение и сопоставление с регулярным выражением. В со- четании с функциями из библиотеки NASL встроенные операторы позволяют манипулировать строками так же удобно, как в языках Python или PHP. Хотя работать со строками как с массивами символов (аналогично C) все еще можно, но теперь это уже не является необходимостью:

+ обозначает конкатенацию (сцепление) строк. Чтобы избежать возможных неоднозначностей при преобразовании типов, рекомендуется применять функцию string;

– обозначает вычитание строк. В результате первое вхождение одной строки в другую удаляется (например, Nessus – ess == Nus);

[ ] возвращает символ строки, об этом мы уже говорили (например, если str == Nessus, òî str[0] == N);

>< обозначает операцию поиска подстроки. Она возвращает TRUE, если первая строка входит во вторую (например, us >< Nessus возвращает TRUE);

Оператор >|< по смыслу противоположен ><. Он возвращает TRUE, если первая строка не входит во вторую;

=~ – это оператор сопоставления с регулярным выражением. Он возвращает TRUE, если строка соответствует регулярному выражению, и FALSE в противном случае. Запись s =~ [abc]+zzz функционально эквивалентна такому вызову функции ereg(string:s, pattern: [abc]+zzzz, icase:1);

!~ обозначает отсутствие соответствия регулярному выражению;

Операторы =~ и !~ возвращают NULL, если регулярное выражение составлено неверно.

Логические операторы

Логические операторы возвращают TRUE или FALSE, то есть 1 или 0 соответственно в зависимости от своих операндов:

! – это оператор логического отрицания;

&& – логическое И. Оператор возвращает TRUE, если оба аргумента равны TRUE. При этом поддерживается сокращенное вычисление, то есть если первый операнд равен FALSE, то второй не вычисляется вовсе;

|| – логическое ИЛИ. Оператор возвращает TRUE, если хотя бы один из аргументов равен TRUE. При этом поддерживается сокращенное вы- числение, то есть если первый операнд равен TRUE, то второй не вы-

числяется вовсе.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

116 Глава 2. Язык сценариев NASL

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

-xcha

 

 

.c

 

 

 

p

 

 

 

Побитовые операторы

 

 

 

 

 

 

g

 

 

 

 

 

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

 

 

 

 

Побитовые операторы позволяют манипулировать отдельными битами целых чисел и двоичных данных.

~ – побитовое НЕ;

& – побитовое И;

| – побитовое ИЛИ;

^ – побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ;

<< – логический сдвиг влево. Сдвиг влево на один бит эквивалентен умножению на 2 (например, x << 2 – это то же самое, что x * 4);

>> – арифметический (с учетом знакового бита) сдвиг вправо. Знаковый бит распространяется на результат, то есть x >> 2 – то же самое, что x / 4;

>>> – логический (без учета знакового бита) сдвиг вправо. Знаковый бит игнорируется (если x больше 0, то x >> 2 – то же самое, что x / 4).

Операторы составного присваивания в стиле C

Для удобства в NASL добавлены операторы составного присваивания в стиле C.

++ и -- обозначают операции инкремента и декремента. ++ увеличивает значение переменной на 1, а -- уменьшает на 1. Оба этих оператора могут применяться в двух формах;

При использовании суффиксной записи (x++ èëè x--) возвращается старое значение, которое переменная имела до увеличения. Рассмотрим, такой код:

x = 5;

display(x, x++, x);

Он напечатает 556, а значение x после выполнения будет равно 6. Аналогично, код

x = 5;

display(x, x--, x);

напечатает 554, а значение x станет равно 4;

Для операторов инкремента и декремента возможна также префиксная запись (++x èëè --x). При этом значение сначала модифицируется, а потом возвращается. Рассмотрим, такой пример:

x = 5;

display(x, ++x, x);

Будет напечатано 566, а значение x станет равно 6. Аналогично, код

x = 5;

display(x, --x, x);

напечатает 544, а значение x станет равно 4;

В NASL есть также удобное синтаксическое сокращение. Часто бывает, что над переменной производится некоторое действие, результат которого присваивается той же переменной. Если, например, нужно при-

бавить к x значение 10, то можно написать:

 

 

 

 

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

 

 

 

 

x = x + 10;

а можно и так:

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Синтаксис языка NASL 117

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

x += 10;

Сокращенная запись применима к следующим операторам: +, -, *, /, %, <<, >> и >>>.

Управляющие конструкции

Общий термин «управляющие конструкции» относится к условным операторам, циклам, функциям и связанным с ними инструкциям return è break. Все эти инструкции позволяют управлять потоком выполнения NASL-сцена- риев. NASL поддерживает классические инструкции if-then-else, но не поддерживает предложений case è switch. В NASL есть циклы вида for, foreach, while è repeat-until. Инструкция break позволяет выйти из цикла, даже если условие цикла еще остается истинным. В NASL также имеются встроенные и пользовательские функции, причем в обоих случаях для возврата управления вызывающей программе применяется инструкция return.

Инструкции if

NASL поддерживает инструкции if è else, но не поддерживает elsif. Имитировать функциональность инструкции elsif можно, сцепив несколько инструкций if.

if (x == 10) { display("x равно 10");

}else if (x > 10) { display("x больше 10");

}else {

display("x меньше 10");

}

Циклы for

Синтаксис цикла for практически не отличается от принятого в языке C:

for (начальное_выражение; условие_цикла; выражение_цикла) { код;

}

В следующем примере печатаются числа от 1 до 100 (по одному на строке):

for (i=1; i<=100; i++) { display(i, '\n');

}

После завершения этого цикла значение i равно 101. Это объясняется тем, что выражение_цикла вычисляется на каждой итерации, пока условие_цикла íå

 

 

 

 

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

 

 

 

118 Глава 2. Язык сценариев NASL

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

станет равно FALSE. Но в данном случае условие (i <= 100) становится рав--x cha

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ным FALSE только при i равном 101.

Циклы foreach

Öèêë foreach применяется для перебора элементов массива. В следующем примере переменной x последовательно присваивается значение каждого элемента массива array:

foreach x (array) { display(x, '\n');

}

Можно также перебрать все элементы ассоциативного массива воспользовавшись циклом foreach в сочетании с функцией keys, возвращающей все ключи:

foreach x (keys(array)) {

display("array[", k, "] равно", array[k], '\n');

}

Циклы while

Öèêë while продолжает выполняться, пока его условие остается истинным. Если перед началом исполнения условие уже ложно, цикл не выполняется ни разу.

i = 1;

while (i <= 10) { display(i, '\n'); i++;

}

Циклы repeat-until

Öèêë repeat-until аналогичен циклу while, но условие вычисляется после каждой итерации, а не пåðåä ней. Следовательно, цикл repeat-until обязательно будет выполнен хотя бы один раз. Вот простой пример:

x = 0; repeat {

display(++x, '\n'); } until (x >= 10);

Инструкция break

Инструкция break применяется для того, чтобы прервать выполнение цикла до того, как его условие окажется ложным. В следующем примере показано, как можно воспользоваться инструкцией break для подсчета числа нулей

âстроке str перед первым ненулевым значением. Не забывайте, что если

âстроке 20 символов, то последний из них обозначается str[19].

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

 

 

 

e

 

 

 

 

d

 

 

xchx = 0;

 

 

 

 

f-

 

an

 

 

 

 

len =

strlen(str);

while

(x < len) {

if

(str[x] != "0") {

 

break;

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Синтаксис языка NASL 119

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

}

x++;

}

if (x == len) {

display("str состоит из одних нулей"); } else {

display("перед первым не-нулем встретилось ", x, " нулей".);

Пользовательские функции

Помимо множества встроенных в NASL функций, вы можете писать свои собственные. Пользовательские функции имеют следующий формат:

function function_name(argument1, argument2, ...) { êîä;

}

Например, функцию, принимающую в качестве аргумента строку и возвращающую массив, состоящий из значений ASCII-кодов каждого символа, можно записать так:

function str_to_ascii (in_string) { local_var result_array; local_var len;

local_var i;

len = strlen(in_string); for (i = 0; i < len; i++) {

result_array[i] = ord(in_string[i]);

}

return (result_array);

}

display (str_to_ascii(in_string: "FreeBSD 4.8"), '\n');

Поскольку в языке NASL аргументы должны быть именованными, то передавать их можно в любом порядке. Кроме того, если некоторые аргументы необязательны, то их можно не передавать вовсе.

Область видимости переменной определяется автоматически, но область, выбранную по умолчанию, можно переопределить, воспользовавшись клю- чевыми словами local_var è global_var при объявлении переменной. Мы рекомендуем так и поступать во избежание случайного затирания значения одноименной переменной, объявленной в объемлющей области видимости. Рассмотрим такой пример:

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

120 Глава 2. Язык сценариев NASL

w Click

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

df-xchan i = 100;

 

 

 

 

 

 

 

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

 

 

 

 

function print_garbage () { for (i = 0; i < 5; i++) {

display(i);

}

display(" — "); return TRUE;

}

print_garbage(); display("Значение i равно ", i);

В результате выполнения будет напечатана строка 01234--- Значение i равно 5. Глобальная переменная i была затерта внутри цикла for в функции print_garbage, поскольку не было ключевого слова local_var.

NASL поддерживает рекурсию.

Встроенные функции

В NASL встроены десятки функций, облегчающих написание сценариев. Вызываются они точно так же, как и пользовательские, и уже находятся в глобальном пространстве имен (то есть их не нужно включать, импортировать или определять). Ниже в этой главе будут рассмотрены функции для манипулирования сетевыми соединениями, создания пакетов и взаимодействия с базой знаний Nessus.

Инструкция return

Эта инструкция возвращает значение из функции. Можно вернуть значение любого встроенного типа (целое число, строку, массив или NULL). Функции в NASL могут возвращать одно значение или не возвращать никакого зна- чения (например, запись return (10, 20) некорректна).

Написание сценариев на языке NASL

Выше мы уже говорили, что NASL проектировался как простой, удобный, модульный, эффективный и безопасный язык. В этом разделе мы рассмотрим особенности программирования на NASL и познакомим вас с некоторыми инструментами и методиками, помогающими NASL достичь заявленных целей. Мы опишем некоторые категории функций и проиллюстрируем их использование на примерах, однако привести полный перечень всех функций в данной главе мы не сможем. Для этого вам лучше обратиться к «Справочному руководству по языку NASL2».