سلام و درود خدمت کاربران محترم ر این پست به یکی از روش هایی که باعث آسانتر شدن دیباگ یا همان باگ یابی می شود خواهیم پرداخت. این روش تنها برای تسریع پروسه می باشد و باعث تمرکز بر روی قسمت هایی که راحت تر به باگ می توانند ختم شوند می کند. این یعنی code coverage کمتر، پس نهایتا ممکن است تمام باگ های برنامه را که نمی توانید بیابید، با این روش پیدا کنید.
برای پیدا کردن باگ (ضعف امنیتی) از سینک یا آب شروع کرده تا به دیگری می رسیم. معمولا از آب یا همان ورودی ها شروع می کنند که البته سلیقه ای است.
بعنوان مثال کد زیر را در نظر بگیرید:
خب در اینجا هم خواندن و هم نوشتن نامتعارف رو در تابع pick_steps مشاهده می کنیم. چرا که اصلا چک نمیکنه اعداد وارد شده در بازه تخصیص داده شده به آرایه ها هستند یا نه. این یعنی با دادن عددی خاص بعنوان step، می توانیم در جاهایی در حافظه محتوایی خاص را بنویسیم و یا محتوایی را بخوانیم.
در تابع main، برنامه ما این متغییر step را از کاربر می گیرد و آن را بدون آنکه چک کند که عدد بزرگتر از صفر و کوچکتر از اندازه رشته داده شده در [argv[1 باشد آنها را به تابع خطرناک برنامه می دهد.
در اینجا ما مسیر رسیدن آب به سینک را پیدا کرده ایم و با استفاده از دانش بدست آمده میتوانیم اقدام به طراحی سناریو و استراتژی اکسپلویت نمائیم.
لازم به ذکر است که اگر متغییر های تایع pick_steps چه در بیرون از تابع همگی چک می شدند ما هرگز قادر نبودیم راهی برای استفاده از آن سینک که حفره در خود دارد پیدا کنیم.
پاسخ ها