Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
libmempool — Инструментарий анализа кучи для mempool | Kitploit
Инструменты/GitHubGitHub/nccgroup/libmempool
Безопасность встроенных системКриминалистика памятиОбратная инженерияОтладчикиАнализ Бинарных ФайловАнализ Прошивок
GitHubnccgroup/libmempool

libmempool

Инструментарий анализа кучи для mempool

Репозиторий
137154 лет назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

libmempool

Предварительное замечание: рекомендуем использовать этот инструмент в составе asatools, но его также можно использовать автономно.

libmempool — это Python-скрипт и инструмент анализа для GDB, предназначенный для анализа структур данных, связанных с mempool, которые находятся внутри различных куч (heaps) на устройствах Cisco ASA. Обычно эта информация встраивается в чанк кучи или является расширением какой-либо другой распространённой структуры кучи, например структуры mstate из dlmalloc.

Cisco использует термин «mempool» для описания областей памяти, отображаемых для различных целей, таких как общие выделения памяти, DMA и т. д. Обычно в таких областях содержится своя куча, например dlmalloc. Процедуры выделения памяти в этих mempool обычно реализуются через обёртки (wrappers) вокруг нижележащего аллокатора кучи, и эти обёртки внедряют в результирующие выделения метаданные, специфичные для mempool. Мы называем такие метаданные заголовком mempool или сокращённо mh. Аналогично мы обычно называем mempool сокращённо mp. Использование mh для обозначения заголовка mempool также согласуется с различными строками, встречающимися в бинарных файлах lina в Cisco ASA.

Хотя libmempool можно использовать как автономный инструмент для анализа некоторых аспектов, связанных с заголовками и структурами данных mempool, его наибольшая ценность проявляется при использовании в качестве callback-функции из других библиотек, таких как libdlmalloc или libptmalloc.

Стоит отметить, что некоторые аспекты mempool, такие как бины, используемые для отслеживания используемых чанков, встроены в структуру mstate из dlmalloc 2.8.x и следуют тем же правилам размера бинов. Это означает, что почти наверняка вам придётся исследовать по крайней мере mstate, содержащую данные mempool, с помощью libdlmalloc.

Поддерживаемые версии

libmempool протестирован на 32-битных / 64-битных версиях Cisco ASA (как серии ASA5500-X, так и GNS3), использующих dlmalloc2.8 или основанный на ptmalloc2 аллокатор из glibc. Он тестировался на многочисленных версиях ASA, включая многие ветки 8.x.y и 9.x.y. Тем не менее, вполне возможно, что на какой-то версии он может не работать.

Установка

Для автономного использования libmempool достаточно импортировать файл libmempool.py в свой проект. Это позволяет выполнять некоторые ограниченные действия, например регистрировать объект mpcallback. Это может быть полезно при офлайн-анализе зарегистрированной функциональности кучи.

Для импорта в GDB скрипту требуется только GDB с поддержкой Python. Хотя большинство современных версий GDB перешли на Python 3, некоторые всё ещё ожидают Python 2.7. Скрипт протестирован на обеих версиях, но в основном разработка и тестирование выполняются с Python 3.

(gdb) source libmempool_gdb.py

Мы выносим большую часть логики, связанной с GDB, из libmempool.py в libmempool_gdb.py, чтобы проверить абстрагирование и чтобы вы могли легко использовать libmempool.py вне GDB. Вероятно, в будущем это изменится, поскольку мы планируем реализовать аналогичные абстракции отладочного движка, используемые другими инструментами анализа кучи, такими как libheap и shadow.

Использование

Хотя большая часть ценности libmempool заключается в предоставляемой им callback-функции mpcallback, существует также ряд встроенных команд GDB, которые мы можем рассмотреть.

(gdb) mphelp 
[libmempool] mempool commands for gdb
[libmempool] mpheader -v -x <addr>           : show chunk contents (-v for verbose, -x for data dump)
[libmempool] mpbinwalk [-v] [-p <addr>] <sz> : walk an mpbin and operate on each chunk in a bin
[libmempool] mpbin <addr>                    : determine to which bin an mp_header is associated to
[libmempool] mpmstate <addr>                 : display and cache a mempool mstate address
[libmempool] mphelp

Предположим, нам известен адрес некоторого заголовка mempool — мы можем проанализировать его данные. Обратите внимание, что это должен быть адрес самого заголовка mempool, а не адрес метаданных чанка основного аллокатора. Итак, мы можем вывести содержимое следующим образом:

(gdb) mpheader 0x7fffbc1c1ca0
struct mp_header @ 0x7fffbc1c1ca0 {
mh_magic      = 0xa11c0123
mh_len        = 0x3
mh_refcount   = 0x10000
mh_unused     = 0x0
mh_fd_link    = 0x7fffbc1c19e0 (OK)
mh_bk_link    = 0x7ffff7ff7540 (-)
alloc_pc      = 0x55555849e260 (-)
free_pc       = 0x0 (-)

Мы также можем вывести шестнадцатеричное содержимое чанка с помощью -x.

(gdb) mpheader -x 0x7fffbc1c1ca0 
struct mp_header @ 0x7fffbc1c1ca0 {
mh_magic      = 0xa11c0123
mh_len        = 0x3
mh_refcount   = 0x10000
mh_unused     = 0x0
mh_fd_link    = 0x7fffbc1c19e0 (OK)
mh_bk_link    = 0x7ffff7ff7540 (-)
alloc_pc      = 0x55555849e260 (-)
free_pc       = 0x0 (-)
0x3 bytes of chunk data:
0x7fffbc1c1cd0:	0x55	0x04	0x03

Mempool'ы имеют концепцию бинов — дважды связанных списков, размеры которых совпадают с размерами бинов dlmalloc, но которые используются для отслеживания используемых (in-use) чанков, а не свободных. Это делается для учёта использования памяти на устройствах Cisco. Часто можно найти чанк, содержащий заголовок mempool, но ещё не знать, где в куче находится структура mstate. Чтобы сориентироваться, можно использовать команду mpbin, которая выведет адрес бина mempool, в котором в данный момент находится используемый чанк. Например:

(gdb) mpbin 0x7fffbc1c1ca0 
[libmempool] Found bin start at 0x7ffff7ff7540
[libmempool] Cached new mp_mstate @ 0x7ffff7ff73c0
[libmempool] mp_smallbin[08] - sz: 0x00000040 cnt: 0x00d3, mh_fd_link: 0x7fffbc1c1ca0

Эта команда не только находит начало mempool-части структуры mstate, но и кэширует его, а также выводит конкретный бин, в котором находится чанк. При желании можно использовать команду mpbinwalk для вывода всех 0xd3 чанков из этого бина или только до определённого количества:

(gdb) mpbinwalk 0x40
[libmempool] mp_header @ 0x7ffff7ff7540 - mh_len: 0x00000000, alloc_pc: 0x00000000 [BIN HEAD]
[libmempool] mp_header @ 0x7fffbc1c1ca0 - mh_len: 0x00000003, alloc_pc: 0x55555849e260
[libmempool] mp_header @ 0x7fffbc1c19e0 - mh_len: 0x00000003, alloc_pc: 0x55555849e260
[libmempool] mp_header @ 0x7fffbc1c1750 - mh_len: 0x00000003, alloc_pc: 0x55555849e260
[libmempool] mp_header @ 0x7fffbc1bffa0 - mh_len: 0x00000003, alloc_pc: 0x55555849e260
[libmempool] mp_header @ 0x7fffbc1bff60 - mh_len: 0x00000003, alloc_pc: 0x5555584a1288
[libmempool] mp_header @ 0x7fffbc1c0050 - mh_len: 0x00000003, alloc_pc: 0x55555849e260
[...]

Теперь, если мы хотим вывести всю mempool-часть структуры mstate (то есть все бины и связанную статистику), мы можем использовать команду mpmstate:

Скачать инструмент