Платформа бинарного анализа Университета Карнеги -Меллона (CMU BAP) - это набор коммунальных услуг и библиотек, которые позволяют анализировать бинарные программы. BAP поддерживает X86, X86-64, ARM, MIPS, PowerPC и новые архитектуры могут быть добавлены с помощью плагинов. BAP включает в себя различные анализы, стандартный интерпретатор, интерпретатор микроэлексии и символический исполнитель. BAP имеет свой собственный домен, специфичный для домена, Primus LISP, который используется для реализации анализа, определения условий проверки, функций моделирования (написание заглушек) и даже взаимодействие с решателем SMT. Репозиторий Toolkit включает в себя различные примеры инструментов анализа программы, которые могут быть реализованы с помощью BAP и могут использоваться в качестве отправной точки (в дополнение к учебному пособию) для реализации пользовательских анализов. BAP может использоваться в качестве структуры с одной утилитой BAP, которая расширена плагинами или может использоваться в качестве библиотеки, встроенной в пользовательское приложение, которое может быть записано в OCAML или, на любом другом языке, с использованием C -привязки. Мы также оказываем некоторую минимальную поддержку для Python, чтобы упростить обучение BAP.
BAP был разработан в CMU, Cylab и спонсируется грантами Министерства обороны США, Siemens, Boeing, ForallSecure и правительства Кореи, см. Спонсоры для получения дополнительной информации. BAP используется в различных учреждениях и служит основой для многих интересных проектов, некоторые из них выделены ниже:
Мы предоставляем бинарные пакеты, упакованные для производных Debian и Red Hat. Для других распределений мы предоставляем архивы TGZ. Чтобы установить бап на производную Debian:
wget https://github.com/BinaryAnalysisPlatform/bap/releases/download/v2.5.0/{bap,libbap,libbap-dev}_2.5.0.deb
sudo dpkg -i {bap,libbap,libbap-dev}_2.5.0.debНаши бинарные пакеты не включают в себя среду разработки OCAML. Если вы собираетесь написать анализ в OCAML, вам нужно установить BAP из исходного кода, используя либо OPAM, либо путем клонирования и создания этого репозитория напрямую. Метод OPAM рекомендуется. После установки следующие три команды должны установить платформу в недавно созданный коммутатор.
opam init --comp=4.14.1 # inits opam and install the OCaml compiler
opam install bap # installs bap and its dependencies
eval $( opam env ) ` # activates opam environmentИли, если у вас уже есть переключатель, где вы хотите установить бап, то просто сделайте
opam install bap
Команда opam install bap также попытается установить системные зависимости BAP, используя диспетчер пакетов операционной системы. Если он сбой из -за отсутствующей системной зависимости, попробуйте установить ее вручную, а затем повторите команду opam install bap . Если это все еще не работает, не стесняйтесь заходить на наш чат и обратиться за помощью. Он укомплектован дружелюбными людьми, которые будут рады помочь.
Приведенная выше инструкция принесет вам последний стабильный выпуск BAP. Если вы заинтересованы в наших выпусках, которые автоматически обновляются каждый раз, когда происходит коммит в главную ветвь, вы можете создать новый переключатель, который использует наш репозиторий для тестирования
opam switch create bap-testing --repos
default,bap=git+https://github.com/BinaryAnalysisPlatform/opam-repository#testing 4.14.1
opam install bap После того, как он будет добавлен, репозиторий bap будет иметь приоритет над стабильным репозиторием, и вы получите свежевыбранные пакеты BAP прямо с фермы.
Если вы хотите построить BAP вручную или просто хотите заняться с помощью внутренних групп BAP, то вы можете клонировать этот репозиторий и построить его вручную. Мы предлагаем начать со свежей среды без установки BAP, чтобы предотвратить столкновения или даже лучше использовать локальный переключатель, например,
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam switch create . --deps-only
dune build && dune installПриведенный выше фрагмент будет клонировать BAP, создавать свежий локальный коммутатор, установить необходимые зависимости, включая систему One, и, наконец, создать и установить BAP с дюн. В качестве альтернативы, если у вас уже есть переключатель, где вы хотите создать и установить BAP, вы можете использовать
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam install . --deps-only
dune build && dune install
Установить BAP и его зависимости в выбранную в настоящее время выключатель.
BAP, как Docker или GIT, управляется одной утилитой командной строки под названием BAP. Просто введите bap в своей оболочке, и он напечатает сообщение, которое показывает возможности BAP. Команда disassemble возьмет бинарную программу, разобрать ее, поднять ее в агностическое представление промежуточной архитектуры, создать график потока управления и, наконец, применить поэтапный пользовательский анализ в форме разборных проходов. Наконец, опция --dump ( -d Короче) выведет полученную программу в указанном формате. Это команда по умолчанию, поэтому вам даже не нужно указывать ее, например, следующее будет разобрать и сбросить бинарное бинар /bin/echo :
bap /bin/echo -d Обратите внимание, что в отличие от objdump , эта команда построит график потока управления программы. Если вы просто хотите сбросить каждую инструкцию бинарной один за другим (так называемый режим линейного развертки), то вы можете использовать команду objdump , например,
bap objdump /bin/echo --show-{insn=asm,bil} Если ваш вход является каплей машинного кода, а не исполняемого файла, то вы можете использовать raw погрузчик, например,
bap objdump /bin/echo --loader=raw --raw-base=0x400000 --show-{insn=asm,bil} Необработанный погрузчик принимает несколько параметров, таких как смещения, длины и базовые адреса, что делает его швейцарским ножом, который вы можете использовать в качестве открытия банки для форматов, которые не известны BAP. Необработанный загрузчик работает для всех команд, которые открывают файлы, например, если raw загрузчик используется вместе с командой disassemble , BAP по -прежнему автоматически идентифицирует запуска функции и создаст подходящий CFG, даже не зная, где находится код в бинарном
bap /bin/echo --loader=raw --raw-base=0x400000 -d Если вы хотите сыграть вручную с байтами, например, введите инструкцию, кодирующую вручную, и посмотрите, как BAP разбирает его и какую семантику у него есть, то mc - это команда, которую вы ищете. Он назван в соответствии с соответствующей утилитой в LLVM и означает машинный код и имеет тот же интерфейс, что и команда objdump за исключением того, что он принимает кодирование инструкции ASCII вместо двоичного файла, например,, например,
bap mc --show-{insn=asm,bil} -- 48 83 ec 08или
bap mc --show-{insn=asm,bil} "x48x83xecx08"
Он распознает несколько входных форматов (включая llvm-mc , используется для своего варианта -show-encoding ). Проконсультируйтесь с документацией для получения более подробной информации.
BAP-это фреймворк на основе плагина, и если вы хотите разработать новый анализ, вы можете написать плагин, создать его, установить, и он будет работать с остальной частью BAP без какого-либо перекомпиляции. Есть много точек расширения, которые вы можете использовать для добавления нового анализа, изменения существующего или даже создания собственных приложений. Мы начнем с простого примера, который регистрирует разборчивый проход к команде разборки. Предположим, что мы хотим написать анализ, который оценивает соотношение инструкций по прыжкам к общему количеству инструкций в двоичном. Мы начнем с создания пустого файла с именем jmp.ml в пустой папке (имя папки не имеет значения). Далее, используя наш любимый текстовый редактор, мы внесем в него следующий код:
open Core_kernel
open Bap_main
open Bap.Std
let counter = object
inherit [ int * int ] Term. visitor
method ! enter_term _ _ (jmps,total) = jmps,total + 1
method ! enter_jmp _ (jmps,total) = jmps + 1 ,total
end
let main proj =
let jmps,total = counter#run ( Project. program proj) ( 0 , 0 ) in
printf " ratio = %d/%d = %g n " jmps total ( float jmps /. float total)
let () = Extension. declare @@ fun _ctxt ->
Project. register_pass' main;
Ok ()Теперь мы можем создавать, установить и запустить наш анализ, используя следующие команды:
bapbuild jmp.plugin
bapbundle install jmp.plugin
bap /bin/echo --pass=jmp
Давайте кратко пройдемся через код. counter объект - это посетитель, в котором есть состояние, состоящее из пары счетчиков. Первый счетчик отслеживает количество терминов JMP, а второй счетчик увеличивается каждый раз, когда мы вводим любой термин. main функция просто запускает счетчик и печатает вывод. Мы объявляем наше расширение Использовать функцию Extension.Declare из библиотеки BAP_MAIN. Расширение - это просто функция, которая получает контекст (который можно использовать для получения параметров конфигурации). В этой функции мы регистрируем нашу main функцию в качестве прохода, используя функцию Project.register_pass .
Немного более сложный пример, а также пример, который использует Python, можно найти в нашем уроке.
Вы также можете создать и установить плагины BAP с помощью Dune. Для этого вам нужно определить библиотеку и использовать plugin , которая использует эту библиотеку. Ниже приведен файл шаблона dune ,
(library
(name FOO)
(public_name OUR-FOO.plugin)
(libraries bap bap-main))
(plugin
(name FOO)
(package OUR-FOO)
(libraries OUR-FOO.plugin)
(site (bap-common plugins)))
Eveything, которое используется в вышеупомянутом фрагменте, является заполнителем, который вы должны заменить соответствующими частными и публичными именами для вашего плагина. Обратите внимание, что расширение .plugin не является необходимым, но зарегистрируется как хорошее соглашение.
BAP также поставляется с интерактивным утилитным baptop Toplevel. Это утилита, подобная оболочке, которая интерактивно оценивает выражения OCAML и печатает их значения. Он будет загружать библиотеки BAP и инициализировать все плагины для вас, так что вы можете интерактивно исследовать огромный мир BAP. Утилита baptop также может служить неинтерактивным интерпретатором, так что вы можете запустить свои сценарии OCAML, например, baptop myscript.ml или даже указать его, используя Sha-Bang в верхней части вашего файла, например, #!/usr/bin/env baptop . Мы построили baptop с помощью UTOP, но вы можете легко использовать любой другой Ocaml Toplevel, включая сам ocaml , просто загрузите библиотеку bap.top , например, для ванильного ocaml Toplevel Используйте следующие директивы
#use " topfind " ;;
#require " bap.top " ;;Мы понимаем, что бап огромный, и его легко потерять. Мы постоянно работаем над улучшением документации, гарантируя, что каждая функция в BAP API была тщательно документирована. Но писать руководящие принципы более высокого уровня в форме руководств или учебных пособий гораздо сложнее и очень трудоемко, особенно учитывая, насколько разные цели наших коллег-исследователей и пользователей. Поэтому мы используем обратный подход и предпочитаем отвечать на реальные вопросы, а не преждевременно пытаться решить все возможные вопросы. Мы будем рады видеть вас в вашем чате, в котором можно найти поиск, проиндексированный Google, Archive.
Время от времени мы пишем в наш блог и вики и поощряем всех внести свой вклад в них обоих. Вы также можете опубликовать свои вопросы о StackOverflow или обсудить BAP на доске OCAML. У нас также есть милый канал Discord, который имеет гораздо меньше трафика, чем у нашего дрюка.
BAP построен сообществом, и мы приветствуем все взносы от авторов, которые готовы поделиться ими по лицензии MIT. Если вы не думаете, что ваш анализ или инструмент соответствуют этому репозиторию (например, он имеет ограниченное использование, не полностью готовое, не соответствует нашим стандартам и т. Д.), То вы можете рассмотреть возможность содействия нашему хранилищу BAP-Plugins, который представляет собой набор полезных плагинов BAP, которые недостаточно зрелы, чтобы быть включенным в основное распределение. В качестве альтернативы вы можете рассмотреть возможность расширения нашего инструментария с помощью вашего инструмента.
Конечно, нет необходимости представлять свою работу одному из наших репозиториев. BAP-это фреймворк на основе плагинов, и ваш код может быть размещен в любом месте и иметь любую лицензию (включая собственность). Если вы хотите сделать свою работу доступной для сообщества, было бы неплохо выпустить ее через Opam.
ForallSecure
Boeing
DARPA VET Project
Siemens Ag
Грант Института информации и коммуникационных технологий (IITP), финансируемый правительством Кореи (MSIT) (№ 2015-0-00565, Разработка технологий обнаружения уязвимостей для безопасности программного обеспечения IOT)
Пожалуйста, свяжитесь с нами, если вы хотите стать спонсором или ищите более глубокое сотрудничество.