
Windows x86 PoC: تجاوز سعة المخزن المؤقت القائم على المكدس باستخدام شيل كود مخصص على نظام ويندوز 32-بت القديم.
هذا برنامج تعليمي بسيط ومكتفي بذاته حول استغلالات تجاوز سعة المخزن المؤقت القائمة على المكدس لنظام Windows 32 بت. لا حاجة لأدلة خارجية—كل ما تحتاجه هنا.
vulnerable.c: برنامج بسيط يحتوي على دالة gets() غير آمنة.messageBox.asm: حمولة صغيرة بلغة التجميع سيتم تنفيذها بعد التجاوز.exploit.c: مثال على كيفية تشغيل التجاوز.يعلم هذا المشروع فكرة واحدة أساسية: قراءة الإدخال غير الآمنة يمكن أن تسمح للمهاجم بتجاوز عنوان الإرجاع وإعادة توجيه التنفيذ.
gets() ليس لها حد للحجمفي vulnerable.c، يقوم البرنامج بذلك:
char buffer[32];
gets(buffer);
يحجز البرنامج 32 بايت لـ buffer، ثم يستدعي gets() لقراءة الإدخال. المشكلة: gets() لا تتحقق من حجم المخزن المؤقت. تستمر في قراءة الأحرف حتى تواجه سطرًا جديدًا. إذا كتب المستخدم 40 أو 50 حرفًا، فإن الأحرف الإضافية تتجاوز سعة المخزن المؤقت البالغ 32 بايت.
عندما يتم تشغيل دالة C، يخزن المكدس (منطقة من الذاكرة):
buffer)EBP المحفوظ (مؤشر القاعدة من الدالة المستدعاة)تصورها هكذا:
Lower addresses (top of stack as drawn)
[ buffer (32 bytes) ]
[ saved EBP (4 bytes) ]
[ return address (4 bytes) ]
Higher addresses (bottom)
عندما يتجاوز gets() سعة buffer بإدخال كبير جدًا، فإن البايتات الإضافية تستبدل EBP المحفوظ ثم عنوان الإرجاع.
إذا قمنا بصياغة التجاوز بعناية لوضع عنوان محدد في حقل عنوان الإرجاع، فسوف يقفز المعالج إلى ذلك العنوان عندما تحاول الدالة العودة.
buffer[32] على المكدس.gets(buffer) لقراءة سطر من إدخال المستخدم.gets() لا تتحقق من الحجم، لذا تكتب جميع الـ 50 بايت في المخزن المؤقت.buffer وتستبدل EBP المحفوظ وعنوان الإرجاع.هذا أبسط شكل لتنفيذ الكود من خلال تجاوز سعة المخزن المؤقت.
messageBox.asm هو جزء صغير من الكود مصمم للتشغيل بعد التجاوز.
يقوم بما يلي:
LoadLibraryA مع السلسلة "USER32.DLL" لضمان وجود المكتبة في الذاكرة.ExitProcess لإنهاء البرنامج بأمان.النقطة الأساسية: هذا كود قابل للتنفيذ يتم تشغيله بعد أن يعيد التجاوز توجيه التنفيذ إليه.
عند ظهور مربع الرسالة على الشاشة، يثبت ثلاثة أشياء:
في هجوم حقيقي، يمكن لهذه الحمولة أن تفعل أي شيء: سرقة البيانات، إنشاء مستخدم، تنزيل برمجيات خبيثة، إلخ. مربع الرسالة هو مجرد طريقة مرئية وآمنة لإظهار أن تنفيذ الكود التعسفي حدث.
تستخدم هذه الحمولة المحددة عناوين ذاكرة ثابتة لكل من MessageBoxA (0x751D8830) و ExitProcess (0x7437ADB0). هذه العناوين خاصة بنظام واحد. ستحتاج الحمولة إلى التعديل لإصدار Windows آخر أو نظام آخر.

يحتوي Windows الحديث على ميزات أمان متعددة تمنع هذا الاستغلال:
لهذا التمرين التعليمي، نقوم بتعطيلهم جميعًا.
استخدم MSVC (Microsoft Visual C++) مع العلامات المحددة:
cl /c /GS- /W3 /Zl vulnerable.c
link /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /NXCOMPAT:NO vulnerable.obj /OUT:vulnerable.exe
معاني العلامات:
/GS- تعطيل حماية تجاوز سعة المخزن المؤقت للمكدس./DYNAMICBASE:NO تعطيل توزيع مساحة العنوان العشوائي (ASLR)./NXCOMPAT:NO تعطيل DEP، مما يسمح بتنفيذ الكود على المكدس.إذا كان لديك بالفعل الملف القابل للتنفيذ، يمكنك تعطيل الحمايات باستخدام editbin:
editbin /NXCOMPAT:NO /DYNAMICBASE:NO vulnerable.exe
vulnerable.exe.يشرح ملف README هذا:
gets() ولماذا هي غير آمنة (لا حد للحجم).الآن تفهم تدفق استغلال تجاوز سعة المخزن المؤقت بالكامل. اقرأ ملفات الكود وقارنها بهذا الشرح لترسيخ فهمك.
هذا المثال للتعلم فقط. لا تستخدم هذه التقنية ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها. الوصول غير المصرح به إلى أنظمة الكمبيوتر غير قانوني.