Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2017-0261 — CVE-2017-8570 Exp وتحليل عينات الاستغلال | Kitploit
أدوات/GitHubGitHub/erfze/cve-2017-0261
تحليل الثغرات الأمنيةالاستغلالتحليل البرمجيات الخبيثةالأوراق والأبحاثالتعلم والتعليماستغلال الملفات الثنائية
GitHuberfze/cve-2017-0261

CVE-2017-0261

CVE-2017-8570 Exp وتحليل عينات الاستغلال

عرض المستودع
10منذ 6 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2017-0261 وتحليل العينة المستغلة

0x01 وصف الثغرة

  • السبب: عند فتح مستند Office، يتم استخدام FLTLDR.EXE لعرض ملف EPS المضمن الذي يحتوي على الثغرة. هذا الملف مكتوب بلغة PostScript ويمكن للمهاجم استغلاله من خلال عملية "save-restore"، وهو في جوهره ثغرة UAF. عندما يفتح المستخدم ملفًا يحتوي على صورة رسومية غير صحيحة، أو عندما يقوم المستخدم بإدراج صورة رسومية غير صحيحة في ملف Office، يمكن استغلال الثغرة.

  • الإصدارات المتأثرة: Microsoft Office 2010 Service Pack 2, Microsoft Office 2013 Service Pack 1, Microsoft Office 2016

  • POC: kcufId's Github

0x02 تحليل POC

لقد بحثت طويلاً على الإنترنت، لكني لم أجد حزمة Office تحتوي على EPSIMP32.FLT. لحسن الحظ، قدم الأستاذ kcufId أداة LoadEps.exe لتحميل ملفات EPS، شكرًا للأستاذ kcufId.

LoadEps.exe أولاً يقوم بتحميل EPSIMP32.FLT:

صورة 1 تحميل EPSIMP32.FLT

ثم يستدعي ImportGr لبدء تحميل ملف EPS:

صورة 2 ImportGr

هنا نتابع مباشرة باستخدام F7، ثم نتمكن من التوقف عند نقطة التوقف التي تم تعيينها داخل EPSIMP32.FLT.


قبل الدخول في الموضوع، دعنا نقدم بنية كائن Postscript.

// PostScript Object
struct PostScript object
{
    dword    type;
    dword    attr;
    dword    value1;
    dword    value2;    // if array, point to userdict where store the array object
}ps_obj;

حيث أن القيم المقابلة لـ type المختلفة هي كالتالي:

0x0       	nulltype
0x3       	integertype
0x5       	realtype
0x8       	booleantype
0x10      	operatortype
0x20      	marktype
0x40      	savetype
0x300     	nametype
0x500     	stringtype
0x900     	filetype
0x30000   	arraytype          
0x0B0000 	packedarraytype
0x70000 	packedarraytype
0x110000  	dicttype
0x210000  	gstatetype

كمثال على السلسلة النصية، نشرح هيكل تخزينها. من خلال تعيين نقطة توقف في دالة forall، يمكننا معرفة كيفية معالجتها للسلاسل النصية (لمعرفة كيفية تحديد موقع دالة forall، راجع https://paper.seebug.org/368/).

صورة 3 هيكل تخزين السلسلة النصية

الصورة رقم 1 تقابل ps_obj، حيث يشير حقل value2 إلى العنصر المقابل في قائمة الفهارس (الصورة رقم 2). يشير عنصر الفهرس إلى بنية بحجم 0x30، في الموقع 0x24 من هذه البنية يوجد مؤشر لمؤشر إلى بنية بحجم 0x28 (الصورة رقم 5)، والموقع 0x2C يحفظ حجم السلسلة النصية (الصورة رقم 3). في الصورة رقم 5، الموقع 0x4 من البنية يخزن عنوان العنصر المقابل في قائمة الفهارس (أي 0x01DB5E94 من الصورة رقم 4)، والموقع 0x20 يشير إلى موقع التخزين النهائي للسلسلة النصية (الصورة رقم 6)، والموقع 0x24 هو الحجم الفعلي للذاكرة المشغولة — حجم السلسلة النصية + 1.

بنية بحجم 0x30:

+0x0  dword   
+0x4  dword
+0x8  dword
+0xc  dword
+0x10 dword
+0x14 dword
+0x18 dword
+0x1c dword
+0x20 dword
+0x24 dword   pp_struct      //指向大小为0x28结构的指针的指针
+0x28 dword 
+0x2c dword   size           //字符串实际大小

بنية بحجم 0x28 (إذا كانت مصفوفة، فإن حجم البنية هو 0x2C، والموقع 0x28 يشير إلى عناصر المصفوفة، كل عنصر هو ps_obj):

+0x0  dword
+0x4  dword					//存储该结构于索引列表中对应项的地址
+0x8  dword
+0xc  dword
+0x10 dword
+0x14 dword
+0x18 dword
+0x1c dword
+0x20 dword  ptr_object 	//指向字符串最终存储位置
+0x24 dword  size      		//实际所占内存大小,字符串实际大小+1

أول تشغيل للثغرة:

صورة 4 التشغيل الأول

أولاً، يتم حفظ حالة VM في المتغير l62، ثم يتم استدعاء عملية l61 ——>>l59 ——>>l56 لكل حرف في المتغير l63. يقوم l62 restore باستعادة الحالة السابقة، وبالتالي يتم تحرير مساحة الذاكرة المخصصة بواسطة l63 بعد العبارة /l62 save def، مما يجعلها مؤشرًا معلقًا.

صورة 5 l95-l99

المتغيرات l95-l99 تحدد التدفق اللاحق، وقيمها كلها 0 (أي 32 بت):

صورة 6 exch_proc

التشغيل الثاني للثغرة، أولاً يتم تخصيص مساحة ذاكرة بحجم 0x27 (ستشغل فعليًا 0x28) لتخزين l63:

صورة 7 l63

ثم يقوم l62 restore باستعادة الحالة السابقة، مما يؤدي إلى تحرير مساحة الذاكرة المخصصة بواسطة l63، وبالتالي تصبح مؤشرًا معلقًا. بعد ذلك، يتم تنفيذ l100، وسيتم استخدام مساحة الذاكرة التي كانت تشغلها l63 سابقًا لتخزين بنية 0x28 للسلسلة النصية l102 (أي l136) (وهذا يفسر لماذا خصصت l63 مساحة بحجم 0x27):

صورة 8 l102

الحصول على القيم في المواقع 0x4 و 0x20 و 0x24 من هذه البنية:

صورة 9 الحصول على القيم

أخيرًا، تعديل محتوى السلسلة النصية l136 (يوضح الشكل التعديلات الجزئية فقط):

صورة 10 بناء السلسلة النصية

هذه التعديلات مبنية بعناية، وسيتم استخدامها عند التشغيل الثالث للثغرة.

التشغيل الثالث للثغرة، يتم تخصيص مصفوفة تحتوي على 0x37 عنصرًا، ثم في الدورة عند العنصر 0x34 يتم تنفيذ l62 restore:

صورة 11 تدفق التشغيل الثالث

بعد تنفيذ restore، يتم استبدال بنية 0x30 للمصفوفة بمحتوى السلسلة النصية l193:

صورة 12 المحتوى المستبدل

وبهذا، يصبح الكائن الذي يتم تنفيذه في عملية forall الأخيرة (0x36) هو بنية 0x30 في الشكل أعلاه، والوصول إلى العنصر 0x36 منه سيؤدي إلى السلسلة النصية التي تم بناؤها بعناية أثناء التشغيل الثاني للثغرة:

صورة 13 الحصول على عنصر المصفوفة

والعنصر الذي تم الحصول عليه من المصفوفة هو مصفوفة بحجم 4، وعنصرها الأول هو سلسلة نصية بعنوان بداية 0 وحجم 0x7FFFFFFF:

صورة 14 محتوى عنصر المصفوفة

سيتم تخزين هذه المصفوفة في المتغير l159، وسيتم تخزين عنصرها الأول — السلسلة النصية بعنوان بداية 0 وحجم 0x7FFFFFFF — في المتغير l201، وبعد ذلك يمكن الحصول على قيمة أي عنوان من خلال المتغير l201.

الحصول على العنوان الأساسي لـ kernel32.dll:

صورة 15 الحصول على العنوان الأساسي -1

صورة 16 الحصول على العنوان الأساسي -2

وبهذا، يحتوي المتغير l314 على العنوان الأساسي لـ EPSIMP32.FLT.

صورة 17 الحصول على العنوان الأساسي -3

ملاحظة: بناء جملة الأمر search كما يلي:

صورة 18 search

البحث عن gadget محدد:

صورة 19 gadget-1

تنزيل الأداة