من می دانم چه کاری باید در این چالش انجام دهم ، اما من در مورد چگونگی انجام اولین قدم اساسی بسیار گم شده ام. آنچه باید اتفاق بیفتد این است که من باید متغیر ساختار جهانی pin_len را بازنویسی کنم ، که به من اجازه می دهد user_pin را در mask_with_pin () سرریز کنم و به get_shell () پرش کنم. من به هیچ وجه مطمئن نیستم که چگونه می توانم pin_len را بازنویسی کنم. از نظر من ، به نظر می رسد که نویسنده با استفاده از fget ورودی را محدود می کند. من فقط می خواهم گمنامی در جهت درست باشد. با تشکر از شما!

 #includ 
#includ 
#includ 

//
// گلوبال ها
//

# تعریف MAX_FIELD_LEN 32
# تعریف BUFFER_SIZE 64

ساختار scratch_space
    char notepad [BUFFER_SIZE]؛
    بدون امضا int pin_len؛
g_scratch_space؛

//
// کد
//

// TODO: با استفاده از هش ویژه پوسته ای به کاربران بدهید
void get_shell ()
{
    سیستم ("/ بن / ش")؛
}

تقلا باطل ()
{
    int i = 0؛

    // نام اول را در دفترچه یادداشت جهانی بپیچید
    برای (i = 0؛ g_scratch_space.notepad [i]؛ من ++)
        g_scratch_space.notepad [i] ^ = ((0x7 << i) & 0xff)؛

    // گذشته از null-delimiter تیک بزنید ...
    من ++؛

    // نام خانوادگی را در دفترچه یادداشت جهانی بپیچانید
    در حالی که (g_scratch_space.notepad [i])
        g_scratch_space.notepad [i++] | = 0x42؛
}

void mask_with_pin ()
{
    char user_pin [MAX_FIELD_LEN]؛

    // درخواست کاربر برای یک پین
    printf ("پین مورد نظر خود را وارد کنید:")؛
    fgets (user_pin، g_scratch_space.pin_len، stdin)؛

    // با پین کاربر ، یادداشت جهانی را بچرخانید
    برای (ثبت نام نشده i i = 0؛ من < BUFFER_SIZE; i++)
        g_scratch_space.notepad[i] ^= user_pin[i % g_scratch_space.pin_len];
}

void initialize_scratch_space()
{
    // Initialize the notepad to all zero bytes
    memset(g_scratch_space.notepad, 0, BUFFER_SIZE);

    if (!g_scratch_space.pin_len) 
    {
        printf("Enter the size of the PIN you wish to use: ");
        g_scratch_space.pin_len = get_uint();
    }

    if (g_scratch_space.pin_len > MAX_FIELD_LEN - 1)
    {
        printf ("[!!] اندازه PIN فراتر از حداکثر مقدار ، ترک ...")؛
        خروج (1)؛
    }

}

رابط باطل ()
{
    char firstname [MAX_FIELD_LEN] = {}؛
    نام خانوادگی char [MAX_FIELD_LEN] = {}؛
    انتخاب انتخاب = 'y'؛

    بدون امضا int firstname_len = 0؛
    بدون امضا int lastname_len = 0؛

    // برای اولین بار فضای خراش را شروع کنید
    fillize_scratch_space ()؛

    در حالی که (انتخاب == 'y')
    {

        // صفر کردن بافرهای محلی ما
        ممتاز (نام اصلی ، 0 ، MAX_FIELD_LEN)؛
        ممتاز (نام خانوادگی ، 0 ، MAX_FIELD_LEN)؛

        // نام و نام خانوادگی کاربر را دریافت کنید.
        printf ("نام خود را وارد کنید:")؛
        fget (نام اصلی ، MAX_FIELD_LEN ، استدین)؛

        printf ("نام خانوادگی خود را وارد کنید:")؛
        fget (نام خانوادگی ، MAX_FIELD_LEN ، استدین)؛

        // طول نامها را بدست آورید
        firstname_len = strnlen (نام اصلی ، MAX_FIELD_LEN)؛
        lastname_len = strnlen (نام خانوادگی ، MAX_FIELD_LEN)؛

        // نام خود را در دفترچه یادداشت کپی کنید
        memcpy (g_scratch_space.notepad، firstname، firstname_len)؛

        // نام خانوادگی خود را در دفترچه یادداشت کپی کنید و آن را بعد از نام اول قرار دهید
        memcpy (& g_scratch_space.notepad [++firstname_len] ، نام خانوادگی ، نام خانوادگی).

        // ورودی را بچرخانید
        تقلا ()؛

        // بررسی کنید که کاربر می خواهد هش خود را بیشتر کند
        printf ("درخواست PIN Scrambling؟ [y/n]")؛
        انتخاب = get_char ()؛

        // تقارن نهایی را اعمال کنید (در صورت وجود) و هش حاصل را چاپ کنید
        اگر (انتخاب == 'y')
        {
            mask_with_pin ()؛
            print_hash (BUFFER_SIZE ، g_scratch_space.notepad)؛
            fillize_scratch_space ()؛
        }
        دیگر اگر (انتخاب == 'n')
        {
            print_hash (BUFFER_SIZE ، g_scratch_space.notepad)؛
            fillize_scratch_space ()؛
        }

        // به کاربر اجازه دهید جلوی ایجاد هش را بگیرد
        printf ("ادامه تولید هش ها؟ [y/n]")؛
        انتخاب = get_char ()؛
    }
}

اصلی خالی است ()
{
    init_wargame ()؛

    printf ("----------------------------------------------- -------------  n ")؛
    printf ("- [Stack Smashing Level # 2 - SecureHash  n")؛
    printf ("----------------------------------------------- -------------  n ")؛
    رابط()؛

    // خروج از برنامه / بازگشت از اصلی
}