SpareNet Servers Advertising & Link Exchange

اطلاعیه

بستن
هیچ اطلاعیه ای هنوز ایجاد نشده است .

اکسپلویت نویسی سر ریز رشته (سطح مقدماتی)

بستن
X
 
  • فیلتر
  • زمان
  • نمایش
پاک کردن همه
نوشته‌های جدید

  • اکسپلویت نویسی سر ریز رشته (سطح مقدماتی)

    به نام خدا

    با سلام

    در دنیای هک آسیب پذیری های زیادی وجود داره که یکی از این آسیب پذیری ها آسیب پذیری سر ریز رشته هستش.
    امروز قصد دارم با یک مثال ساده این آسیب پذیری رو برای شما شرح بدم.

    ما یک برنامه ساده به زبان c داریم. که که یک رشته از ورودی کاربر میگیره و تحویل تابع آسیب پذیر vulnfunc میده.
    درون تابع vulnfunc یک متغیر با طول 20 تعریف شده. و ورودی که دریافت شده توسط تابع ()strcpy کپی میشه درون متغیرمون.
    وقتی هم که کار تابع تمام شد. یک پیغام که حاوی رشته ورودی ما هست در خروجی نمایش میده.

    برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot1.png
مشاهده: 85
حجم: 151.0 کیلو بایت

    خب من برنامه رو کامپایل و اجرا می کنم.
    فقط توجه کنید که یکسری از لایه های امنیتی رو توسط خود کامپایلر غیر فعال کردم. چون که قصد دارم موضوع کلی ساده تر باشه.
    و کد رو با یک ورودی مناسب تست می کنیم.

    برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot2.png
مشاهده: 81
حجم: 104.7 کیلو بایت

    خوبه مشکلی نیست.
    حال اگه یک ورودی بیش از اندازه بزرگ بهش بدیم چه اتفاقی می افته.

    برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot3.png
مشاهده: 83
حجم: 141.9 کیلو بایت

    خب خطا داد. و برنامه دچار مشکل شد.

  • #2
    برنامه رو داخل دیباگر gdb (که من از قبل نصب کردم و همین طور افزونه ی peda رو بر روی اون قرار دادم) اجرا می کنیم.
    تا کمی وارد جزییات بشیم.
    با دستور gdb ./vuln برنامه رو درون دیباگر اجرا می کنیم.و با دستور run یک ورودی بزرگ به اون میدیم.

    برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot4.png
مشاهده: 83
حجم: 160.2 کیلو بایت

    به محض اجرا رجیستر EIP با داده ای که به اون دادیم رونویسی شد.
    (عدد 41 هم کد هگزادسیمال A بزرگ هستش)

    برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot5.png
مشاهده: 80
حجم: 190.8 کیلو بایت

    خب ما باید مقداری که روی استک بازنویسی شده و همین طور مقداری که روی آدرس بازگشتی بازنویسی شده رو پیدا کنیم.
    می تونیم دستی این کار رو انجام بدیم. و طول بایت ها رو بشماریم که اگه بایت ها زیاد باشن خیلی روش جالبی نیست.
    و یا می تونیم از افزونه ی peda استفاده کنیم. دستوری به نام pattern_create که یک الگوی رشته ای با طول دلخواه تولید می کنه. مثلا طول 50
    حالا این رشته تولید شده رو به عنوان ورودی به دستور run اضافه می کنیم.

    برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot6.png
مشاهده: 83
حجم: 198.3 کیلو بایت

    نظر


    • #3
      وقتی که اجراش می کنیم کافیه که به مقدار EIP توجه کنیم. و ببینیم که کجای رشته ی ما قرار داره.
      و با استفاده از اون می تونیم آفست مربوطه رو با دستور pattern_offset پیدا کنیم.
      البته می تونیم مستقیما رجیستر EIP رو بهش پاس بدیم. که من هم همین کار رو کردم.

      برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot7.png
مشاهده: 91
حجم: 191.0 کیلو بایت

      که اینجا 28 بایت رشته برای بازنویسی این رجیستر (EIP) احتیاج داریم.
      خب یک اکسپلویت ساده با زبان پایتون ایجاد می کنیم.
      که یک متغیر به نام buf تعریف می کنیم. که درون اون 28 تا حرف a کوچک و در ادامه 4 تا هم حرف B بزرگ اضافه می کنیم.
      در پایان اون رو print می کنیم.

      برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot8.png
مشاهده: 80
حجم: 65.4 کیلو بایت

      و با استفاده از تکنیک جانشینی دستور اون رو به دستور run در دیباگر پاس میدیم.

      برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot9.png
مشاهده: 83
حجم: 177.1 کیلو بایت

      نظر


      • #4
        به محض اجرا مقدار 4 تا B بزرگ ما درون رجیستر EIP قرار می گیره.
        همین انتظار رو هم داشتیم.

        برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot10.png
مشاهده: 84
حجم: 191.6 کیلو بایت

        حالا یک شل کد فرضی با مقدار xdd\ و تعداد 50 ایجاد می کنیم.
        تا ببینیم که آیا شل کد فرضی ما روی پشته رونویسی میشه یا نه.

        برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot11.png
مشاهده: 82
حجم: 67.0 کیلو بایت

        برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot12.png
مشاهده: 85
حجم: 172.3 کیلو بایت

        می بینیم که با موفقیت رونویسی شده.

        نظر


        • #5
          خیلی سریع یک شل کد با peda تولید می کنیم.
          و یک پورت دلخواه رو بر روی لوکال هاست خودمون بایند می کنیم.
          و اون رو به اکسپلویتمون اضافه می کنیم.

          برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot13.png
مشاهده: 87
حجم: 149.8 کیلو بایت

          و چک می کنیم آیا شل کدمون به درستی در پشته قرار گرفته یا نه.
          مثلا 8 بایت اول رو چک می کنیم.

          برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot14.png
مشاهده: 87
حجم: 182.8 کیلو بایت
          برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot15.png
مشاهده: 84
حجم: 131.5 کیلو بایت

          خوبه.

          نظر


          • #6
            آدرس ابتدای پشته رو به کدمون اضافه می کنیم.
            باید این کار به صورت معکوس انجام بشه به خاطر معماری little-endian سیستم و ارزش مکانی اینجا مهمه.

            برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot16.png
مشاهده: 83
حجم: 181.2 کیلو بایت

            برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot17.png
مشاهده: 84
حجم: 140.1 کیلو بایت

            اکسپلویت رو تست و اجرا می کنیم.
            و سعی می کنیم با برنامه netcat به لوکال هاست و پورتی که تعیین کردیم متصل بشیم.

            برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot18.png
مشاهده: 83
حجم: 180.9 کیلو بایت

            برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Screenshot19.png
مشاهده: 83
حجم: 128.4 کیلو بایت

            تمام.

            نظر

            صبر کنید ..
            X