في هذه المقالة ، سنقوم بتحليل نوع الثغرة الأمنية مثل تجاوز سعة المخزن المؤقت على المكدس ، وحل المشكلة الثالثة من الموقع
pwnable.kr .
المعلومات التنظيميةخاصةً لأولئك الذين يرغبون في تعلم شيء جديد وتطويره في أي من مجالات أمن المعلومات والحاسوب ، سأكتب وأتحدث عن الفئات التالية:
- PWN.
- التشفير (التشفير) ؛
- تقنيات الشبكات (الشبكة) ؛
- عكس (الهندسة العكسية) ؛
- إخفاء المعلومات (Stegano) ؛
- بحث واستغلال مواطن الضعف WEB.
بالإضافة إلى ذلك ، سوف أشارك تجربتي في الطب الشرعي للكمبيوتر ، وتحليل البرامج الضارة والبرامج الثابتة ، والهجمات على الشبكات اللاسلكية وشبكات المناطق المحلية ، وإجراء عمليات pentests واستغلال الكتابة.
حتى تتمكن من معرفة المقالات الجديدة والبرامج والمعلومات الأخرى ، أنشأت
قناة في Telegram ومجموعة لمناقشة أي مشاكل في مجال التصنيف الدولي للأمراض. أيضًا ، سأدرس شخصيًا طلباتك الشخصية وأسئلتك واقتراحاتك وتوصياتك
شخصيًا وسأجيب على الجميع .
يتم توفير جميع المعلومات للأغراض التعليمية فقط. لا يتحمل مؤلف هذا المستند أية مسؤولية عن أي ضرر يلحق بشخص ما نتيجة استخدام المعرفة والأساليب التي تم الحصول عليها نتيجة لدراسة هذا المستند.
تجاوز سعة المخزن المؤقت
تجاوز سعة المخزن المؤقت عبارة عن ثغرة أمنية في برامج الكمبيوتر استنادًا إلى القدرة على كتابة البيانات خارج المخزن المؤقت المخصص في الذاكرة ، والذي ينشأ ، كقاعدة عامة ، بسبب الاستلام غير المنضبط ومعالجة البيانات من الخارج. يؤدي استخدام تقنية إطار مكدس عالي المستوى من قبل اللغات إلى مزج بيانات التحكم وبيانات البرنامج.
في هذه المقالة ، نقوم بتحليل تجاوز سعة المخزن المؤقت فقط على المكدس. يُعرف هذا النوع من تجاوز سعة المخزن المؤقت بتحطيم المكدس ويمكن استغلاله بالطرق التالية:
- الكتابة فوق متغير محلي موجود في الذاكرة بالقرب من المخزن المؤقت؛
- أعد كتابة عنوان المرسل في إطار المكدس ؛
- إعادة كتابة مؤشر دالة أو معالج استثناء ؛
- الكتابة فوق معلمة من إطار مكدس آخر.
تستخدم هذه المهمة طريقة إعادة كتابة متغير محلي. النظر في جوهرها في المثال التالي:
#include <stdio.h> #include <string.h> int main(){ char pass[9] = "p@ssw0rd\x00"; char buf[9]; printf("Input password: "); scanf("%s", buf); if(!strcmp(pass, buf)) printf("Login ok!!!\n"); else printf("FAIL...\n"); return 0; }
نظرًا لتعريف المتغير السابق ، المتغير
buf ، فمن الممكن تجاوزه. إذا قمت بإدخال أكثر من 9 بايت في
buf ، فستقوم بالكتابة فوق البيانات في متغير
المرور . وبالتالي ، يمكن "تغيير" كلمة المرور الخاصة بك عن طريق تمرير البرنامج ، على سبيل المثال ، مثل السطر
11111111 \ x0011111111 \ x00 .


حل وظيفة بوف
نضغط على الأيقونة مع التوقيع ، ويتم تزويدنا بالكود المصدري ، البرنامج نفسه ، بالإضافة إلى العنوان والمنفذ لاتصال TCP.

لنلقِ نظرة على الكود المصدري.

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



Cutter يرسل لنا على الفور إلى نقطة الدخول. في قائمة الوظائف ، حدد الرئيسي.

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

يوجد تعليق قبل رمز الوظيفة ، والذي يعكس المتغيرات المستخدمة في الوظيفة وعناوينها بالنسبة لقاعدة إطار المكدس الحالي (ebp). كما يمكنك تحديد ، فإن المخزن المؤقت لدينا هو المتغير
var_2ch ، والمفتاح هو
arg_8h .


نحسب عدد البايتات التي نحتاج إلى استبدالها. للقيام بذلك ، فقط ابحث عن الفرق بين العناوين.

وبالتالي ، نحتاج إلى إرسال البرنامج 0x34 أي بايت ، ثم إضافة القيمة المرجعية لمثال. للراحة ، يمكنني استخدام مكتبة
pwntools .
from pwn import * conn = remote('pwnable.kr', 9000) payload = 'A' * 0x34 payload += '\xbe\xba\xfe\xca' conn.send(payload) conn.interactive()
نحصل على القشرة ونرى العلم.

نتيجة لذلك ، نحصل على نقاطنا.

في هذه المقالة ، نظرنا إلى مثال على استغلال تجاوز سعة المخزن المؤقت على مكدس ، والتعرف على أداة Cutter ومكتبة pwntools. في المقالة التالية ، سنتحدث عن حزم الملفات القابلة للتنفيذ وحل المهمة الرابعة. نراكم في المقالات التالية.
نحن في قناة برقية:
قناة في برقية .