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

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

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

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

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

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/nccgroup/libmempool
Embedded Systems SecurityMemory ForensicsReverse EngineeringDebuggersBinary AnalysisFirmware Analysis
GitHubnccgroup/libmempool

libmempool

Heap analysis tooling for mempool

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

Популярное

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

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

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

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

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

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.

root@kitploit:~
(gdb) source libmempool_gdb.py

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

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

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

root@kitploit:~
(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, а не адрес метаданных чанка основного аллокатора. Итак, мы можем вывести содержимое следующим образом:

root@kitploit:~
(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.

root@kitploit:~
(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, в котором в данный момент находится используемый чанк. Например:

root@kitploit:~
(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 чанков из этого бина или только до определённого количества:

root@kitploit:~
(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:

root@kitploit:~
(gdb) mpmstate 0x7ffff7ff73c0
struct mp_mstate @ 0x7ffff7ff73c0 {
mp_smallbin[00] - sz: 0x00000000 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[01] - sz: 0x00000008 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[02] - sz: 0x00000010 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[03] - sz: 0x00000018 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[04] - sz: 0x00000020 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[05] - sz: 0x00000028 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[06] - sz: 0x00000030 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[07] - sz: 0x00000038 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[08] - sz: 0x00000040 cnt: 0x00d3, mh_fd_link: 0x7fffbc1c1ca0
mp_smallbin[09] - sz: 0x00000048 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[10] - sz: 0x00000050 cnt: 0x0429, mh_fd_link: 0x7fffa4000d10
mp_smallbin[11] - sz: 0x00000058 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[12] - sz: 0x00000060 cnt: 0x335d, mh_fd_link: 0x7fffb80064b0
mp_smallbin[13] - sz: 0x00000068 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[14] - sz: 0x00000070 cnt: 0x073a, mh_fd_link: 0x7fffbc1c7260
mp_smallbin[15] - sz: 0x00000078 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[16] - sz: 0x00000080 cnt: 0x0301, mh_fd_link: 0x7fffbc1c72d0
mp_smallbin[17] - sz: 0x00000088 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[18] - sz: 0x00000090 cnt: 0x0c98, mh_fd_link: 0x7fffc9488920
mp_smallbin[19] - sz: 0x00000098 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[20] - sz: 0x000000a0 cnt: 0x0161, mh_fd_link: 0x7fffa40009a0
mp_smallbin[21] - sz: 0x000000a8 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[22] - sz: 0x000000b0 cnt: 0x0092, mh_fd_link: 0x7fffa4000a40
mp_smallbin[23] - sz: 0x000000b8 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[24] - sz: 0x000000c0 cnt: 0x0120, mh_fd_link: 0x7fffbc1c1270
mp_smallbin[25] - sz: 0x000000c8 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[26] - sz: 0x000000d0 cnt: 0x00ba, mh_fd_link: 0x7fffbc1b51a0
mp_smallbin[27] - sz: 0x000000d8 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[28] - sz: 0x000000e0 cnt: 0x005b, mh_fd_link: 0x7fffc9485020
mp_smallbin[29] - sz: 0x000000e8 cnt: 0x0000, mh_fd_link: 0x0
mp_smallbin[30] - sz: 0x000000f0 cnt: 0x016e, mh_fd_link: 0x7fffbc1c7040
mp_smallbin[31] - sz: 0x000000f8 cnt: 0x0000, mh_fd_link: 0x0
mp_treebin[00] - sz: 0x00000180 cnt: 0x050f, mh_fd_link: 0x7fffbc1c7130
mp_treebin[01] - sz: 0x00000200 cnt: 0x00ce, mh_fd_link: 0x7fffbc1c2610
mp_treebin[02] - sz: 0x00000300 cnt: 0x011a, mh_fd_link: 0x7fffa40053c0
mp_treebin[03] - sz: 0x00000400 cnt: 0x013e, mh_fd_link: 0x7fffa4000f80
mp_treebin[04] - sz: 0x00000600 cnt: 0x016f, mh_fd_link: 0x7fffbc1c2a80
mp_treebin[05] - sz: 0x00000800 cnt: 0x009a, mh_fd_link: 0x7fffbc1b4880
mp_treebin[06] - sz: 0x00000c00 cnt: 0x0081, mh_fd_link: 0x7fffbc1b38b0
mp_treebin[07] - sz: 0x00001000 cnt: 0x002b, mh_fd_link: 0x7fffbc1b2330
mp_treebin[08] - sz: 0x00001800 cnt: 0x0326, mh_fd_link: 0x7fffc9368e10
mp_treebin[09] - sz: 0x00002000 cnt: 0x0038, mh_fd_link: 0x7fffc92e9c60
mp_treebin[10] - sz: 0x00003000 cnt: 0x00b9, mh_fd_link: 0x7fffa4003380
mp_treebin[11] - sz: 0x00004000 cnt: 0x006d, mh_fd_link: 0x7fffc9457720
mp_treebin[12] - sz: 0x00006000 cnt: 0x023b, mh_fd_link: 0x7fffbc1ac000
mp_treebin[13] - sz: 0x00008000 cnt: 0x0018, mh_fd_link: 0x7fffc946f850
mp_treebin[14] - sz: 0x0000c000 cnt: 0x0030, mh_fd_link: 0x7fffc935fcc0
mp_treebin[15] - sz: 0x00010000 cnt: 0x0019, mh_fd_link: 0x7fffb44262b0
mp_treebin[16] - sz: 0x00018000 cnt: 0x0073, mh_fd_link: 0x7fffc93fe020
mp_treebin[17] - sz: 0x00020000 cnt: 0x0018, mh_fd_link: 0x7fffc94368f0
mp_treebin[18] - sz: 0x00030000 cnt: 0x000c, mh_fd_link: 0x7fffb0665010
mp_treebin[19] - sz: 0x00040000 cnt: 0x001c, mh_fd_link: 0x7fffa836d010
mp_treebin[20] - sz: 0x00060000 cnt: 0x000d, mh_fd_link: 0x7fffa8c55010
mp_treebin[21] - sz: 0x00080000 cnt: 0x001d, mh_fd_link: 0x7fffa9009010
mp_treebin[22] - sz: 0x000c0000 cnt: 0x0006, mh_fd_link: 0x7fffa9081010
mp_treebin[23] - sz: 0x00100000 cnt: 0x000a, mh_fd_link: 0x7fffb025f010
mp_treebin[24] - sz: 0x00180000 cnt: 0x000b, mh_fd_link: 0x7fffa8b38010
mp_treebin[25] - sz: 0x00200000 cnt: 0x000e, mh_fd_link: 0x7fffb008a010
mp_treebin[26] - sz: 0x00300000 cnt: 0x0007, mh_fd_link: 0x7fffb0323010
mp_treebin[27] - sz: 0x00400000 cnt: 0x0002, mh_fd_link: 0x7fffa87f5010
mp_treebin[28] - sz: 0x00600000 cnt: 0x0003, mh_fd_link: 0x7fffa83e9010
mp_treebin[29] - sz: 0x00800000 cnt: 0x0001, mh_fd_link: 0x7fffab328010
mp_treebin[30] - sz: 0x00c00000 cnt: 0x0001, mh_fd_link: 0x7fffd706d010
mp_treebin[31] - sz: 0xffffffff cnt: 0x0003, mh_fd_link: 0x7fffa9326010 [UNSORTED]

Интеграция через callback

Мы реализовали внутри libmempool callback, «понимающий» dlmalloc и ptmalloc. Он предназначен для вызова из libdlmalloc или libptmalloc, чтобы дополнить их аннотации чанков данными, специфичными для mempool. Например, если с помощью libdlmalloc выводится подробный список чанка dlmalloc, и этот чанк содержит в себе заголовок mempool, то callback mempool выведет его.

Информацию о том, как это выглядит при использовании с другими инструментами, см. в README-файлах в libdlmalloc и libptmalloc.

Планы по развитию

Вероятно, мы будем добавлять функциональность в libmempool по мере необходимости или в ходе будущих исследований Cisco ASA. Планируемые дополнения на данный момент:

  • Абстрагировать логику отладочного движка, чтобы она была ближе к новым архитектурам libheap или shadow
  • Сейчас мы не проверяем футер (footer) при анализе того, выглядит ли чанк корректно, но эту проверку следует добавить.

Контакты

Мы будем рады получить обратную связь об этом инструменте, а также с удовольствием примем pull request'ы.

  • Aaron Adams

    • Email: aaron<dot>adams<at>nccgroup<dot>trust
    • Twitter: @fidgetingbits
  • Cedric Halbronn

    • Email: cedric<dot>halbronn<at>nccgroup<dot>trust
    • Twitter: @saidelike
Скачать инструмент