|

Shellcode своими руками
Xakep, номер #044, стр. 044-038-3
Команда pop eax приведет к тому, что в регистре eax окажется адрес, следующий за call, а там удобно разместить секцию данных.
3. Обращение к функциям системы. В случае *никс-шеллкода все просто - обращение к функциям системы производится через int 80. А вот с windows дело обстоит хуже: через прерывания, оставшиеся в наследство от dos, ничего особо хорошего не сделаешь, максимум - записать что-нибудь в файл или запустить программу. Работа с более современными функциями - сеть, графика и т.п. - осуществляется через вызовы библиотек.
При загрузке программы сообщаются адреса всех нужных ей функций, а вот кто сообщит их шеллкоду? Если мы точно знаем, что по такому-то адресу в памяти находится обращение к такой-то функции библиотеки, то нам повезло, но эти адреса зависят от версии программы.
Тут нам поможет поиск по сигнатуре: допустим, мы знаем, что кусок кода программы определенного вида содержит вызов нужной нам функции. Например, мы ищем кусок кода по шаблону FF 15 XX XX 40 00 A3 XX XX 40 00 и знаем, что в нашей программе это - вызов GetCommandLineA из kernel32.dll.
Другой способ - искать по сигнатуре саму библиотеку kernel32.dll - так делает, например, интернет-червь CodeRed. При этом мы может обратиться к области памяти, недоступной для чтения, и вызвать аварийное завершение программы. Для перехвата аварийного завершения нужно установить Structured Exception Handler, реализацию технологии смотри в самом CodeRed :).
На чем писать шеллкод?
Шеллкод необходимо писать на ассемблере, но не обязательно, чтобы ассемблер был под ту же ОС (эксплоиты для linux вполне можно писать на tasm32), но важно, чтобы он был рассчитан на ту же архитектуру процессора. Для тех, кто ассемблер не любит, могу посоветовать утилиту от team teso, превращающую код на си в шеллкод без нолей. Но, честно говоря, человеку, не знающему ассемблер, пытаться создавать эксплоиты довольно сложно, и никакие утилиты тут не помогут :).
Обычный прием - сделать бинарник, содержащий шеллкод, и вырезать его оттуда. Однако не пытайся вырезать куски "настоящих" бинарников - код, находящийся в них, в качестве шеллкода непригоден! Unix-бинарники обращаются к системным функциям через библиотеку libc, виндовские - через .dll-библиотеки, при этом код привязывается к таблице импортов бинарника, и работать отдельно от _своего_ бинарника не будет.
Миф об универсальной защите
При переполнении стека выполняемый код также находится в стеке (а обычно при нормальной работе системы такого не бывает), и кому-то, по слухам, нашему соотечественнику Solar Designer'у, пришла в голову идея, что запрет исполнения кода, находящегося в стеке, позволит навсегда решить проблему переполнения стека. Используя хитрый трюк ушами с особенностями процессоров Intel 586 (именно 586, на 386 и 486 это не сработает, хотя кто о них сейчас помнит), ему удалось это реализовать в своем проекте OpenWall. Также существует патч для ядра Linux'а - PAX, заложенный во многие дистрибутивы, например, BlackCat, и коммерческий продукт под Windows - SecureStack, автор - другой наш соотечественник.
Назад на стр. 044-038-2 Содержание Вперед на стр. 044-038-4
|