Фреймворк символьного выполнения для EVM и нативных бинарей (x86/64, ARM) от Trail of Bits. Для Ethereum: исследует все пути выполнения, генерирует PoC-транзакции для найденных уязвимостей. Для нативных бинарей: поиск RCE, use-after-free, автогенерация тест-кейсов.
pip install manticore[native] # EVM manticore contract.sol # Нативный бинарь manticore ./vulnerable_binary
Этот проект больше не разрабатывается и не поддерживается внутри компании.

Manticore — это инструмент символьного выполнения для анализа смарт-контрактов и бинарных файлов.
Manticore может анализировать следующие типы программ:
Примечание: Мы рекомендуем устанавливать Manticore в виртуальное окружение, чтобы избежать конфликтов с другими проектами или пакетами
Вариант 1: Установка из PyPI:
pip install manticore
Вариант 2: Установка из PyPI, с дополнительными зависимостями, необходимыми для выполнения нативных бинарных файлов:
pip install "manticore[native]"
Вариант 3: Установка ночной сборки для разработки:
pip install --pre "manticore[native]"
Вариант 4: Установка из ветки master:
git clone https://github.com/trailofbits/manticore.git
cd manticore
pip install -e ".[native]"
Вариант 5: Установка через Docker:
docker pull trailofbits/manticore
После установки CLI-инструмент manticore и Python API будут доступны.
Для установки версии для разработки см. нашу вики.
Manticore имеет интерфейс командной строки, который может выполнять базовый символьный анализ бинарного файла или смарт-контракта.
Результаты анализа будут размещены в рабочей директории, название которой начинается с mcore_. Информацию о рабочей директории см. в вики.
CLI Manticore автоматически определяет, что вы пытаетесь тестировать контракт, если (например)
расширение контракта — .sol или .vy. Смотрите демо.
Нажмите, чтобы раскрыть:
$ manticore examples/evm/umd_example.sol
[9921] m.main:INFO: Registered plugins: DetectUninitializedMemory, DetectReentrancySimple, DetectExternalCallAndLeak, ...
[9921] m.e.manticore:INFO: Starting symbolic create contract
[9921] m.e.manticore:INFO: Starting symbolic transaction: 0
[9921] m.e.manticore:INFO: 4 alive states, 6 terminated states
[9921] m.e.manticore:INFO: Starting symbolic transaction: 1
[9921] m.e.manticore:INFO: 16 alive states, 22 terminated states
[13761] m.c.manticore:INFO: Generated testcase No. 0 - STOP(3 txs)
[13754] m.c.manticore:INFO: Generated testcase No. 1 - STOP(3 txs)
...
[13743] m.c.manticore:INFO: Generated testcase No. 36 - THROW(3 txs)
[13740] m.c.manticore:INFO: Generated testcase No. 37 - THROW(3 txs)
[9921] m.c.manticore:INFO: Results in ~/manticore/mcore_gsncmlgx
Предоставляется альтернативный CLI-инструмент, который упрощает тестирование контрактов и позволяет писать методы-свойства на том же языке высокого уровня, что и сам контракт. Ознакомьтесь с документацией manticore-verifier. Смотрите демо
Нажмите, чтобы раскрыть:
$ manticore examples/linux/basic
[9507] m.n.manticore:INFO: Loading program examples/linux/basic
[9507] m.c.manticore:INFO: Generated testcase No. 0 - Program finished with exit status: 0
[9507] m.c.manticore:INFO: Generated testcase No. 1 - Program finished with exit status: 0
[9507] m.c.manticore:INFO: Results in ~/manticore/mcore_7u7hgfay
[9507] m.n.manticore:INFO: Total time: 2.8029580116271973
Manticore предоставляет программный интерфейс Python, который можно использовать для создания мощных пользовательских инструментов анализа.
Для смарт-контрактов Ethereum API может использоваться для детальной проверки произвольных свойств контракта. Пользователи могут задавать начальные условия, выполнять символьные транзакции, а затем проверять обнаруженные состояния, чтобы убедиться в выполнении инвариантов контракта.
Нажмите, чтобы раскрыть:
from manticore.ethereum import ManticoreEVM
contract_src="""
contract Adder {
function incremented(uint value) public returns (uint){
if (value == 1)
revert();
return value + 1;
}
}
"""
m = ManticoreEVM()
user_account = m.create_account(balance=10000000)
contract_account = m.solidity_create_contract(contract_src,
owner=user_account,
balance=0)
value = m.make_symbolic_value()
contract_account.incremented(value)
for state in m.ready_states:
print("can value be 1? {}".format(state.can_be_true(value == 1)))
print("can value be 200? {}".format(state.can_be_true(value == 200)))
Также можно использовать API для создания пользовательских инструментов анализа для Linux бинарных файлов. Адаптация начального состояния помогает избежать проблемы взрыва состояний, которая часто возникает при использовании CLI.
Нажмите, чтобы раскрыть:
# example Manticore script
from manticore.native import Manticore
m = Manticore.linux('./example')
@m.hook(0x400ca0)
def hook(state):
cpu = state.cpu
print('eax', cpu.EAX)
print(cpu.read_int(cpu.ESP))
m.kill() # tell Manticore to stop
m.run()
Manticore также может вычислять функции WebAssembly со символьными входными данными для проверки свойств или общего анализа.
Нажмите, чтобы раскрыть:
from manticore.wasm import ManticoreWASM
m = ManticoreWASM("collatz.wasm")
def arg_gen(state):
# Generate a symbolic argument to pass to the collatz function.
# Possible values: 4, 6, 8
arg = state.new_symbolic_value(32, "collatz_arg")
state.constrain(arg > 3)
state.constrain(arg < 9)
state.constrain(arg % 2 == 0)
return [arg]
# Run the collatz function with the given argument generator.
m.collatz(arg_gen)
# Manually collect return values
# Prints 2, 3, 8
for idx, val_list in enumerate(m.collect_returns()):
print("State", idx, "::", val_list[0])
ulimit -s 100000 или передав --ulimit stack=100000000:100000000 в команду docker run.solc в вашем $PATH.crytic-compile непосредственно на вашем коде, чтобы легче выявить любые проблемы.Manticore полагается на внешний решатель, поддерживающий smtlib2. В настоящее время поддерживаются Z3, Yices и CVC4, и их можно выбрать через командную строку или параметры конфигурации.
Если Yices доступен, Manticore будет использовать его по умолчанию. Если нет, он переключится на Z3 или CVC4. Если вы хотите вручную выбрать решатель, вы можете сделать это следующим образом:
manticore --smt.solver Z3
Более подробную информацию можно получить по адресу https://cvc4.github.io/. В остальных случаях просто получите бинарный файл и используйте его.
sudo wget -O /usr/bin/cvc4 https://github.com/CVC4/CVC4/releases/download/1.7/cvc4-1.7-x86_64-linux-opt
sudo chmod +x /usr/bin/cvc4
Yices невероятно быстр. Подробнее здесь: https://yices.csl.sri.com/
sudo add-apt-repository ppa:sri-csl/formal-methods
sudo apt-get update
sudo apt-get install yices2
Не стесняйтесь заходить в наш Slack-канал #manticore в Empire Hacking за помощью по использованию или расширению Manticore.
Документация доступна в нескольких местах:
Вики содержит информацию о начале работы с Manticore и внесении вклада.
Справочник по API содержит более подробную и глубокую документацию по нашему API.
Директория примеров содержит небольшие примеры, демонстрирующие возможности API.
Репозиторий manticore-examples содержит более сложные примеры, включая некоторые реальные задачи CTF.
Если вы хотите сообщить об ошибке или запросить функциональность, пожалуйста, используйте нашу страницу issues.
По вопросам и разъяснениям, пожалуйста, посетите страницу обсуждений.
Manticore лицензируется и распространяется под лицензией AGPLv3. Свяжитесь с нами, если вам нужно исключение из условий.
Если вы используете Manticore в академических работах, рассмотрите возможность подачи заявки на Crytic $10k Research Prize.