Платформа для бинарного анализа на базе символьного исполнения: способна автоматически найти входные данные, которые проведут программу по заданному пути кода (например, к "Access Granted" без знания пароля), без запуска реального эксплойта. Используется в CTF, реверс-инжиниринге малвари и академических исследованиях уязвимостей.
python3 -m venv angr-env && source angr-env/bin/activate
pip install angr
python3 -c "
import angr
proj = angr.Project('/path/to/binary', auto_load_libs=False)
state = proj.factory.entry_state()
simgr = proj.factory.simulation_manager(state)
simgr.explore(find=lambda s: b'Success' in s.posix.dumps(1))
print(simgr.found[0].posix.dumps(0))
"
angr — это универсальный фреймворк для анализа бинарных файлов. Его разработали Лаборатория компьютерной безопасности Калифорнийского университета в Санта-Барбаре, SEFCOM при Университете штата Аризона, их команда по CTF — Shellphish, сообщество разработчиков ПО с открытым исходным кодом и @rhelmot.
Домашняя страница: https://angr.io
Репозиторий проекта: https://github.com/angr/angr
Документация: https://docs.angr.io
Документация API: https://docs.angr.io/en/latest/api.html
angr — это набор библиотек для Python 3, которые позволяют загрузить бинарный файл и делать с ним множество интересных вещей:
Наиболее частая операция в angr — это загрузка бинарного файла: p = angr.Project('/bin/bash'). Если вы делаете это в расширенной REPL, такой как IPython, вы можете использовать автодополнение по Tab для просмотра доступных методов верхнего уровня и их документации.
Краткая версия «как установить angr»: mkvirtualenv --python=$(which python3) angr && python -m pip install angr.
angr выполняет множество задач по анализу бинарных файлов. Для начала вот простой пример использования символического выполнения для получения флага в задаче CTF.
import angr
project = angr.Project("angr-doc/examples/defcamp_r100/r100", auto_load_libs=False)
@project.hook(0x400844)
def print_flag(state):
print("FLAG SHOULD BE:", state.posix.dumps(0))
project.terminate_execution()
project.execute()