Эксплойт
Содержание
Классификация
В зависимости от метода получения доступа к уязвимому программному обеспечению, эксплойты подразделяются на удалённые (англ. remote ) и локальные (англ. local ).
Атака эксплойта может быть нацелена на различные компоненты вычислительной системы — серверные приложения, клиентские приложения или модули операционной системы. Для использования серверной уязвимости эксплойту достаточно сформировать и послать серверу запрос, содержащий вредоносный код. Использовать уязвимость клиента немного сложнее — требуется убедить пользователя в необходимости подключения к поддельному серверу (перехода по ссылке в случае если уязвимый клиент является браузером).
Виды эксплойтов
Эксплойты, фактически, предназначены для выполнения сторонних действий на уязвимой системе и могут быть разделены между собой следующим образом:
Как выглядит эксплойт?
Эксплойты могут быть классифицированы также по типу используемой ими уязвимости, такой как: переполнение буфера, SQL-инъекция, межсайтовый скриптинг, подделка межсайтовых запросов и т. д.
Актуальность
Информация, полученная в результате обнаружения уязвимости, может быть использована как для написания эксплойта, так и для устранения уязвимости. Поэтому в ней одинаково заинтересованы обе стороны — и взломщик, и производитель взламываемого программного обеспечения. Характер распространения этой информации определяет время, которое требуется разработчику до выпуска заплатки.
Связки
Связки эксплойтов представляют из себя пакет эксплойтов сразу под несколько программ (версий) и/или под разные уязвимости в них. В последних версиях связок производится выбор эксплойта именно под конкретную программу пользователя.
См. также
Примечания
Ссылки
Полезное
Смотреть что такое «Эксплойт» в других словарях:
эксплойт — сущ., кол во синонимов: 1 • программа (114) Словарь синонимов ASIS. В.Н. Тришин. 2013 … Словарь синонимов
Эксплойт (компьютерная безопасность) — Эксплойт (фр. exploit эксплуатировать) это общий термин в сообществе компьютерной безопасности для обозначения фрагмента программного кода, который, используя возможности, предоставляемые ошибкой, отказом или уязвимостью, ведёт к повышению… … Википедия
Эксплоит — Эксплойт (фр. exploit эксплуатировать) это общий термин в сообществе компьютерной безопасности для обозначения фрагмента программного кода, который, используя возможности, предоставляемые ошибкой, отказом или уязвимостью, ведёт к повышению… … Википедия
Системное программное обеспечение PlayStation Portable — Системное программное обеспечение PlayStation Portable это официальная обновляемая прошивка для PlayStation Portable. Обновления добавляют новые возможности и вносят исправления в безопасность для предотвращения запуска программ без… … Википедия
Переполнение буфера — У этого термина существуют и другие значения, см. Переполнение. Переполнение буфера (Buffer Overflow) явление, возникающее, когда компьютерная программа записывает данные за пределами выделенного в памяти буфера. Переполнение буфера обычно… … Википедия
San Andreas Multiplayer — Разработчик The SA MP team Дата выпуска 10 мая 2006 Версия 0.3e (8 мая 2012[1]) Жанр Модификация Платформы … Википедия
SA-MP — San Andreas Multiplayer Разработчик The SA:MP team Издатель The SA:MP team Дата выпуска 0.2X: 20 ноября 2008 Платформы IBM PC: Windows Версия … Википедия
Patapon 2: Don Chaka — Разработчики Japan Studio, Pyramid Издатель Sony Computer Entertainment Дата выпуска … Википедия
Ньюфаундленд остров у берегов Северной Америки — (Newfoundland) остров у северо восточных берегов Северной Америки, к В от залива Св. Лаврентия, старейшая в Новом Свете колония Англии, занимает пространство в 110670 кв. км и, вместе с Антикости и берегом Лабрадора, образует одну… … Энциклопедический словарь Ф.А. Брокгауза и И.А. Ефрона
Ньюфаундленд (о-в) — (Newfoundland) остров на сев. вост. берегу Америки, к В от зал. Св. Лаврентия, старейшая в Новом Свете колония Англии, занимает пространство в 110670 кв. км и, вместе с Антикости и берегом Лабрадора, образует одну. административную единицу, под… … Энциклопедический словарь Ф.А. Брокгауза и И.А. Ефрона
Что такое эксплойты и почему их все так боятся?
Разработчики защитных решений часто упоминают эксплойты как одну из самых серьёзных проблем безопасности данных и систем, хотя и не всегда ясно, почему. Попробуем разобраться в этом вопросе
Разработчики защитных решений часто упоминают в своих публикациях эксплойты как одну из самых серьезных проблем безопасности данных и систем, хотя и не всегда ясно, какова разница между эксплойтами и вредоносными программами в целом. Попробуем разобраться с этим вопросом.
Что такое эксплойт?
Эксплойты — это подвид вредоносных программ. Они содержат данные или исполняемый код, способный воспользоваться одной или несколькими уязвимостями в программном обеспечении на локальном или удаленном компьютере.
Например, у вас есть браузер, и есть уязвимость в нем, которая позволяет исполнить «произвольный код», то есть установить и запустить некую вредоносную программу на вашей системе без вашего ведома или спровоцировать какое-либо иное не ожидаемое вами поведение системы. Чаще всего первым шагом злоумышленников становится повышение привилегий, позволяющее делать в атакуемой системе все, что в голову взбредет.
Microsoft закрыла уязвимость нулевого дня в Windows и аж 41 дырку в Internet Explorer, но бреши еще остались: http://t.co/RzSNpPd3oH
Браузеры наряду с Flash, Java и Microsoft Office являются одними из самых подверженных атакам категорий программного обеспечения. Из-за их повсеместности их активно исследуют как эксперты по безопасности, так и хакеры, а разработчики браузеров вынуждены регулярно выпускать патчи для исправления уязвимостей. Лучше всего эти патчи устанавливать сразу, но, к сожалению, так происходит далеко не всегда — ведь при этом придется закрывать все вкладки.
Особую проблему, конечно, представляют собой эксплойты неизвестных уязвимостей, обнаруженных и использованных преступниками, — так называемые уязвимости нулевого дня. Может пройти много времени, прежде чем производители узнают о наличии проблемы и устранят ее.
Как происходит заражение
Следующая часть вполне техническая, так что не стесняйтесь проматывать, если только вам не в самом деле интересно, как это работает. Имейте в виду при этом, что киберпреступники часто предпочитают эксплойты прочим методам заражения, так как, в отличие от социальной инженерии, в которой все делается наудачу, эксплуатация уязвимостей неизменно дает желаемый результат.
Есть два способа «скормить» пользователям эксплойты. Во-первых, при посещении ими сайта, содержащего вредоносный код эксплойта. Во-вторых, при открытии пользователем безобидного на вид файла со скрытым вредоносным кодом. Как легко догадаться, во втором случае для доставки эксплойта, как правило, пользуются спамом или фишинговым письмом.
Почему фишинг получил такое распространение и как от него уберечься: http://t.co/sezy73TbSb
Как поясняется в статье Securelist, эксплойты предназначены для атаки конкретных версий программного обеспечения, содержащего уязвимости. Таким образом, если у пользователя нужная версия программного обеспечения при открытии вредоносного объекта или если веб-сайт использует это программное обеспечение для работы, то запускается эксплойт.
После того как он получает доступ посредством уязвимости, эксплойт загружает дополнительные вредоносные программы с сервера преступников, осуществляющие подрывную деятельность, такую как кража личных данных, использование компьютера в качестве элемента ботнета для рассылки спама или выполнения DDoS-атак и так далее.
Эксплойты представляют угрозу даже для осторожных и добросовестных пользователей, которые регулярно обновляют свое программное обеспечение. Причина кроется во временном зазоре между открытием уязвимости и выходом патча для ее исправления.
В этом интервале эксплойты могут свободно функционировать и угрожать безопасности почти всех интернет-пользователей при отсутствии установленных в системе автоматических средств предотвращения атак эксплойтов. Опять же, не будем забывать про синдром открытых вкладок — своевременное обновление программ зачастую требует от пользователя некоторых жертв, на которые не все готовы пойти сразу в момент выхода заплатки.
Эксплойты ходят стаями
Эксплойты часто упакованы вместе — так, чтобы проверить систему-мишень на широкий спектр уязвимостей. Как только выявляются одна или несколько, в дело вступают соответствующие эксплойты. Наборы эксплойтов также широко используют специальные методы запутывания кода (специалисты называют это умным словом «обфускация»), чтобы избежать обнаружения и замести интернет-адреса с целью помешать исследователям их вычислить.
Перечислим несколько наиболее известных наборов эксплойтов, или, как еще их называют, эксплойт-китов:
Angler — один из самых сложных наборов на черном рынке. Этот набор эксплойтов своим появлением изменил правила игры, после того как начал обнаруживать антивирусы и виртуальные машины (часто используемые экспертами по безопасности как приманки) и задействовать шифрованные файлы для затруднения исследования. Это один из тех наборов эксплойтов, которые быстрее всего включают в свой арсенал недавно открытые уязвимости нулевого дня, а его вредоносные программы работают в памяти, без записи на жестких дисках жертв. С техническим описанием пакета можно ознакомиться здесь.
Nuclear Pack — поражает жертв эксплойтами Java и Adobe PDF, а также подсаживает Caphaw — печально известный банковский троян. Подробнее читайте здесь.
Blackhole Kit — наиболее распространенная веб-угроза в 2012 году, нацеленная на уязвимости в старых версиях браузеров Firefox, Chrome, Internet Explorer и Safari, а также многих популярных плагинов, таких как Adobe Flash, Adobe Acrobat и Java. После того как жертву заманили или перенаправили на страницу подсадки, запутанный JavaScript определяет содержимое машины жертвы и загружает те эксплойты, для которых данный компьютер уязвим.
Blackhole, в отличие от большинства других эксплойт-китов, даже удостоился отдельной статьи в «Википедии», хотя после ареста вышеупомянутого Paunch сам набор практически вышел в тираж.
Вывод
Как сказано выше, эксплойты — подвид вредоносных программ, но они обнаруживаются не всеми защитными программами. Для успешного обнаружения необходимо, чтобы защитное решение использовало поведенческий анализ — это единственный надежный метод борьбы с эксплойтами. Вредоносные программы могут быть многочисленными и разнообразными, но большинство из них имеют похожие черты поведения.
Что такое эксплойты и почему их все так боятся?
Подобный метод используется в Kaspersky Internet Security и других продуктах «Лаборатории Касперского» — соответствующая часть наших защитных решений называется «Автоматическая защита от эксплойтов» (или AEP — Automatic Exploit Prevention). Характерное поведение эксплойтов помогает предотвратить заражение даже в случае эксплуатации ранее неизвестной уязвимости нулевого дня.
Более подробную информацию о технологии Automatic Exploit Prevention можно найти здесь.
Linux exploits
Операционная система Linux доказала миру всю силу Open Source проектов — благодаря ей у нас сегодня есть возможность заглянуть в исходный код рабочей ОС и на его основе собрать свою собственную систему для решения тех или иных задач. По причине своей открытости Linux должна была стать самой безопасной операционной системой в мире, так как открытый исходный код позволяет развивать и улучшать подсистемы защиты от атак на ОС и совершенствовать саму операционную систему. Действительно, на данный момент существует большое количество созданных комьюнити защит: сегодня уже не так просто проэксплуатировать уязвимости типа переполнения буфера для получения повышенных привилегий так же, как 20 лет назад. Тем не менее, сегодня можно в открытом доступе встретить эксплойты, которые даже на последних версиях ядра могут повысить привилегии пользователя. Рассмотрим в этой статье, как это работает и почему так получается. Мы пройдемся по основным составляющим эксплойтов и рассмотрим, как работают некоторые из них.
Вся предоставленная информация была собрана исключительно в ознакомительных целях.
Типы эксплойтов
Выберем общий термин, которым будем обозначать, что есть эксплойт — алгоритм, который нарушает нормальное функционирование операционной системы, а именно — механизмы разграничения доступа. Также введем понятие уязвимости — это несовершенство программного обеспечения, которое может быть использовано алгоритмом эксплойта. Без уязвимости существование эксплойта невозможно.
Введем классификацию эксплойтов. Базовое разделение эксплойтов на подгруппы для любой операционной системы начинается на уровне архитектуры. Сегодня операционные системы включают в себя как минимум 2 уровня привилегий, которые используют для своей работы. Ниже приведен рисунок, который наглядно показывает разделение привилегий. Картинка взята отсюда.
Картинка очень наглядно показывает, что в операционной системе присутствует уровень Ядра (Kernel Space), обычно это самый привилегированный режим, именно здесь находится то, что мы называем операционной системой. И второй уровень — Пользовательский (User Space): здесь запускаются обычные приложения и сервисы, которые мы используем каждый день.
Исторически сложилось, что для каждого из перечисленных выше уровней могут быть найдены уязвимости, для которых может быть создан эксплойт, но эксплойты для каждого из уровней имеют свои ограничения.
На пользовательском уровне любой эксплойт, который затрагивает приложение, будет иметь ровно те привилегии, которые использовал пользователь, который запустил уязвимое приложение. Поэтому такой вид эксплойтов позволяет получить полное управление над ОС только в случае запуска приложения администратором системы. В противоположность пользовательскому уровню, уровень ядра, если содержит уязвимый код, может сразу дать возможность управлять операционной системой с максимальными привилегиями. Ниже сфокусируемся на исследовании этих эксплойтов.
Эксплойты
Представим небольшую статистику по раскрытию уязвимостей для ядра операционной системы Linux дистрибутивов Debian, SUSE, Ubuntu, Arch Linux последних 4-х лет.
Данные взяты отсюда. Картина не претендует на полноту, но показывает, что уязвимостей достаточно много, и даже сегодня есть из чего выбирать для построения эксплойта. Давайте попробуем описать, что из себя представляет эксплойт.
Любой эксплойт для любого уровня операционной системы сегодня состоит из частей, которые должны быть имплементированы в его коде:
1) Выставление необходимого отображения памяти
2) Создание необходимых объектов в ОС
3) Обход механизмов защиты ОС для используемой уязвимости
Вызов уязвимой части ПО.
Выполняет полезную нагрузку:
1) Для открытия доступа к ОС
2) Для изменения конфигурации ОС
3) Для вывода ОС из строя
При выполнении всех пунктов, которые указаны выше, можно написать работоспособный эксплойт. Возьмем для исследования несколько эксплойтов прошлых лет и попробуем выяснить, можно ли найти какие-то закономерности или заимствования, которые используются для нарушения разграничений доступа в операционной системе Linux. В качестве объектов исследования возьмем эксплойты, которые используют следующие уязвимости с CVE идентификаторами:
Разбор эксплойтов
Как автор эксплойта использует данную уязвимость и какая выполняется полезная нагрузка, рассмотрим дальше.
Подготовительный этап
За этот этап отвечает следующая часть кода.
Вызов уязвимого кода
Полезная нагрузка
Обезопасить себя без обновления ОС можно, если внести следующие изменения в конфиг: sudo sysctl kernel.unprivileged_bpf_disabled=1
Эксплойт, который создан для того, чтобы использовать описанную уязвимость, выполняет те же операции, что и эксплойт CVE-2020-8835. Алгоритм эксплойта следующий:
Загрузить код с обработкой 64 битных операций в память
Создать сокет и отправить данные для вызова команд ebpf
Найти в памяти адрес структуры taskstruct за счет выполнения команд в виртуальной машине
Модифицировать значения uid,gid,sgid и запустить интерактивную оболочку.
Автор писал исходный код с новыми фишками и дополнительными функциями. Предлагаем читателю самостоятельно взглянуть на код. Перечисленные этапы работы эксплойта выше не дадут запутаться.
Защита от этой уязвимости без использования обновления такая же: sudo sysctl kernel.unprivileged_bpf_disabled=1
Что в итоге?
На основании двух эксплойтов, который были рассмотрены в статье, можно предположить, что повышение привилегий в современной ОС Linux — это больше не темная магия программирования, а вполне отлаженный шаблонный процесс, который включает в себя переиспользование функций и объектов в оперативной памяти. При этом даже не нужно писать базонезависимый (shellcode) код, который будет выполнять большую часть действий. Достаточно просто изменить идентификаторы, которые используются для назначения привилегий для пользователей.
Эксплойт. Виды эксплойтов.
Сегодняшняя статья посвящена эксплойтам и их видам. Ведь чтобы правильно уничтожить врага его надо знать в лицо.
Эксплойты — это подвид вредоносных программ. Они содержат данные или исполняемый код, способный воспользоваться одной или несколькими уязвимостями в программном обеспечении на локальном или удаленном компьютере.
Например, у вас есть браузер, и есть уязвимость в нем, которая позволяет исполнить «произвольный код», то есть установить и запустить некую вредоносную программу на вашей системе без вашего ведома или спровоцировать какое-либо иное не ожидаемое вами поведение системы.
Эксплойт может распространяться в виде исходных текстов, исполняемых модулей или словесного описания использования уязвимости. Он может быть написан на любом языке программирования (наиболее часто использующиеся: C/C++, Perl, Python, PHP, HTML+JavaScript).
Как происходит заражение
Существует два способа заразится эксплойтом. Во-первых, при посещении сайта, содержащего вредоносный код эксплойта. Во-вторых, при открытии пользователем безобидного на вид файла со скрытым вредоносным кодом. Для доставки таких файлов, как правило, используют спам или фишинговые письма.
После того как он получает доступ посредством уязвимости, эксплойт загружает дополнительные вредоносные программы с сервера преступников, осуществляющие подрывную деятельность, такую как кража личных данных, использование компьютера в качестве элемента ботнета для рассылки спама или выполнения DDoS-атак.
Виды эксплойтов
Примеры нескольких наиболее известных наборов эксплойтов:
Angler — один из самых сложных наборов на черном рынке. Этот набор эксплойтов своим появлением изменил правила игры, после того как начал обнаруживать антивирусы и виртуальные машины (часто используемые экспертами по безопасности как приманки) и задействовать шифрованные файлы для затруднения исследования. Это один из тех наборов эксплойтов, которые быстрее всего включают в свой арсенал недавно открытые уязвимости нулевого дня, а его вредоносные программы работают в памяти, без записи на жестких дисках жертв.
Blackhole Kit — наиболее распространенная веб-угроза в 2012 году, нацеленная на уязвимости в старых версиях браузеров Firefox, Chrome, Internet Explorer и Safari, а также многих популярных плагинов, таких как Adobe Flash, Adobe Acrobat и Java. После того как жертву заманили или перенаправили на страницу подсадки, запутанный JavaScript определяет содержимое машины жертвы и загружает те эксплойты, для которых данный компьютер уязвим.
Для защиты от эксплойтов существует множество специальных программ, которые помогут Вам защитить компьютер. Также рекомендуется не открывать незнакомые файлы, письма и заходить на незнакомые сайты.
Введение в эксплоитинг и реверсинг с использованием IDA FREE и других бесплатных инструментов. Глава 2
В первой части мы установили несколько инструментов, которые будут полезны для нас для прохождения этого курса. Их особенность в том, что они все бесплатны. Мы не будем использовать какой-либо платный инструмент, а из тех, у которых есть платная версия, таких как IDA или PYCHARM, мы будем использовать версию FREE или COMMUNITY.
Давайте посмотрим на некоторые концепции, прежде чем мы приступим к упражнениям.
БАГ — это результат сбоя или недостатка в процессе создания компьютерных программ (программного обеспечения) или компьютера. Указанный сбой может произойти на любом из этапов жизненного цикла программного обеспечения, хотя наиболее очевидный сбой происходит на этапе разработки и программирования.
Как я всегда говорю, программист может ошибаться, и эти ошибки могут вызвать сбои в программе или баги. Пока что ничего нового я не сказал.
Вопрос заключается в том, чтобы знать разницу между БАГОМ и УЯЗВИМОСТЬЮ, поэтому давайте посмотрим, что такое УЯЗВИМОСТЬ.
Что такое УЯЗВИМОСТЬ?
УЯЗВИМОСТЬ — это определенный тип бага в программе, который позволяет, используя ее, нарушать безопасность компьютерной системы.
Таким образом, уязвимости позволяют выполнять действия, для которых программа не была предназначена, и злоупотреблять ими.
Другими словами, уязвимость — это определенный тип бага, подмножество между ними.
Конечно, существует много типов уязвимостей. Мы собираемся сосредоточиться на изучении и эксплуатации уязвимостей в WINDOWS.
Что такое ЭКСПЛОИТ?
ЭКСПЛОИТ — это компьютерная программа, которая пытается использовать некоторую уязвимость другой программы. Конечной целью эксплойта может быть злонамеренной, например, как уничтожение или отключение атакуемой системы, хотя обычно речь идет о нарушении мер безопасности, чтобы получить доступ к информации несанкционированным способом и использовать ее в своих собственных интересах или в качестве источника других атак на третьи стороны.
Злоупотребление уязвимостью может привести к сбою приложения или самой системы, выполнению собственного кода на локальных или удаленных машинах. Её эксплуатация и сложность зависят от самой уязвимости, среды и мер, которые имеет цель во время эксплуатация.
Первым типом уязвимостей, которые мы будем изучать, будут переполнения буфера. Мы начнем с простейших примеров, а затем постепенно будем наращивать сложность.
Вначале у нас не будут активированы средства защиты системы, но постепенно мы будем активировать их, чтобы узнать, как мы можем справиться с ними и в каких ситуациях.
Что такое БУФЕР?
БУФЕР — это пространство памяти определенного размера, зарезервированное для хранения данных и управления ими.
Базовым примером является 20-ти литровая банка, которая у меня есть для хранения содержимого. Она может быть меньше или равна 20 литрам, что является максимальным размером. Если вы хотите хранить больше в одном резервуаре, вы должны найти способ увеличить размер буфера, иначе при попытке сохранить, например, 40 литров в 20-литровую банку, она переполнится.
Что такое ПЕРЕПОЛНЕНИЕ БУФЕРА?
ПЕРЕПОЛНЕНИЕ БУФЕРА происходит, когда компьютерная программа превышает объем памяти, зарезервированный для нее, записывая данные в непрерывный блок памяти.
По правде говоря, переполнение буфера происходит в приложении, когда оно не имеет необходимых проверок безопасности в своем программном коде, таких как измерение объема данных, которые будут скопированы в буфер и которые не превышает размер буфера.
Наиболее распространенные типы переполнений буфера — переполнения буфера стека и переполнения буфера кучи.
Здесь мы видим определение переполнения буфера, и в нашем предыдущем примере, если я попытаюсь налить 40 литров в 20-ти литровый бак, он переполнится, как мы поняли. Это переполнение, которое производит переполнение буфера, т.е. переполнение моего бака, когда превышается его максимальная емкость.
Теперь объясним разницу между стеком и кучей.
Что такое СТЕК?
СТЕК используется для хранения локальных переменных функции, которые необходимы только до тех пор, пока выполняется функция. В большинстве языков программирования важно, чтобы мы знали во время компиляции, насколько велика переменная, если мы хотим сохранить ее в стеке.
Что такое КУЧА?
КУЧА используется для резервирования динамической памяти, срок полезного использования которой заранее неизвестен, но ожидается, что он продлится некоторое время. Если мы не знаем её размер или он определяется во время выполнения, размер должен быть рассчитан и зарезервирован в куче.
Куча также используется для объектов, которые различаются по размеру, потому что мы не знаем во время компиляции, как долго они будут использоваться.
В нашей компании я работаю уже более 13 лет как автор эксплойтов, и первое, что мы делаем со всеми нанимаемыми людьми, даже делали со мной, когда я присоединялся, — это попытаться разгадать стеки и кучи знаменитого ГЕРАРДО РИЧАРТЕ. Это один из основателей CORE SECURITY и гуру анализа эксплойтов.
Мы начнем потихоньку с простейших стеков. Конечно, как я уже сказал, они скомпилированы на данный момент с минимальной защитой и являются 32-х битными, чтобы облегчить эксплуатацию.
Давайте посмотрим на исходный код для задачи STACK1.
Мы видим папку с упражнениями, а внутри находится исходный код STACK1, называемый STACK1_VS_2017.CPP.
Мы попытаемся понять этот код и посмотреть, где может возникнуть переполнение буфера, и будет ли оно переполнением буфера в стеке или в куче.
Вызов функции MessageBoxA был добавлен в исходный код STACK1, чтобы показать нам небольшое сообщение, побуждающее нас к его решению. Это просто дополнение, которое ни на что не влияет. Это стандартный вызов указанной функции WINDOWS, которую мы не будем здесь анализировать.
Мы знаем, что внутри функции, если есть локальные переменные, вы должны зарезервировать для них место.
Таким образом, мы остались с этим исходным кодом, созданным ГЕРАРДО РИЧАРТЕ.
Мы видим красным цветом первую часть программы, где резервируется место для локальных переменных. В этом случае есть две локальные переменные, COOKIE и BUF.
Вы можете увидеть в таблице типы данных. Там же там находятся и другие типы переменных.
Код будет скомпилирован в 32 бита.
Мы видим, что переменная COOKIE будет типа INT, поэтому для этой переменной будет зарезервировано 4 байта памяти.
В случае переменной BUF мы видим, что это массив или цепочка символов (размер символа = 1 байт).
Т.е. это будет массив из 80 символов, т.е. его длина будет 80×1 = 80 байт.
Тот, кто не знает, что такое массив, может почитать про него здесь:
Таким образом, массив может хранить много значений одного и того же типа данных. Вы просто должны сказать ему, какого типа будут данные и сколько их будет.
В первом примере это массив целых чисел, т.е. он будет равен 100 байт, а поскольку каждое целое занимает 4 байта, длина массива будет равна 100 x 4 = 400 байт.
Во втором примере FLOAT занимает 4 байта, поэтому это будет массив из 5 FLOAT, поэтому его длина будет 5 x 4 = 20 байт.
Когда мы проанализируем массив на низком уровне, мы увидим, что это зарезервированное пространство памяти или буфер. Это не единственный способ зарезервировать пространство памяти. Существуют другие типы переменных данных, которые также требуют зарезервировать пространство в памяти, которое будет буферами для сохранения их содержимого.
Возвращаясь к нашему упражнению:
Это массив символов длиной 80 x 1 = 80 байт, т.е. это похоже на нашу 20-ти литровую банку. Если мы попытаемся сохранить более 80 байт, банка переполнится.
Теперь давайте посмотрим, где используется буфер BUF.
Мы видим, что буфер используется в двух местах, отмеченных красными стрелками.
В первой инструкции есть функция PRINTF, которая используется для отображения сообщения в консоли, которое будет строкой в кавычках.
Но функция PRINTF не только печатает строку в кавычках, но она также печатает строку в заданном формате. Проценты внутри говорят нам, что будет создаваться выходная строка. Мы видим, что строка является только первым аргументом функции. Формат вывода и другие аргументов может быть несколько (будет один на каждый аргумент % в формате). В нашем случае их два.
В этом случае у нас два формата %X, поэтому, если я обращаюсь к таблице формата PRINTF:
Мы видим, что функция возьмет эти целые числа (INT) и вставит их в выходную строку с основанием системы счисления 16, т.е. в шестнадцатеричном формате. 08 указывает на то, что если число содержит менее 8 цифр, функция заполнит его пробелами.
Вывод для «buf: %31x”,&buf будет таким
Мы видим, что в этом примере заполняются пробелами перед числом. Есть несколько модификаторов, чтобы показать вывод.
Все возможные случаи перечислены здесь:
Наш же случай такой:
Мы видим, что результат не усекается, он заполняется пробелами только в том случае, если длина аргумента для вставки меньше значения перед X.
Поэтому мы знаем, что функция печатает два шестнадцатеричных числа, которые получаются из двух аргументов.
Мы знаем, что переменная имеет адрес памяти и значение, которое может быть сохранено. Это похоже на нашу 20-литровую банку. Она имеет свое содержание или значение, т.е. литры, хранящиеся внутри, но также если у меня есть гараж, полный подобных банок мне нужен какой-то способ определить, где находится та банка, которую я хочу, среди всех тех, что у меня есть.
На это указывает символ &. Он возвращает адрес или местоположение банки, а не ее содержимое или значение.
Определение АМПЕРСАНДА
АМПЕРСАНД используется для указания адреса памяти переменной, в которой будут храниться данные.
Поэтому, если я запущу исполняемый файл в консоли, я увижу, например, что при выполнении функции PRINTF она напечатает:
На ваших ПК адреса могут меняться, но поскольку нижний адрес обоих адресов совпадает с адресом BUF, мы видим, что они расположены таким образом:
Адрес BUF меньше адреса COOKIE, поэтому он будет увеличиваться.
А что нам говорят эти адреса переменных? (В моем случае &BUF=0x19FED4 и &COOKIE=0x19FF24)
Оба представлены в шестнадцатеричном формате. Помните, что это был формат %X? Поэтому я поставил 0x вперед, чтобы отличать десятичные числа, которые мы будем представлять без каких-либо дополнений.
Если в консоли PYTHON или в PYCHARM я сделаю вычитание:
Мы получим результат 80 байт, так как переменная COOKIE, предположительно, начинается именно там, где заканчивается буфер BUF, поэтому разница дает нам размер буфера.
Часто, когда мы делаем такой тип переменных основанных на исходного кода, может случиться так, что компилятор даст нам больший размер, чем тот, который зарезервирован в исходном коде. Компилятор гарантирует, что он зарезервирует не менее 80 байт, т.е. он может зарезервировать больше, а не меньше.
Дело в том, что мы уже знаем кое-что о коде, размере переменных и их расположении благодаря тому, что у него есть функция PRINTF.
Теперь давайте посмотрим на другое место, где используется буфер BUF, поскольку сейчас программе печатает только его адрес, но не использует его для сохранения в нем данных.
Здесь, на красной строчке, GET — это функция для ввода данных с клавиатуры. Данные будут вводиться пока я не нажму клавишу ВВОД.
Программа не может ограничить объем данных, вводимых пользователем, и также нет способа проверить эти данные. Все, что вводится до нажатия клавиши ВВОД, скопируется в буфер BUF.
В этом есть проблема. Мы сказали, что BUF может хранить только 80 байт максимум, поэтому, если мы введем больше, мы создадим переполнение буфера, и здесь приведены все условия для этого, потому что, если пользователь записывает более 80 байтов, то переполнит наш бак и жидкость закапает вниз.
Дело в том, что под BUF находится переменная COOKIE, так что переполнение будет перезаписывать и заполнять ее значением, которое вы сможете контролировать.
Например, если тот, кто печатает, пишет 80*A и 4*B, 80*A заполнят BUF, а 4*B заполнят COOKIE, и, как мы знаем, когда кто-то печатает символ в консоли, на низком уровне сохраниться значение ASCII.
Поскольку COOKIE будет заполнена четырьмя буквами B, которые эквивалентны значению 0x42, мы можем гарантировать, что значение COOKIE будет 0x42424242, т.е. на моем компьютере адрес COOKIE 0x19FF24 будет иметь 0x42424242 в качестве содержимого.
Дело в том, что мы уже видели, как переполнить и контролировать значение COOKIE.
Для выполнения упражнения вы должны распечатать „you win“. Для этого COOKIE должен быть равен значению 0x41424344, и если бы не было переполнения, это было бы невозможным, так как значение COOKIE никогда не изменялось с самого начала программы. Мы не сможем напечатать „you win“, и для этого мы используем переполнение буфера, в котором говорится, что это может заставить программу выполнить какое-то действие, отличное от того, что было запрограммировано.
В этом случае вы никогда не сможете напечатать “you win”, только переполнение позволит вам это сделать.
Другими словами, вместо того, чтобы передать, например, 80*A и 4*B, для печати „you win“, вы должны передать 80*A, а затем буквы DCBA, поскольку это приведет к тому, что в COOKIE сохранятся значения ASCII.
Формат, в котором хранятся данные является LITTLE ENDIAN. Другими словами, данные в памяти хранятся в обратном порядке, если говорить просто.
И если сохраняется последовательность 0x41424344, система сохранит её в памяти как:
По этой причине, при копировании в память, копирование будет происходить так, как мы набираем, поэтому мы должны записывать значение в обратном порядке, чтобы при чтении из памяти оно было в правильной форме.
Мы можем запустить исполняемый файл в консоли.
И курсор будет мигать, так как функция GET просит меня ввести входные данные. Осторожно наберите 80 символов A и затем DCBA.
В консоли PYTHON или PYCHARM я могу напечатать строку, скопировать ее без кавычек и вставить ее в консоль, чтобы не печатать её как сумасшедший, а затем нажать клавишу ENTER, чтобы ввести ее.
Мы видим, что мы получили „you win“.
Мы можем увидеть это в отладчике. Для этого мы будем использовать X64DBG.
Я выбираю 32-х битную версию.
Если мы остановимся на библиотеке NTDLL.DLL, мы снова нажмем RUN с помощью F9.
Мы видим, что отладчик останавливается на первой инструкции модуля STACK1, которая называется ENTRY POINT или первой инструкции, выполняемой модулем.
Очевидно, что это не похоже на наш исходный код. Вы должны понимать, что компилятор добавляет много кода, чтобы заставить исполняемый файл работать и запускаться правильно. Мы попытаемся найти нашу основную функцию. Мы сможем сориентироваться, посмотрев на строки программы.
Мы выбрали только поиск в текущем регионе. Мы знаем, что строки будут в этой же секции.
Здесь мы видим, что есть строки программы и другие, которые добавил компилятор. Мы дважды щелкаем по одной из наших строк.
Теперь видно намного больше. Мы видим вызов функции MessageBoxA, PRINTF, GETS и сравнение со значением 0x41424344.
Кроме того, мы добавляем плагин для декомпиляции SNOWMAN. Мы можем попытаться увидеть, как он декомпилирует код, т.е. как он пытается получить исходный код или что-то максимально похожее из скомпилированного файла.
Мы видим, что это не идеально, но это лучше чем то, что было.
Я собираюсь поставить BP в начале функции и нажимать F9, пока отладчик не остановится.
Для тех, кто не знает, что такое аргумент функции.
В нашем случае основная функция имеет аргументы, но они не используются внутри функции.
Здесь мы видим, что аргументов два, и они передаются через стек, когда исполняемый файл скомпилирован в 32 бита.
Непосредственно перед вызовом функции, аргументы будут сохранены в стеке.
Когда мы остановимся в начале функции, первое значение в стеке будет равно RETURN ADDRESS, т.е., куда функция вернется после завершения выполнения функции, и ниже этого значения будут аргументы этой функции.
Если я щелкну правой кнопкой мыши по RETURN ADDRESS и выберу FOLLOW DWORD IN DISASSEMBLER, я увижу, куда отладчик должен вернуться после завершения функции.
Он вернется сюда. Это означает, что основная функция была вызвана из вызова, который находится выше. Я могу поставить здесь BP, перезапустить упражнение и убедиться, что это так.
Я помещу BP немного раньше и сделаю перезагрузку программы.
Отладчик остановится здесь.
Он собирается сохранить аргументы основной функции используя эти инструкции PUSH.
Ниже ссылка, для тех кто хочет больше знать про аргументы функции:
Это не очень сложно. Первый аргумент ARGC — это INT, который указывает число параметров консоли, используемых при выполнении программы, включая путь к исполняемому файлу, а ARGV — это массив указателей на строки.
Мы видим, что если я изменю командную строку, передам больше аргументов и перезагружу.
Здесь отладчик останавливается когда собирается сохранить аргументы, используя инструкцию PUSH. Первый аргумент, который сохраняется, является самым дальним, и последний, что вы сохраняете, будет первым аргументом функции.
Я трассирую и каждая инструкция PUSH сохраняет аргументы.
Здесь я могу видеть аргументы функции. Выше приведен первый аргумент ARGC. Он равен 3, так как он отмечает количество аргументов, которые передаются на консоль.
Здесь это 3 аргумента.
Теперь мы нажимаем F7, чтобы сделать STEP INTO и войти в функцию.
Здесь мы видим, что при входе в CALL отладчик сохраняет АДРЕС ВОЗВРАТА в стек.
Итак, как мы уже говорили при входе в функцию, первое, что будет в сохранено в стеке это RETURN ADDRESS (в 32-битной компиляции), а ниже будут аргументы функции, сначала первый аргумент, а затем последовательно остальные.
Второй аргумент, как мы видели, это массив указателей. Здесь мы видим в памяти, что есть три указателя на три строки, которые передаются в качестве аргументов.
Здесь мы остановились в начале функции, чуть ниже у нас находится АДРЕСА ВОЗВРАТА и АРГУМЕНТЫ.
Мы уточняем, что файл скомпилирован в 32-бита, потому что в 64-битной версии аргументы передаются другим способом. Мы увидим это позже.
Затем функция начинает выполняться. Первая вещь — это так называемое ПРОЛОГ, в котором хранится значение EBP функции, которая вызвала нашу.
Это приведет к сохранению значения EBP чуть выше адреса возврата.
Если я выполню инструкцию с помощью F7.
Я вижу, что значение EBP GUARDADO находится в стеке над адресом возврата.
Следующая инструкция в ПРОЛОГЕ:
Она устанавливает значение EBP для текущей функции, который был сохранен и был родительской функцией, которая вызывает нашу (В этом случае моей основной функцией является функция основанная на EBP, в других случаях она может отличаться, и мы увидим их позже)
Помещая в EBP текущее значение ESP, мы добиваемся того, что мы создаем фрейм для нашей текущей функции.
Теперь, поскольку это функция основана на EBP или EBP BASED, внутри функции будет сохранено значение EBP, и оно будет принято в качестве эталонного, а ESP будет меняться.
Это значение EBP берется как базовое.
В функциях основанных на EBP переменные и аргументы могут быть названы по их расстоянию от этого адреса, которое будет храниться в значении EBP до его эпилога.
Мы можем видеть в списке несколько переменных, которые упоминаются как EBP-4 или EBP-54, относящиеся к значению EBP, которое он принимает в данный момент.
Можно сказать, что как только EBP примет свое значение после ПРОЛОГА, он будет похож на водосток, поэтому аргументы всегда будут идти в этом направлении, поэтому EBP + XXX ссылается на аргументы (сохраненный EBP и АДРЕС ВОЗВРАТА также находится ниже, но не будет иметь ссылок в коде), в то время как переменные, как мы увидим, будут выше этого адреса, поэтому ссылка на EBP-XXX относится к некоторой локальной переменной.
Таким образом в функциях ОСНОВАННЫХ НА EBP:
EBP + XXXX = аргументы переданные функции
EBP — XXXX = локальные переменные функции
После ПРОЛОГА будет некоторый способ зарезервировать пространство для переменных. В нашем случае это делается путем перемещения ESP вверх, чтобы оставшееся пространство внизу было зарезервировано для суммы всех длин переменных а, иногда, немного больше на всякий случай, который зависит от компилятора.
00401043 | 83EC 54 | SUB ESP,54
Мы видим, что ESP расположен над EBP, который останется ссылкой, и что 0x54, переведенное в десятичное число, равно 84, что является суммой длины BUF и COOKIE. Помните, что они были 80 и 4 соответственно.
При выполнении создается пространство для переменных BUF и COOKIE размером 84 байта. Вы можете щелкнуть первый столбец в направлении горизонта, и посмотреть значение EBP и найти это значение в стеке. Очевидно, теперь оно будет ниже.
Я делаю двойной щелчок здесь.
Таким образом, мы будем иметь значения относительно EBP также в стеке.
Если я трассирую, мы видим, что от места, где ESP был расположен для резервирования переменных, он всегда будет двигаться вверх, потому что он должен учитывать пространство, выделенное для переменных. При выполнении 4 PUSH для MessageBoxA отладчик помещает переменные выше зарезервированного пространства и увеличвает ESP.
Если я смотрю на стек, я вижу 4 зеленых аргумента, которые я добавляю над зарезервированным пространством, помеченным красным.
При входе в функцию MessageBoxA АДРЕС ВОЗВРАТА этой функции сохраняется в стеке.
Здесь это адрес возврата MessageBoxA. Когда я добираюсь до RET этой функции путем трассировки с помощью F8, и я исполняю MessageBoxA.
Мы видим, что отладчик вернется обратно чуть ниже вызова MessageBoxA.
И те значения PUSH, которые вы передали для функции MessageBoxA и АДРЕС ВОЗВРАТА этой функции, уже использовались, и ESP снова находится чуть выше зарезервированной области, как до вызова любой функции. То же самое произойдет с вызовом функции PRINTF.
После того, как вы пройдете функцию PRINTF, будут напечатаны адреса BUF и COOKIE.
Адрес BUF на моей машине будет 0x19FED4, а адрес COOKIE — 0x19FF24.
Здесь программа читает адрес BUF, чтобы передать его функции GETS и заполнить BUF. Мы можем проверить, совпадает ли адрес с тем, что показывает консоль 0x19FED4.
Теперь, когда на этом адресе я буду сохранять введенные данные, я могу поместить их в дамп, чтобы посмотреть, как там сохраняются байты.
Вот они. Более того, ниже ничего не отображается, поскольку там нет данных.
Когда я вызову функцию GETS с помощью F8, мне нужно будет перейти к консоли, набрать и нажать клавишу ВВОД, чтобы заполнить буфер BUF и переписать COOKIE.
Мы видим, что переменная COOKIE была по адресу 19FF24 на моей машине.
Здесь программа сравнивает COOKIE с 0x41424344.
Мы видим, что EBP-4 говорит, что это COOKIE, в дополнение к адресу, если мы установим ГОРИЗОНТ на значение EBP, как и раньше.
Я делаю двойной щелчок здесь.
Мы видим, что программа не будет переходить и покажет нам you win!
Так мы вручную достигаем цели, которая говорит you win.
Мы динамически проанализировали STACK1, используя X64DBG, который является отладчиком и не позволяет нам анализировать программу без запуска. Для этого мы должны использовать другие инструменты, такие как IDA PRO, GHIDRA или RADARE.
Я могу сделать модель скрипта для эксплуатации упражнения из PYTHON.
В случае с PYTHON 3, я должен поставить круглые скобки в функции PRINT и быть осторожным при добавлении строк, которые должны быть байтами (поместите b перед строками в PYTHON 2).
Я проверяю, что путь правильный и когда я запускаю файл.
Хорошо. У нас уже есть модель скрипта для PYTHON 3 для эксплуатации STACK1. В следующей части мы продолжим статический анализ в IDA, RADARE и GHIDRA.
Обратите внимание, что помимо задачи STACK1 есть ещё версии 2, 3 и 4. Вы можете попытаться решить их. Они очень простые и похожи на STACK1, так что не скучайте.
В следующей части мы увидим IDA FREE, RADARE и GHIDRA.