في هذه المقالة ، سنتعامل مع محاذاة البيانات ، ونحل أيضًا المهمة السابعة عشرة من موقع
pwnable.kr .
المعلومات التنظيميةخاصةً لأولئك الذين يرغبون في تعلم شيء جديد وتطويره في أي من مجالات أمن المعلومات والحاسوب ، سأكتب وأتحدث عن الفئات التالية:
- PWN.
- التشفير (التشفير) ؛
- تقنيات الشبكات (الشبكة) ؛
- عكس (الهندسة العكسية) ؛
- إخفاء المعلومات (Stegano) ؛
- بحث واستغلال مواطن الضعف WEB.
بالإضافة إلى ذلك ، سوف أشارك تجربتي في الطب الشرعي للكمبيوتر ، وتحليل البرامج الضارة والبرامج الثابتة ، والهجمات على الشبكات اللاسلكية وشبكات المناطق المحلية ، وإجراء عمليات pentests واستغلال الكتابة.
حتى تتمكن من معرفة المقالات الجديدة والبرامج والمعلومات الأخرى ، أنشأت
قناة في Telegram ومجموعة لمناقشة أي مشاكل في مجال التصنيف الدولي للأمراض. أيضًا ، سأدرس شخصيًا طلباتك الشخصية وأسئلتك واقتراحاتك وتوصياتك
شخصيًا وسأجيب على الجميع .
يتم توفير جميع المعلومات للأغراض التعليمية فقط. لا يتحمل مؤلف هذا المستند أية مسؤولية عن أي ضرر يلحق بشخص ما نتيجة استخدام المعرفة والأساليب التي تم الحصول عليها نتيجة لدراسة هذا المستند.
محاذاة البيانات
تعد محاذاة البيانات في ذاكرة الوصول العشوائي للكمبيوتر ترتيبًا خاصًا للبيانات الموجودة في الذاكرة للوصول بشكل أسرع. عند العمل مع الذاكرة ، تستخدم العمليات كلمة الآلة كوحدة رئيسية. يمكن أن يكون للأنواع المختلفة من المعالجات أحجام مختلفة: واحد ، اثنان ، أربعة ، ثمانية ، إلخ. بايت. عند حفظ كائنات في الذاكرة ، قد يحدث أن يتجاوز بعض الحقول حدود الكلمات هذه. يمكن لبعض المعالجات العمل مع البيانات غير المحاذاة لفترة أطول من البيانات المحاذاة. ولا يمكن للمعالجات غير المعقدة عمومًا العمل مع البيانات غير المحاذاة.
من أجل تخيل أفضل نموذج للبيانات المحاذاة وغير المحاذاة ، خذ بعين الاعتبار مثال على الكائن التالي - بنية البيانات.
struct Data{ int var1; void* mas[4]; };
نظرًا لأن حجم المتغير int في x32 و x 64 المعالجات ليس 4 بايت ، وقيمة void * variable هي 4 و 8 بايت ، على التوالي ، سيتم تمثيل هذه البنية لمعالجات x32 و x64 في الذاكرة كما يلي.

لن تعمل معالجات X64 مع مثل هذا الهيكل ، لأن البيانات غير محاذاة. لمحاذاة البيانات ، من الضروري إضافة حقل 4 بايت آخر إلى الهيكل.
struct Data{ int var1; int addition; void* mas[4]; };
وبالتالي ، سيتم محاذاة بيانات بنية البيانات لمعالجات x64 في الذاكرة.

حل وظيفة Memcpy
نضغط على أيقونة توقيع memcpy وقيل لنا إننا بحاجة إلى الاتصال عبر SSH بضيف كلمة المرور.
كما أنها توفر شفرة المصدر. 
عند الاتصال ، نرى الشعار المقابل.

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

لدينا ملف التمهيدي. بعد قراءتها ، علمنا أن البرنامج يعمل على المنفذ 9022.

اتصل بالمنفذ 9022. نقدم لنا تجربة - مقارنة الإصدار البطيء والسريع من memcpy. بعد ذلك ، سيقوم البرنامج بإدخال رقم في فترة زمنية معينة وإصدار تقرير حول مقارنة الإصدارات البطيئة والسريعة من الوظيفة. هناك شيء واحد: التجارب 10 والتقارير - 5.

دعنا نرتب لماذا. ابحث عن المكان في الكود لمقارنة النتائج.

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

يتم النسخ باستخدام وظائف المجمع. نحدد بواسطة الأوامر أن هذا هو SSE2. كما هو مذكور
هنا : يستخدم SSE2 ثمانية سجلات 128 بت (xmm0 إلى xmm7) المضمنة في بنية x86 مع مقدمة ملحق SSE ، كل منها يعامل كقيمتين متتاليتين بدقة الفاصلة العائمة. علاوة على ذلك ، يعمل هذا الرمز مع البيانات المحاذاة.


وبالتالي ، عند التعامل مع البيانات غير المحاذية ، قد يتعطل البرنامج. يتم تنفيذ المحاذاة بواسطة 128 بت ، أي 16 بايت ، لذلك يجب أن تكون الكتل تساوي 16. نحتاج إلى معرفة عدد البايتات الموجودة بالفعل في الكتلة الأولى على الكومة (دع X) ثم يجب علينا كل نقل البرنامج أكبر عدد من البايتات (السماح Y) لذلك X + Y)٪ 16 كانت 0.
نظرًا لأن جميع العمليات تشغل كتل الكومة التي تتكون من مضاعفات اثنين ، يتم تكرارها على X كـ 2 ، 4 ، 8 ، إلخ حتى 16.


كما ترون ، مع X = 4 ، يتم تشغيل البرنامج بنجاح.

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

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