ubuntu – آزمایش سرریز بافر: کد پوسته اجرا شد، اما "خطای 0 بایت را نتوانستم انجام داد

من یک آزمایش سرریز بافر در یک اوبونتو 16.04 VM انجام دادم ( لینوکس اوبونتو 4.10.0-28-عمومی # 32 ~ 16.04.2-اوبونتو SMP پنجشنبه 20 ژوئن 10:19:48 UTC 2017 x86_64 x86_64 x86_64 گنو / لینوکس ) و یک اشتباه گیج کننده پس از دریافت کد پوسته اعدام شد. کد پوسته از این آموزش کپی می شود و به طور خاص " x48 x31 xf6 x48 x31 xd2 x48 xbb x2f x62 x69 x6e x2f x73 x68 x11 x48 xc1 xe3 x08 x48 xc1 xeb x08 x53 x48 xc7 xc0 x3b x11 x11 x11 x48 x89 xe7 x48 xc1 xe0 x38 x48 xc1 xe8 x38 x0f x05 ". در Edb، من می بینم RIP به کد پوسته می رود و آن را اجرا می کند، همانطور که در زیر نشان داده شده است:

edb نمایش کد پوسته اجرا شده

بعد از دستور syscall که قرار است execve پوسته، با این حال، به نظر می رسد به سیاه چاله افتاده است. Edb شروع به خالی کردن می کند، همانطور که در زیر نشان داده شده است:

edb پس از syscall

خالی می شود، و در مرحله ای که در debugger در تاریکی قرار می گیرد، پنجره خط فرمان آن خطاهای زیر را نشان می دهد:

اشتباه در پنجره edb cli

تعجب اگر کسی قبلا این را دیده است و می داند چگونه آن را حل کند؟

آزمون نفوذ – Fuzzing: به سرعت تعداد دقیق بایت را پیدا کنید

من در حال حاضر سرریز بافر را تمرین می کنم. و من یک سوال برای شما در مورد fuzzing دارم.

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

با این حال ارزش من از اسکریپت من لزوما اندازه "اجازه بازنویسی EIP" را نمی دهد. برای پیدا کردن این اندازه بافر من معمولا باید بپوشم …

مشکل این است که وقتی به دنبال تعداد دقیق بایت هستم، من مجبور هستم:

  1. شروع به راه اندازی اشکال زدائی (edb-debugger) روی کالی [19659007] برنامه را راه اندازی کنید
  2. اسکریپت من را با +1 یا -1 در اندازه بافر اجرا کنید
  3. بررسی کنید که EIP رونویسی شده است

اگر این مورد نیست، دوباره و دوباره شروع میکنم … [19659002] این یک عملیات است که زمان زیادی را صرف می کند . آیا می توانیم این مرحله را سریع تر کنیم؟ با تنظیمات اضافی در debugger که به طور خودکار برنامه را مجددا راه اندازی می کند تا زمانی که EIP رونویسی نشده باشد؟ یا با یک تنظیم خاص در یک اسکریپت؟

تمام راه حل ها با لذت پذیرفته می شوند!

معامله با بایت NULL (0x00) در offsets

من سعی می کنم از آسیب پذیری سرریز بافر strcpy () برای آزمایش حمله ROP استفاده کنم. من یک ابزار بسیار مفید را در آدرس 0x0000f26c پیدا کردم، بنابراین من مجبور هستم بایت های نهایی را به پشته اضافه کنم تا آدرس بازگشتی عملکرد تضعیف شده را لغو کنم. برای لحظه ای این کار را انجام ندادم زیرا strcpy () از 0x00 به عنوان یک رشته استفاده می کند.

آیا روش دیگری برای انجام این کار وجود دارد؟

shellcode – چرا ما نیاز به حذف بایت صفر از کد پوسته؟

من در مورد اصول ساخت کدهای پوسته مطالعه میکنم. من یک سوال در مورد آن دارم

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

با این حال، من فکر می کنم، چون strcpy () مسیر مسیر محیط را (ذخیره کد شل خود را) می گیرد، اگر کد پوسته آن بایت صفر باشد، مهم نیست. من فکر می کنم هدف او تغییر آدرس برگشت به مسیر متغیر محیطی است.
در کتاب درسی، کد پوسته ای که دارای بایت های خالی است در این وضعیت کار نمی کند، اما یک کد پوسته پوسته پوسته می کند.
من نمیتوانم دلیل این را بدانم که چرا باید در این وضعیت بایستی صفر را حذف کنیم.