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

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

برنامه ی وب – سرور به درستی کاراکترهای یونیکد را اداره می کند؟

بنابراین من یک برنامه وب را به صورت دستی قلم می زنم. پس از ارسال برخی از داده ها، آن را در درخواست POST ارسال می کند که حاوی داده ها در یک شی JSON است. بنابراین در حالی که fuzzing آن را انجام دادم، برای کنترل نادرست رمزگذاری تست کردم. مطمئنا هنگام ارسال یک کاراکتر Unicode در قالب u2030 یک پاسخ از سرور دریافت می کنید که از داده های دروغین شکایت می کند.

با این حال، هنگامی که به من می گوید که من آن را به جای شخصیت فرستادم در مورد که چیزی است u2030 این شی JSON با سه کاراکتر جداگانه برای شخصیت یونیکد وارد شده است:

 {"success": false، "errorcode" : 1،
"errormessage": "بخش" init "یا عمل" ȃ0 "نامعتبر است"}

ȃ0 'نامعتبر است بخشی که بخشی از علاقه است. من کنجکاو هستم که آیا این ممکن است یک خطر بالقوه امنیتی را در قالب یک سرریز بافر نشان دهد، زیرا یکی از 3 بایت که شامل یک کاراکتر Unicode است، می تواند به عنوان یک بایت صفر تفسیر شود و پس از آن داده های بیشتری پس از آن بازنویسی شود حافظه.

هر گونه اطلاعات، مشاوره و غیره عالی خواهد بود. ممنون

EDIT: فقط برای من اتفاق افتاد که Burp، که من برای گرفتن پاسخ استفاده می کنم، ممکن است نادرست از کاراکتر Unicode در زمانی که سرور با آن پاسخ می دهد نمایش دهد. آیا این یک اشکال شناخته شده است؟

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

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

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

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

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

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

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

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

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

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

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

مهندسی معکوس – سرریز بافر در این مونتاژ کجاست؟

من یک رویداد CTF (که تمام شده است) بازی کردم و یک باینری را دیدم. هدف این است که عملکرد درست_pw بدون دانستن رمز عبور تعیین شده توسط سرور در محدوده اجرا شود. من می دانم که یک سرریز بافر وجود دارد زیرا می توانم ثبت نام ebx را سرریز کنم اما چرا؟ چرا eBx ثبت نام می کند و چه عملکرد خطرناک ایفا می کند از آنجا که تنها عملکردی که ورودی کاربر را اجرا می کند، fgets است که امن است

این تابع اصلی جداسازی شده است:

    0x0000555555554838 <+0>: push rbx
   0x0000555555554839 <+1>: اضافه کردن rsp، 0xffffffffffffff80
   0x000055555555483d <+5>: mov rdi، rsp
   0x0000555555554840 <+8>: mov ecx، 0x10
   0x0000555555554845 <+13>: mov eax، 0x0
   0x000055555555484a <+18>: نمایندگی QWORD PTR es: [rdi]، rax
   0x000055555555484d <+21>: lea rcx، [rip+0xffffffffffffffe4] # 0x555555554838 
   0x0000555555554854 <+28>: lea rdx، [rip+0xffffffffffffffc8] # 0x555555554823    0x000055555555485b <+35>: lea rsi، [rip+0xffffffffffffff98] # 0x5555555547fa    0x0000555555554862 <+42>: lea rdi، [rip+0x11e] # 0x555555554987    0x0000555555554869 <+49>: تماس 0x5555555546c0    0x000055555555486e <+54>: lea rdi، [rip+0x15b] # 0x5555555549d0    0x0000555555554875 <+61>: تماس 0x5555555546a0    0x000055555555487a <+66>: mov rbx، rsp    0x000055555555487d <+69>: mov rdx، QWORD PTR [rip+0x2007dc] # 0x555555755060    0x0000555555554884 <+76>: mov esi، 0x4cc    0x0000555555554889 <+81>: mov rdi، rbx    0x000055555555488c <+84>: تماس 0x5555555546d0    0x0000555555554891 <+89>: mov esi، 0xa    0x0000555555554896 <+94>: mov rdi، rbx    0x0000555555554899 <+97>: تماس 0x5555555546b0    0x000055555555489e <+102>: test rax، rax    0x00005555555548a1 <+105>: je 0x5555555548a6    0x00005555555548a3 <+107>: mov BYTE PTR [rax]، 0x0    0x00005555555548a6 <+110>: lea rdi، [rip+0xee] # 0x55555555499b    0x00005555555548ad <+117>: تماس 0x555555554690    0x00005555555548b2 <+122>: mov rdi، rsp    0x00005555555548b5 <+125>: mov rsi، rax    0x00005555555548b8 <+128>: تماس 0x5555555546e0    0x00005555555548bd <+133>: آزمون eax، eax    0x00005555555548bf <+135>: و غیره 0x5555555548d1    0x00005555555548c1 <+137>: تماس بگیرید 0x5555555547fa    0x00005555555548c6 <+142>: mov eax، 0x0    0x00005555555548cb <+147>: زیر rsp، 0xffffffffffffff80    0x00005555555548cf <+151>: pop rbx    0x00005555555548d0 <+152>: ret    0x00005555555548d1 <+153>: تماس 0x555555554823    0x00005555555548d6 <+158>: jmp 0x5555555548c6

من واقعا خوشحال خواهم شد اگر کسی این سرریز را برای من توضیح دهد