книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_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 |
|
-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. Оператор присваивания применим ко всем четырем встроенным типам;
Оператор индексирования массива обозначается квадратными скобка-
ми [ ]. Индексировать можно, в частности, строки. Так, после присва-
|
|
|
|
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».