Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
工具/GitHubGitHub/nccgroup/libmempool
嵌入式系统安全内存取证逆向工程调试器二进制分析固件分析
GitHubnccgroup/libmempool

libmempool

堆内存池分析工具

查看仓库
137154年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

libmempool

初步说明:我们建议您将其作为 asatools 的一部分使用,但它也可以 独立使用。

libmempool 是一个 Python 脚本和 GDB 分析工具,用于辅助分析在 Cisco ASA 设备的各种堆中发现的与内存池(mempool)相关的数据结构。通常,这些信息嵌入在堆块(heap chunk)中,或者是对其他常见堆结构(如 dlmalloc mstate 结构)的自定义扩展。

Cisco 使用“mempool”一词来描述为各种目的(如常规分配、DMA 等)映射的内存区域。这些区域通常包含自己的堆,例如 dlmalloc。这些内存池上的分配例程通常使用围绕底层堆分配器的包装器来完成,这些包装器会将特定于内存池的元数据注入到最终的分配中。我们将这些元数据称为 mempool header(内存池头部)或简称 mh。同样地,我们经常会用 mp 来指代 mempool。使用 mh 来描述 mempool header 也与 Cisco ASA lina 二进制文件中发现的各种字符串一致。

尽管 libmempool 可以作为独立工具用于分析与内存池头和数据结构相关的某些内容,但其最大价值在于作为其他库(如 libdlmalloc 或 libptmalloc)的回调使用。

值得注意的是,内存池的某些方面(例如用于跟踪使用中块(inuse chunks)的 bins)被嵌入在 dlmalloc 2.8.x 的 mstate 结构中,并遵循相同的 bin 大小规则。这意味着几乎不可避免地,您至少需要使用 libdlmalloc 来探查封装了内存池数据的 mstate。

支持的版本

libmempool 已在使用 dlmalloc2.8 或基于 glibc 的 ptmalloc2 分配器的 32 位/64 位 Cisco ASA 版本(包括 ASA5500-X 系列和 GNS3)上进行了测试。它已在众多 ASA 版本(包括多个 8.x.y 和 9.x.y 分支)上进行了测试。但是,它在某些版本上完全有可能失效(break)。

安装

要独立使用 libmempool,您只需将 libmempool.py 文件导入到您的项目中。这使您可以执行一些有限的操作,例如注册 mpcallback 对象等。如果您正在对记录的堆功能进行离线分析,这会很有用。

要导入到 GDB 中,该脚本只需要带有 python 支持的 GDB。虽然大多数现代 GDB 版本已转向 python 3,但有些版本仍期望使用 2.7。该脚本已在两者上进行了测试,但主要的开发和测试都是使用 python 3 完成的。

(gdb) source libmempool_gdb.py

我们将大部分与 gdb 相关的逻辑从 libmempool.py 中分离出来,放入 libmempool_gdb.py,只是为了测试抽象化,并让您可以轻松地在 GDB 之外使用 libmempool.py。这种情况将来可能会改变,因为我们最终希望实现类似于 libheap 和 shadow 等其他堆分析工具所使用的调试引擎抽象。

用法

虽然 libmempool 的很大一部分价值来自于它公开的 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

内存池具有 bins 的概念,它是由双向链表组成,大小与 dlmalloc 的 bins 相同,但用于跟踪使用中的块(inuse chunks)而不是空闲块(free chunks)。这样做是为了在 Cisco 设备上进行内存使用记账。很多时候,您可能会找到一个包含 mempool 头的块,但您还不知道堆上的 mstate 结构位于何处。为了确定方位,您可以使用 mpbin 命令,它会告诉您一个使用中的块当前所在的 mempool bin 的地址。例如:

(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

这不仅找到了 mstate 中 mempool 部分的起始地址,而且还将它缓存,并列出该块所在的特定 bin。我们还可以选择使用 mpbinwalk 命令列出该 bin 中的所有 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
[...]

现在,如果我们想要转储 mstate 结构的整个 mempool 部分(即所有 bins 及相关统计信息),我们可以使用 mpmstate 命令:

下载工具