• الإعلانات

    • فيصل الحربي

      تسجيل عضوية جديدة في المنتدى   01/31/2016

      السلام عليكم ورحمة الله وبركاته  عزيزي العضو الجديد :  حاليا رسالة الإيميل لتأكيد صحة إيميلكم تذهب للبريد العشوائي ( جاري حل المشكلة )  فإذا لم تجد رسالة التحقق من إيميلكم في صندوق الوارد لديكم إتجه للبريد العشوائي ( JUNK)  وقم بتفعيل إشتراككم من هناك   

uxirol

اعضاء جدد
  • عدد المشاركات

    20
  • تاريخ الانضمام

  • تاريخ اخر زياره

السمعه بالموقع

14 عادي

عن uxirol

  • الرتبة
    عضو جديد

معلومات الملف الشخصي

  • الجنس ذكر
  1. تحدي 1 - التلاعب بالنظام

    مرحباً بك أخي حمزة :)   في إنثظار تصميمك ..
  2. تحدي 1 - التلاعب بالنظام

    حلك سليم 100/100 :D أتمنى أن تكون قد إستفدت.   حسناً لدي سؤال، هل يمكن للملف أو المجلد أن يحتوي على أكثر من stream؟   مارأيك الأن أن تعكس العملية، يعني أن تبرمج أداة كـ Streams.exe، لاتقلق لن أتركك بدون مساعدة :)   في الدالة CreateFile إستخدم FILE_FLAG_BACKUP_SEMANTICS لكي تقرأ الـ Streams إكتشف الطريقة التي تستخدم بها الدالة BackupRead وكيف يمكنها أن تساعدك هنا.   أنت قمت بحل التحدي، فكل ماكان يهمني هو الوصول إلى الطريقة التي يكتب بها الـ path، لكن سيكون من الجميل، لو برمجة أداة، بواجهة رسومية تؤدي هذه الوظيفة، أنا لدي ;)   بالتوفيق.
  3. تحدي 1 - التلاعب بالنظام

    لقد أخطأت الفهم الدالة lcreat_، وضعتها فقط لتسهيل عملية إنشاء الملف عوض ان تستخدم مثلا CreateFile، فقط لاغير.   راجع المقال التالي http://www.bleepingcomputer.com/tutorials/windows-alternate-data-streams/   لاحظ ان الطريقة المستخدمة للكتابة والقراءة من الملف، هي بآستخدام  path/to/folder/file.txt:hidden.txt أو path/to/folder:hiddex.txt ماالمميز بهذا المسار، وكيف يمكنك أن تستخدمه؟   أي إستفسار فقط إسأل
  4. تحدي 1 - التلاعب بالنظام

    معلوماتك صحيحة 100% صراحة لم أكن أعلم حول الـ dir /r، شكرأ لك على المعلومة.   الآن دورك أن تكتشف كيف يمكنك أن تنشئ ملف على شكل ADS، أي تضيفه إلى الـ Stream، إن صح التعبير، بعد ذلك إستخدم تلك المعلومة، في برنامج، اللغة لن تشكل فرقا هنا، يمكنك أن تستخدم البايتون إن أردت، أو قم بتعديل الكود المرفق بالأعلى، إستخدم الأداة streams.exe لتتأكد من صحة جوابك، وأرفق الصورة كإثبات.   في الواقع، لقد وضعت الجواب داخل الموضوع :P بالتوفيق.
  5. وعليكم السلام adam-master كيف حالك مع التحدي ؟   0xCC تترجم بلغة الأسمبلي إلى int 0x3 وهي تعني soft breakpoint، لكن في هذه الحالة تستخدم في حال بطريقة ما تجاوزت الـ DEP وأردت تنفيذ الكود داخل الـ stack لكنك أعطيت عنوان يحتوي على 0xCC، عندما يحاول eip تنفيذها، سيحدث breakpoint.   من الأفضل أن تجرب مثالا عمليا.   نعم إستخدمت msvc - visual studio 2013 ultimate،   النتيجة ستختلف من شخص إلى آخر، حسب إعدادات الكومبايلر، فكما وضعت بالكومنت الخاص بكود السي، فهو برنامج دراسي فقط، تستخدمه لتفهم طريقة آلية عمل الـ Stack، لاغير، أما في مثال عملي فأنت ستسخدم كود الأسمبلي 3 تعليمات فقط.   قم بوضع breakpoints داخل برنامج وراقب الـ memory والـ registers و الـ locals، سيكون أفضل لو إستخدمت WindDBG أو Olly بالويندوز فـ gdb باللينكس لن يساعدك بمراقبة كل هذه العمليات في آن واحد.   إن لم تستوعب بعد الطريقة فقط أخبرني وسأسجل فيديو أشرح به العملية بالتفصيل. بالتوفيق أخي، ولاتنسى التحدي الآخر :P   -------------------------   في مشاركتك بالأعلى إستخدمت int main (); // We provide a function prototype so the compiler can see the nameماهو تأثير هذا الكود؟ ولماذا وضعت الـ main هناك؟
  6. لقد إنتهت مدة الـ 24 ساعة والآن جاء وفت الحل،   معلومات عن الستاك الجميع يعلم ما معنى الـ linked list، هذه هي الطريقة التي يستخدمها الستاك في الربط بين الدوال، فكل دالة إبن، تحتوي على مؤشر للدالة الأب، لدى هنا نجد ChangeOutsider هي الدالة الإبن لأنه تم إستدعاؤها و main هي الدالة الأب لأنها الدالة المستدعية، يطلق على هذه العلاقة الـ Caller و الـ Callee، الهدف الأول سيكون إيجاد المؤشر للدالة الأب.   الحل هناك طريقتان لحل التحدي، طريقة عن طريق الـ pure c، وهي المطلوبة، والأخرى من خلال الـ inline assembly، [email protected] إستخدمت الطريقة الثانية، لكنك إستعنت بـ global variable، لذا فحلك صحيح بنسبة 80% :P   الطريقة الأولى كان هدفي من وضع هذه الطريقة كشرط، هو الحث على ملاحظة الـ linked list، وإيجاد طريقة لتجاوز الأشواك بالستاك أي 0xcccccccc /* author: oussama desc : change the main local variable from another function using pure c + brute force. usability : experimental/educational purpose only. waranty : do not use inside a real program, it's not stable.*/#include <stdio.h>void ChangeOutsider(){ int content; int *ptr_content = &content; // where is the old ebp content for (int i = 0; i < 10; i++, ptr_content++) { printf("%x -> %x\n", ptr_content, *ptr_content); if (*ptr_content != 0xCCCCCCCC) { ptr_content++; break; } } // debug code, and check the compiler options, then tweak the brute force to get the right value printf("old ebp content: %x\n\n", *ptr_content); // use the old ebp, to locate the variable inside the main ptr_content = (int *) *ptr_content; // full down to the next value must be a 0xcccccccc ptr_content--; for (int i = 0; i < 10; i++, ptr_content--) { printf("%x -> %x\n", ptr_content, *ptr_content); if (*ptr_content != 0xcccccccc) { // :) i got Ya break; } } // change the value of the local variable printf("\n\nthe old main local variable value: %d - %x\n", *ptr_content, *ptr_content); *ptr_content = 99; printf("the new main local variable value: %d - %x\n", *ptr_content, *ptr_content); return;}int main(void){ int change_me = 10; printf("\n\n[ before ] >>> %d - %x\n\n", change_me, change_me); ChangeOutsider(); printf("\n\n[ after ] >>> %d - %x\n", change_me, change_me); getchar(); return 0;}النتيجة         الطريقة الثانية inline assembly هذه هي الطريقة الصحيحة في الواقع العملي /* author: oussama desc : change the main local variable from another function.*/#include <stdio.h>void ChangeOutsider(){ __asm { pushad // save = safe mov ecx, ebp // get the old ebp mov edx, dword ptr[ecx] // go to it mov dword ptr[edx-8], 0x0000DDED // change the 1st local variable value popad // forget what you save = death penalty } return;}int main(void){ int change_me = 10; printf("\n\n[ before ] >>> %d - %x\n\n", change_me, change_me); ChangeOutsider(); printf("\n\n[ after ] >>> %d - %x\n", change_me, change_me); getchar(); return 0;}لهذا السبب أعشق الأسمبلي، واضح سهل سريع بسيط ويحل المشكل في بضعة أسطر،   الموضوع مفتوح لجميع الإقتراحات والتعديلات على الكود، في إنثظار ردودكم.     النتيجة  
  7. تحدي 1 - التلاعب بالنظام

    لكن يمكن إظهاره عن طريق الكومند attrib، أو تفعيل خاصية إظهار ملفات النظام .. إكتشف كيف يعمل برنامج streams.exe، الذي تحدث عنه في الموضوع :)
  8. تحدي بسيط ...

    أضف std=gnu11 إلى الكومباير لكي يعمل معك الكود، إن كنت تستخدم الويندوز فمن الأفضل أن تستخدم visual studio
  9. قررت أن أبتدأ سلسلة من التحديات، على شكل قصص، وخدع برمجية، بعضها واجهني فيما قبل، وبعضها تعلمته من خلال تحليلي للبرامج، الهدف الرئيسي من هذه التحديات سيكون الرفع من مستوى المبرمج عن طريق جعله يبحث بطريقة موجهة ترفع من مستواه المعرفي بأنظمة التشغيل، من خلال كلمات دلالية أضعها في نهاية كل تحدي، بالتأكيد إستمراري بوضع هذا النوع من التحديات سيكون مرهونا بمدى تفاعل الأعضاء حتى وإن كانت المشاركات عبارة عن إستفسارات فقط، فهي مقبولة وتعني تفاعل مع الموضوع بالنبسة لي ...، حتى لاأطيل عليكم، إلى التحدي   القصة   أقوم حاليا ببرمجة تطبيق، وفي مرحلة ما سيقوم بتوليد ملف درايفر AjsFu.sys لأداء بعض الوظائف، لكن لسبب من الأسباب أحتاج إلى إخفاء هذا الدرايفر بطريقة أضمن معها أن المستخدم لن يتمكن بأي وسيلة عادية من رؤية الملف.   الوسائل المعروفة هي  إستخدام الـ Command line كـ ls و dir و الـ File Explorer، كـ Windows Explorer، سواء كان الوضع إظهار الملفات المخفية مفعلا أم لا.   ملخص   لاأريد للمستخدم أن يقوم صدفة بعرض الملفات تحت وضع معين، ثم يرى الملف AjsFu.sys     الأنظمة المستهدفة أي نظام ..     لغة البرمجة   اللغة لن تحدث أي فرق هنا، لكن يستحب C و ++C     المساعدة   هناك دالة بالـ kernel32 إسمها lcreat_ ستساعدك على إنشاء الملف بكل سهولة، إعتبر الدالة كـهدية مني :) هناك أداة بالـ SysInternals إسمها streams.exe تمكنك من الكشف عن مثل هذا النوع من الملفات، في حال كنت تعلم مسبقا المسار الذي يختبئ به الملف.   الكود المساعد لقد تركت الكومنت في الكود في حال أردت إستخدام doxygen لـتوثيق حلك وإضافته إلى مكتبتك. تذكر أن الكود للمساعدة فقط، إعتبره ك skeleton لاغير /*! \file main.cpp \brief example <b>"\%windir\%: anFurjJ.sys"</b> author: oussama*/#ifdef UNICODE#undef UNICODE#endif#include <Windows.h>#include <tchar.h>#include <iostream>#include <cstdio>using namespace std;#define EXIT_PROGRAM 0x00000000 //!< force program to quit.#define NO_FILE 0x00000001 //!< file does not exists.#define NO_PATH 0x00000010 //!< path does not exists.#define NO_FILE_PATH 0x00000011 //!< both file and path does not exists.#define FILE_PATH_VALID 0x00000100 //!< file and path are valid.// defining functionsint CheckArgs(string, string);void EndProgram();void Usage(int);void HideFileInsideStream(string, string);// function pointerstypedef HFILE(__stdcall *PROC__lcreat)( LPCSTR lpPathName, int iAttribute);/*! \brief display the usage @param[in] die [opt] **int** quit or continue program.*/void Usage(int die = 1){ printf("\n\t-$ iStreamFile file.ext path\n\n"); if (die == EXIT_PROGRAM) { EndProgram(); }}/*! \brief if the supplied arguments are valid. @param[in] file **string** file to hide in a stream. @param[in] path **string** path to where to hide the file. @return <b>ARGS_OK</b> if <i>file</i> and <i>path</i> exists<br /> <b>NO_FILE</b> if <i>filen</i> does not exists<br /> <b>NO_PATH</b> if <i>path</i> is not valid<br /> <b>NO_FILE_PATH</b> if both <b>file</b> and <b>path</b> does not exists.*/int CheckArgs(string file, string path){ return FILE_PATH_VALID;}/*! \brief end the program.*/void EndProgram(){ getchar(); exit(EXIT_FAILURE);}/*! \brief extract the filename.ext from a path @param[in] file **string** file path. @return filename.ext extracted.*/string GetFileName(string file){ // check if i have a valid string if (file.length() < 1) return NULL; // do i have a path symbol '\' int last_back_slash = file.find_last_of("\\"); if (last_back_slash == -1) return file; // index is start from 0 last_back_slash++; // return the exact file name return file.substr(last_back_slash);}/*! \brief hide the file on the stream @param[in] file **string** @param[in] path **string***/void HideFileInsideStream(string file, string path){ //==========================================================$$ // // DO THE MAGIC - GooD Luck :) // //==========================================================$$ return;}/*! \brief Entry point. @param[in] argc [opt] **int** @param[in] \*\*argv [opt] **string***/int main(int argc, char *argv[]){ printf("\n\tiStreamFile v0.1, coded by oussama (c) 2009.\n\n"); // need exactly two agruments if (argc != 3) { printf("invalid number of argument, need exactly two:"); Usage(EXIT_PROGRAM); } // get the arguments string file = argv[1]; string path = argv[2]; printf("[info] file: %s\n", file.c_str()); printf("[info] path: %s\n\n", path.c_str()); int result = CheckArgs(file, path); int end = false; switch (result) { case FILE_PATH_VALID: break; case NO_FILE: printf("file '%s' does not exist.\n", file); end = true; break; case NO_PATH: printf("path '%s' is not valid.\n", path); end = true; break; case NO_FILE_PATH: printf("neither file '%s' or path '%s' are valid.", file, path); end = true; break; default: break; } // quit if args are not valid if (end) EndProgram(); // Start the process HideFileInsideStream(file, path); getchar(); return 0;}أتمنى التوفيق للجميع،
  10. eng.ahmadshalabiالهدف تطوير طريقة لتغيير قيم المتغيرات، بطرق غير معروفة لكن سليمة مع الحفاظ على بنية الكود، السبب إضافة طبقة من الحماية والتمويه للبرنامج، حيث يمكنك إستخدام الـ nested function calls وتغيير قيم متغير، دون أن يلاحظ من يقوم بعكس برنامجك هذه العملية ...       adam-masterإحترمت شرطاً لكنك خرقت إثنين.   الأول إستخدمت ++C .... :P حسناً سأسامحك، لكن تذكر أن دعم السي بلس بلس محدود في برمجة الدرايفرات بالويندوز واللينكس، وهو ما يفرض عليك الحفاظ على مستوى عالي في السي، هذا إن قررت أن تصبح مبرمج روتكيت ;).   الثاني إستخدمت الأسمبلي، AT&T Syntax :angry: لذا لن تحصل على نقطة كاملة، لديك 24 ساعة لتكمل الحل، وسأضع الجواب :).
  11. هناك كتابين من أروع الكتب التي قرأتها، ستجد بها الجواب على جميع تساؤلاتك، the rootkit arsenal الجزء الأول والثاني   وهذا الموقع سأضعه لك مرة أخرى لأهميته http://opensecuritytraining.info/Training.html   أما بالنسبة للمعاهد العربية، فكل ماستتعلمه بها، هو إحتراف فرمتة الويندوز xp
  12. إن كان تخصصك إختبار الإختراق، فأنا لاأرى سبباً يجعلك تتعلم السي++، فاللغة الرئيسية التي ستحتاجها هي البايتون، ويمكن الحصول على دورة أكثر من رائعة python security expert من تقديم vivek بالنسبة لإكتشاف الثغرات، فأنت مرة أخرى لن تحتاج الى السي بلس بلس بقدر إحتياجك للفهم العميق لبنية البرامج وطريقة تجميلها وعرضها في الذاكرة، ومختلف أنواع الحمايات وطرق تجاوزها، يمكنك أن تركز في البداية على الـ ia32 وستجد العديد من الدورات بالأنترنيت، وهذا من بين أفضل المصادر التي قد تجدها http://opensecuritytraining.info/Training.html، أكثر مايعجبني به هو توفيره لخطاطات ترسم لك الطريق الذي يجب أن تسلكه للوصول إلى هدفك، أما بالنسبة لفهم بنية البرامج وكشف الثغرات والتحليل، فيكفيك أن تقرأ المقالات التالية، وتتبع الشروحات هنا https://tuts4you.com/download.php?list.19   لما ستضيع وقتك مع السي بلس بلس، بالتأكيد هي لغة قوية، فأنا شخصيا، لدي أزيد من 7 سنوات مع السي و السي ++ ، وكنصيحة مني لاتركز أبدا على لغة البرمجة، بل ركز على تطوير طريقة تحليلك للبيانات، وجمع المعلومات وترتيبها بشكل منطقي وممنهج يسهل عليك البرمجة فيما بعد، كأن تدرس الـ uml و ooad، وتستوعب مختلف أنواع الـ design pattern إن طنت ترغب بتطوير برامج عالية الكفاءة، أما عن اللغة، فكل ما ستستحتاجه هو مرجع لدوال الـ api، ومحرر النصوص الذي تحبه.
  13. @mazzica جوابك صحيح أخي 1+   في إنثظار طرق أخرى، قبل إعلان الحل النهائي
  14. أريد أن تكتب دالة تقوم بآستدعاء الدالة main لتنفيذ بعض المهام، طباعة جملة مثلا، ثم تعيد مسار التنفيد إلى الدالة المستدعية callee   مثال للتوضيح فقط #include <header.h>void CallMain(){ printf("before calling main"); main(); printf("after calling main"); return;}int main(int argc, char *argv[]){ // code here return 0;}أتمنى أن تستمتعوا بحل التحدي :) وعيد مبارك سعيد
  15. اسئلة على حلقات التكرار للمبتدئين

    أنا أضم صوتي إلى kenham، اللغة الإنجليزية هي أكبر عائق يجب عليك أن تتجاوزه، وبالحديث عن اللغة سأدلك على مصادر يمكنك أن تتعلم منها اللغة مع البرمجة في نفس الوقت   أفضل مكان يمكنك أن تبدأ منه، يبدأ معك من البداية، ندريس ممنهج وإحترافي، حصة كل أسبوع، مع التمايرن والتطبيقات، إضافة إلى منتدى حيث يمكنك مناقشة أفكارك، وبرامجك مع الأخرين لا تفوت هذه الفرصة، سيبدأ الكورس في 11jun 2014، التسجيل مجاني ;) https://www.edx.org/course/mitx/mitx-6-00-1x-introduction-computer-1841   أظن أن الكورس الآن في الأسبوع الخامس، أتمنى لك التوفيق أخي عثمان، واصل وفقك الله