آموزشامنیتتست نفوذفارنزیک

باگ یابی به روش جریان آب و سینک

باگ یابی به روش جریان آب و سینک

سلام و درود خدمت کاربران محترم وب سایت کالی بویز. در این پست به یکی از روش هایی که باعث آسانتر شدن دیباگ یا همان باگ یابی می شود خواهیم پرداخت. این روش تنها برای تسریع پروسه می باشد و باعث تمرکز بر روی قسمت هایی که راحت تر به باگ می توانند ختم شوند می کند. این یعنی code coverage کمتر، پس نهایتا ممکن است تمام باگ های برنامه را که نمی توانید بیابید، با این روش پیدا کنید.

قسمت های مختلف باگ یابی

  • جریان آب: هر داده ای که از خارج از برنامه به برنامه میرسد مانند جریان آب هستند.
  • سینک: هر قسمتی که آب به آن رسیده و می تواند نشت کند. منظور از نشت هر عملی است که برای حمله کننده مفید باشد.

برای پیدا کردن باگ (ضعف امنیتی) از سینک یا آب شروع کرده تا به دیگری می رسیم. معمولا از آب یا همان ورودی ها شروع می کنند که البته سلیقه ای است.

بعنوان مثال کد زیر را در نظر بگیرید:

#include <stdio.h>;
#include <stdlib.h>;
#include <string.h>;

void pick_steps(char *ret, const char *buf,
int start, int end, int step)
{
for (int j = 0, i = start; i < end; i += step)
ret[j++] = buf[i];
}

int main(int argc, char **argv)
{
if (argc != 3) {
fprintf(stderr, "%s <sentence> <step>\n", argv[0]);
return 1;
}

char result[200] = {0};
int length = strlen(argv[1]);
if (length >= 200 || length < 1) {
fprintf(stderr,
"Error: sentence should have less than 200 chars.\n");
return 1;
}

int step = atoi(argv[2]);

pick_steps(result, argv[1], 0, length, step);

printf("result: %s\n", result);

return 0;
}

خب در اینجا هم خواندن و هم نوشتن نامتعارف رو در تابع pick_steps مشاهده می کنیم. چرا که اصلا چک نمیکنه اعداد وارد شده در بازه تخصیص داده شده به آرایه ها هستند یا نه. این یعنی با دادن عددی خاص بعنوان step، می توانیم در جاهایی در حافظه محتوایی خاص را بنویسیم و یا محتوایی را بخوانیم.

در تابع main، برنامه ما این متغییر step را از کاربر می گیرد و آن را بدون آنکه چک کند که عدد بزرگتر از صفر و کوچکتر از اندازه رشته داده شده در  [argv[1 باشد آنها را به تابع خطرناک برنامه می دهد.

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

لازم به ذکر است که اگر متغییر های تایع pick_steps چه در بیرون از تابع همگی چک می شدند ما هرگز قادر نبودیم راهی برای استفاده از آن سینک که حفره در خود دارد پیدا کنیم.

موفق و پیروز باشید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


دکمه بازگشت به بالا