Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
libmempool — Heap analysis tooling for mempool | Kitploit
أدوات/GitHubGitHub/nccgroup/libmempool
Embedded Systems SecurityMemory ForensicsReverse EngineeringDebuggersBinary AnalysisFirmware Analysis
GitHubnccgroup/libmempool

libmempool

Heap analysis tooling for mempool

عرض المستودع
137منذ 4 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

libmempool

ملاحظة أولية: نوصي باستخدام هذه الأداة كجزء من asatools ولكن يمكن استخدامها أيضاً بشكل مستقل.

libmempool هي أداة تحليل مكتوبة بلغة python وتعمل مع GDB للمساعدة في تحليل بنى البيانات المتعلقة بـ mempool الموجودة داخل مختلف الأكوام (heaps) على أجهزة Cisco ASA. عادةً ما تكون هذه المعلومات مضمّنة داخل كتلة كومة (heap chunk)، أو تمثل امتداداً مخصصاً لبنية كومة شائعة أخرى مثل بنية mstate الخاصة بـ dlmalloc.

تستخدم Cisco مصطلح mempool لوصف مناطق من الذاكرة مخصصة لأغراض متعددة مثل التخصيصات العامة، DMA، وما إلى ذلك. تحتوي هذه المناطق عادةً على كومة خاصة بها، مثل dlmalloc. تتم عمليات التخصيص على هذه الـ mempools عادةً باستخدام أغلفة (wrappers) حول مُخصِّص الكومة الأساسي، وتحقن هذه الأغلفة بيانات وصفية خاصة بـ mempool في التخصيصات الناتجة. نشير إلى هذه البيانات الوصفية باسم ترويسة mempool أو mh اختصاراً. وبالمثل، نشير عادةً إلى mempool باسم mp. كما أن استخدام mh لوصف ترويسة mempool يتوافق أيضاً مع سلاسل نصية متعددة موجودة في ملفات Cisco ASA lina الثنائية.

على الرغم من أن libmempool يمكن استخدامها كأداة مستقلة لتحليل بعض الأمور المتعلقة بترويسات mempool وبنى البيانات، فإن قيمتها الأعظم تكمن في استخدامها كدالة استرجاع (callback) من مكتبات أخرى مثل libdlmalloc أو libptmalloc.

تجدر الإشارة إلى أن جوانب معينة من الـ mempool، مثل الصناديق (bins) المستخدمة لتتبع الكتل قيد الاستخدام، مضمّنة داخل بنية mstate الخاصة بـ dlmalloc 2.8.x وتتبع نفس أحجام الصناديق. هذا يعني أنه بشكل شبه مؤكد قد تحتاج إلى استكشاف بنية mstate التي تحتوي على بيانات الـ mempool على الأقل باستخدام libdlmalloc.

الإصدارات المدعومة

تم اختبار libmempool مع إصدارات Cisco ASA 32-bit / 64-bit (سلسلتا ASA5500-X و GNS3) التي تستخدم dlmalloc2.8 أو مُخصِّص glibc المبني على ptmalloc2. تم اختبارها على العديد من إصدارات ASA، بما في ذلك فروع متعددة من 8.x.y و 9.x.y. ومع ذلك، فمن الممكن تماماً أن تتعطل مع بعض الإصدارات.

التثبيت

لاستخدام libmempool بشكل مستقل، كل ما عليك فعله هو استيراد ملف libmempool.py في مشروعك. يتيح لك ذلك القيام ببعض الإجراءات المحدودة، مثل تسجيل كائن mpcallback، وما إلى ذلك. يمكن أن يكون هذا مفيداً إذا كنت تقوم بتحليل غير متصل لوظائف الكومة المسجلة.

للاستيراد إلى GDB، يتطلب البرنامج النصي فقط GDB مع دعم python. على الرغم من أن معظم إصدارات GDB الحديثة انتقلت نحو python 3، إلا أن بعضها لا يزال يتوقع 2.7. تم اختبار البرنامج النصي على كليهما، لكن التطوير والاختبار الأساسي يتم باستخدام python 3.

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

نفصل معظم المنطق المتعلق بـ gdb خارج libmempool.py إلى libmempool_gdb.py فقط لاختبار تجريد الأمور وحتى تتمكن من استخدام libmempool.py بسهولة خارج GDB. من المرجح أن يتغير هذا في المستقبل، حيث سنرغب في النهاية في تنفيذ تجريدات محرك تصحيح أخطاء مشابهة لتلك المستخدمة في أدوات تحليل الكومة الأخرى مثل libheap و shadow.

الاستخدام

على الرغم من أن الكثير من قيمة libmempool تأتي من دالة الاسترجاع 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

تمتلك الـ Mempools مفهوم الصناديق (bins)، وهي قوائم مرتبطة بشكل مزدوج بنفس أحجام صناديق dlmalloc، ولكنها تُستخدم لتتبع الكتل قيد الاستخدام (in-use) بدلاً من الكتل الحرة (free). يتم ذلك لتسجيل استخدام الذاكرة على أجهزة 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]

تكامل دالة الاسترجاع

نقوم بتنفيذ دالة استرجاع "واعية" بـ dlmalloc و ptmalloc داخل libmempool، والتي يُقصد بها أن تُستدعى بواسطة libdlmalloc أو libptmalloc لإثراء تعليقاتها التوضيحية على الكتل ببيانات إضافية خاصة بـ mempool. على سبيل المثال، إذا تم استخدام libdlmalloc لعرض قائمة مفصلة لكتلة dlmalloc، وكانت تلك الكتلة تحتوي بداخلها على ترويسة mempool، فستقوم دالة استرجاع mempool بطباعتها.

للحصول على معلومات حول كيفية ظهور ذلك عند استخدامه عبر أدوات أخرى، يرجى مراجعة ملفات README في كل من libdlmalloc و libptmalloc.

التطوير المستقبلي

من المرجح أن نضيف وظائف إلى libmempool حسب الحاجة أو أثناء إجراء أبحاث مستقبلية على Cisco ASA. الإضافات المخطط لها حالياً هي:

  • تجريد منطق محرك التصحيح ليكون أشبه بالتصاميم الأحدث في libheap أو shadow
  • لا نتحقق حالياً من التذييل (footer) ضمن الفحص عند تحليل أن الكتلة تبدو سليمة، ولكن يجب إضافة ذلك.

التواصل

يسعدنا سماع ملاحظاتك حول هذه الأداة ويسعدنا أيضاً استقبال طلبات السحب (pull requests).

  • Aaron Adams

    • البريد الإلكتروني: aaron<dot>adams<at>nccgroup<dot>trust
    • تويتر: @fidgetingbits
  • Cedric Halbronn

    • البريد الإلكتروني: cedric<dot>halbronn<at>nccgroup<dot>trust
    • تويتر: @saidelike
تنزيل الأداة