Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
libmempool — Heap analysis tooling for mempool | Kitploit
Strumenti/GitHubGitHub/nccgroup/libmempool
Embedded Systems SecurityMemory ForensicsReverse EngineeringDebuggersBinary AnalysisFirmware Analysis
GitHubnccgroup/libmempool

libmempool

Heap analysis tooling for mempool

Vedi Repository
1374 anni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

libmempool

Nota preliminare: ti consigliamo di usarlo come parte di asatools, ma può essere usato anche in modo autonomo.

libmempool è uno script Python e uno strumento di analisi GDB per aiutare nell'analisi delle strutture dati relative ai mempool presenti all'interno dei vari heap sui dispositivi Cisco ASA. Normalmente queste informazioni sono incorporate in un chunk dell'heap, oppure sono un'estensione personalizzata di un'altra comune struttura dell'heap come una struttura mstate di dlmalloc.

Cisco usa il termine mempool per descrivere regioni di memoria mappate per vari scopi, come allocazioni generali, DMA, ecc. Queste regioni contengono tipicamente il proprio heap, come dlmalloc. Le routine di allocazione su questi mempool vengono in genere eseguite tramite wrapper attorno all'allocatore dell'heap sottostante e questi wrapper iniettano metadati specifici del mempool nelle allocazioni risultanti. Ci riferiamo a questi metadati come mempool header o mh in breve. Analogamente, ci riferiremo spesso a un mempool come mp. L'uso di mh per descrivere un mempool header è anche coerente con varie stringhe presenti nei binari lina di Cisco ASA.

Sebbene libmempool possa essere usato come strumento autonomo per analizzare alcune cose relative ai mempool header e alle strutture dati, il suo valore maggiore deriva dall'essere usato come callback da altre librerie come libdlmalloc o libptmalloc.

Vale la pena notare che alcuni aspetti del mempool, come i bin usati per tracciare i chunk in uso, sono incorporati all'interno di una struttura mstate di dlmalloc 2.8.x e seguono le stesse dimensioni dei bin. Ciò significa che quasi inevitabilmente potresti dover esplorare almeno la mstate che incapsula i dati del mempool usando libdlmalloc.

Versioni supportate

libmempool è stato testato con versioni di Cisco ASA a 32 bit / 64 bit (sia la serie ASA5500-X che GNS3) che usano l'allocatore dlmalloc2.8 o quello basato su ptmalloc2 di glibc. È stato testato su numerose versioni ASA, incluse numerose serie 8.x.y e 9.x.y. Tuttavia, è del tutto possibile che non funzioni su qualche versione.

Installazione

Per usare libmempool in modo autonomo devi semplicemente importare il file libmempool.py nel tuo progetto. Questo ti consente di eseguire alcune azioni limitate, come registrare l'oggetto mpcallback, ecc. Può essere utile se stai facendo analisi offline della funzionalità di heap registrata.

Per importare in GDB, lo script richiede semplicemente GDB con supporto Python. Anche se la maggior parte delle versioni moderne di GDB si è spostata su Python 3, alcune richiedono ancora Python 2.7. Lo script è stato testato su entrambi, ma principalmente sviluppo e testing sono fatti con Python 3.

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

Separiamo la maggior parte della logica relativa a GDB da libmempool.py in libmempool_gdb.py solo per testare l'astrazione delle cose e così puoi usare facilmente libmempool.py al di fuori di GDB. Questo probabilmente cambierà in futuro, dato che alla fine vorremo implementare astrazioni del motore di debug simili a quelle usate da altri strumenti di analisi heap come libheap e shadow.

Utilizzo

Anche se gran parte del valore di libmempool deriva dalla funzione callback mpcallback che espone, ci sono numerosi comandi GDB integrati che possiamo esaminare.

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

Supponendo di conoscere l'indirizzo di un mempool header, possiamo analizzarne i dati. Nota che deve essere l'indirizzo del mempool header stesso, non l'indirizzo dei metadati del chunk dell'allocatore principale. Quindi, possiamo visualizzare il contenuto come segue:

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 (-)

Possiamo anche visualizzare il contenuto esadecimale del chunk usando -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

I mempool hanno il concetto di bin, che sono liste doppiamente concatenate con le stesse dimensioni dei bin di dlmalloc, ma che vengono usate per tracciare i chunk in uso piuttosto che quelli liberi. Questo viene fatto per la contabilità dell'uso della memoria sui dispositivi Cisco. Spesso puoi trovare un chunk che contiene un mempool header, ma non sai ancora dove si trova la struttura mstate nell'heap. Per orientarti, puoi usare il comando mpbin, che ti fornisce l'indirizzo del bin del mempool in cui si trova attualmente un chunk in uso. Per esempio:

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

Questo non solo ha trovato l'inizio della porzione mempool della mstate, ma l'ha anche messa in cache e mostra il bin specifico in cui si trova il chunk. Potremmo opzionalmente usare il comando mpbinwalk per elencare tutti i 0xd3 chunk di questo bin, o solo fino a un numero specifico:

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
[...]

Ora, se vogliamo visualizzare l'intera porzione mempool della struttura mstate (quindi tutti i bin e le statistiche correlate) possiamo usare il comando 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]

Integrazione callback

Implementiamo all'interno di libmempool una callback "consapevole" di dlmalloc e ptmalloc, pensata per essere chiamata da libdlmalloc o libptmalloc per arricchire le loro annotazioni sui chunk con dati aggiuntivi specifici dei mempool. Per esempio, se libdlmalloc viene usato per stampare un elenco dettagliato di un chunk dlmalloc, e quel chunk contiene al suo interno un mempool header, allora la callback del mempool lo stamperà.

Per informazioni su come appare quando viene usata tramite altri strumenti, consulta i file README sia in libdlmalloc che in libptmalloc.

Sviluppi futuri

Probabilmente aggiungeremo funzionalità a libmempool quando ne avremo bisogno o durante le future ricerche su Cisco ASA. Le aggiunte attualmente previste sono:

  • Astrarre la logica del motore di debug per renderla più simile ai design più recenti di libheap o shadow
  • Attualmente non validiamo il footer all'interno di un controllo quando verifichiamo che un chunk sembri a posto, ma questo dovrebbe essere aggiunto.

Contatti

Saremo lieti di ricevere feedback su questo strumento e accettiamo volentieri 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
Scarica lo strumento